/[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 2675 by bernhard, Wed Mar 29 10:58:44 2006 UTC
# Line 1  Line 1 
1    2006-03-29  Bernhard Reiter <[email protected]>
2            * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
3            trying to build with mingw.
4    
5    2005-10-18  Bernhard Reiter <[email protected]>
6    
7            * Thuban/UI/about.py: remove unused import of getdefaultlocale.
8            Added display of internal encoding to the about dialog text.
9    
10            * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
11    
12    2005-10-18  Bernhard Reiter <[email protected]>
13    
14            Startup improved: We fail right away if the internal encoding could
15            not be determined.
16    
17            * Thuban/__init__.py (get_internal_encoding): new.
18    
19            * test/test_stringrepresentation.py (class TestInternalEncoding):
20            Preserve the internal encoding for the tests in this class.
21    
22    2005-10-17  Bernhard Reiter <[email protected]>
23    
24    
25            * test/test_stringrepresentation.py: New file, for now testing
26            that set_internal_coding() is throwing an exception for bad exceptions.
27    
28            * Thuban/__init__.py (set_internal_encoding): added a forwards
29            and backward translation, so that we fail early if the
30            internal_encoding is bad.
31    
32    2005-10-17  Bernhard Reiter <[email protected]>
33    
34            svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
35            You could actually get polylines with filling in between,
36            when the classification for the lines had a fill color.
37            E.g. this happens when you generate a classification from a ramp.
38    
39            * Extensions/svgexport/test/test_svgmapwriter.py:
40            New test_export_arc_no_fill(). Extend copyright notice to 2005.
41    
42            * Extensions/svgexport/svgmapwriter.py
43            (SVGRenderer.draw_shape_layer_incrementally()):
44            Setting TRANSPARENT_BRUSH for shaptype ARC.
45            Extend copyright notice to 2005.
46    
47            * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
48    
49    2005-09-08  Frank Koormann <[email protected]>
50    
51            * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
52            by Erik (sigra.at.home.se)
53    
54    2005-08-18  Jan-Oliver Wagner <[email protected]>
55    
56            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
57            Call the right method for the default size.
58    
59    2005-08-11  Jan-Oliver Wagner <[email protected]>
60    
61            * Extensions/export_shapefile: New.
62    
63            * Extensions/export_shapefile/__init__.py: New. Initialize
64            the export_shapefile extension.
65    
66            * Extensions/export_shapefile/export_shapefile.py: New.
67            Exports a layer as a Shapefile.
68    
69    2005-08-08  Jan-Oliver Wagner <[email protected]>
70    
71            * po/de.po: String fixes. This fixes Debian bug #313843.
72    
73    2005-07-27  Jan-Oliver Wagner <[email protected]>
74    
75            Remove the attributes from the layer element in
76            .thuban files for the save routine.
77            This also solves RT bug #3149,
78            https://intevation.de/rt/webrt?serial_num=3149
79    
80            * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
81            TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
82            TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
83            attributes from layer element to classification clnull element.
84    
85            * test/test_save.py (SaveSessionTest.testSingleLayer,
86            SaveSessionTest.testLayerProjection,
87            SaveSessionTest.testClassifiedLayer,
88            SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
89            Removed attributes from layer element to classification clnull element.
90            (test_save_postgis.NonConnectionStore._fetch_table_information):
91            added pretending to have a shape_type.
92    
93            * Resources/XML/thuban-1.1.dtd: Make the attributes field
94            and field_type of classification optional.
95    
96            * Thuban/Model/classification.py (Classification.TreeItem.build_info):
97            Added output of size.
98    
99            * Thuban/Model/load.py (SessionLoader.start_classification):
100            Change attribute 'field' and 'field_type' from obligatory to
101            optional to allow empty classes (ie.  only with a default=clnull).
102    
103            * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
104            any attributes anymore for the layer element.
105            (SessionSaver.write_classification): Even if there is no
106            classification field, still write the classification because
107            the clnull (default) symbol will not be defined anymore as
108            part of the layer element.
109    
110    2005-07-05  Bernhard Herzog  <[email protected]>
111    
112            * setup.py (setup call): Version 1.1.0
113    
114            * NEWS: Update for 1.1.0
115    
116            * MANIFEST.in: Add *.txt to files taken from Doc.  Otherwise the
117            technores won't be included
118    
119            * Thuban/UI/about.py (About.__init__): Extend copyright notice to
120            2005
121    
122            * po/de.po: Updated.
123    
124    2005-07-05  Bernhard Herzog  <[email protected]>
125    
126            * README: gdal 1.1.8 is too old.  1.2.5 works.
127    
128    2005-07-05  Bernhard Herzog  <[email protected]>
129    
130            * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
131            masktype attributes.
132    
133    2005-07-05  Bernhard Herzog  <[email protected]>
134    
135            * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
136            (Layer.ClipBoundingBox): Rename ClipBoundingBox to
137            __mangle_bounding_box.  See the comments in the code and RT #2845
138    
139            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
140            Remove the explicit test of ClipBoundingBox.  The method isn't
141            public anymore and the direct call in the test wasn't necessary in
142            the first place.  If ClipBoundingBox (now __mangle_bounding_box)
143            isn't called, the return value of ShapesInRegion will be
144            different.
145    
146    2005-07-05  Bernhard Herzog  <[email protected]>
147    
148            * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
149            ZeroDivisionError exceptions.  I don't know when they happen
150            exactly.  It probably happens when the projections aren't set
151            properly.
152    
153    2005-07-01  Bernhard Herzog  <[email protected]>
154    
155            First step towards unicode.  With this roughly we're at step 1
156            string_representation.txt
157    
158            * Doc/technotes/string_representation.txt: New.  Document how
159            strings are represented in Thuban and how to get to a Unicode
160            Thuban.
161    
162            * Thuban/__init__.py (set_internal_encoding)
163            (unicode_from_internal, internal_from_unicode): New. The first few
164            functions for the internal string representation
165    
166            * Thuban/UI/about.py (unicodeToLocale): Removed.  Use
167            internal_from_unicode instead.
168    
169            * Thuban/UI/__init__.py (install_wx_translation): Determine the
170            encoding to use for the internal string representation.  Also,
171            change the translation function to return strings in internal
172            representation even on unicode builds of wxPython
173    
174            * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
175            filenames too.
176            (SessionLoader.start_clrange): Use check_attrs to decode and check
177            the attributes.
178    
179            * Thuban/Model/xmlreader.py (XMLReader.encode): Use
180            internal_from_unicode to convert unicode strings.
181    
182            * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
183            unicode_from_internal when applicable
184    
185            * test/runtests.py (main): New command line option:
186            internal-encoding to specify the internal string encoding to use
187            in the tests.
188    
189            * test/support.py (initthuban): Set the internal encoding to
190            latin-1
191    
192            * test/test_load.py (TestSingleLayer.test, TestClassification.test)
193            (TestLabelLayer.test): Use the internal string representation when
194            dealing with non-ascii characters
195    
196            * test/test_load_1_0.py (TestSingleLayer.test)
197            (TestClassification.test, TestLabelLayer.test): Use the internal
198            string representation when dealing with non-ascii characters
199    
200            * test/test_load_0_9.py (TestSingleLayer.test)
201            (TestClassification.test): Use the internal string representation
202            when dealing with non-ascii characters
203    
204            * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
205            internal string representation when dealing with non-ascii
206            characters
207    
208            * test/test_save.py (XMLWriterTest.testEncode)
209            (SaveSessionTest.testClassifiedLayer): Use the internal string
210            representation when dealing with non-ascii characters where
211            applicable
212    
213    2005-06-30  Bernhard Herzog  <[email protected]>
214    
215            * test/runtests.py: Untabify.
216    
217    2005-06-30  Bernhard Herzog  <[email protected]>
218    
219            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
220            untabify.
221    
222    2005-06-30  Bernhard Herzog  <[email protected]>
223    
224            * Extensions/ogr/test/__init__.py: Add missing coding directive
225    
226    2005-06-28  Jan-Oliver Wagner <[email protected]>
227    
228            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
229            Use the default size for rendering selected items of default type.
230            Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
231    
232    2005-06-28  Jan-Oliver Wagner <[email protected]>
233    
234            * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
235            (APR_TClr.GetThubanColor): Fix bug in color interpretation.
236            Thanks to Frank Koormann who identified this problem.
237    
238            * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
239            another symbol identified.
240    
241    2005-06-27  Jan-Oliver Wagner <[email protected]>
242    
243            * Doc/manual/thuban-manual-de.xml: More translations.
244    
245    2005-05-12  Jonathan Coles <[email protected]>
246            
247            * Thuban/UI/projdialog.py: Add missing import, which led to an
248            exception when opening a layer's projection.
249    
250    2005-05-09  Bernhard Herzog  <[email protected]>
251    
252            * test/support.py (FileLoadTestCase.filename): Fix doc-string.
253    
254    2005-05-09  Bernhard Herzog  <[email protected]>
255    
256            * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
257            connection to autoconnect.  Fixes RT#3148.
258    
259            * test/test_postgis_db.py
260            (TestPostGISSpecialCases.test_simple_error_handling): New test
261            that attempts to reproduce RT#3148.
262    
263    2005-05-06  Jonathan Coles <[email protected]>
264    
265            Add support for saving and loading the opacity and mask type
266            properties of RasterLayers. Also add support for proper use
267            of alpha information while drawing images not in 'RAW' format.
268            If transparency in an image format (e.g, PNG) is supported by
269            wxWidgets then the image would previously have been draw with
270            transparent regions, but the opaque regions would have been
271            unaffected by a change in the layer's opacity. This patch
272            corrects the problem.
273    
274            * Thuban/Model/layer.py (RasterLayer): Added opacity and
275            masktype parameters to the constructor, and set the
276            appropriate variables to those values.
277    
278            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
279            code to read the opacity and mask type of the layer and construct
280            a new layer with the additional parameters.
281    
282            * Thuban/Model/save.py (SessionSaver.write_layer): Added code
283            to save the opacity and mask type of a layer.
284    
285            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
286            the opacity of the layer to draw_raster_data rather than the layer.
287            (BaseRenderer.draw_raster_data): Remove the layer parameter because
288            the function doesn't need to know about the layer. Add the optional
289            opacity parameter whose default is 1.0. Add 'PNG' as a supported
290            graphics format.
291    
292            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
293            signature to match that in BaseRenderer. Use the new opacity argument
294            in place of calling layer.Opacity(). In the case where the
295            format is not 'RAW', alpha_data is None and the loaded image has
296            alpha information, use the file's alpha information. This is
297            still subject to the layer's opacity setting.
298    
299            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
300            Fixed signature to match that in BaseRenderer.
301    
302            * test/test_load.py (TestRasterLayer): Change file_contents to
303            include opacity and masktype variables.
304            (TestRasterLayer.test): Include tests for opacity and masktype
305            changes.
306    
307            * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
308            test to cover a variety of combinations of masktype and opacity
309            settings.
310    
311    2005-05-02  Jan-Oliver Wagner <[email protected]>
312    
313            * debian/rules: add --use-wx-python-swig-hack
314            to the build command.
315            Thanks to Moritz Lennert for pointing this out.
316    
317    2005-04-28  Jan-Oliver Wagner <[email protected]>
318    
319            Introduce OGRFileShapeStore in ogr extension.
320            This allows at least that loaded shapefile shape stores
321            can be saved correctly in the thuban session file
322            and reloaded again (reload is via core shapefile
323            routine, not OGR). For other types, .thuban files
324            can not be reloaded for the time being.
325    
326            * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
327            class ist to be used for any file-based shape stores
328            accessed through OGR.
329    
330            * Extensions/ogr/ogrstart.py (open_with_ogr): Added
331            forgotten _ for i18n. Adapted call OpenFileShapestore
332            regarding new parameter.
333            (OpenFileShapestore): Use OGRFileShapeStore instead of
334            OGRShapeStore. Fix return value (None instead of null).
335            Add new parameter "mainwindow" to avoid accessing global
336            context.
337    
338    2005-04-27  Jan-Oliver Wagner <[email protected]>
339    
340            Introduce FileShapeStore as generalization for
341            file-based shape stores. In a first instance
342            this allows additional modules to handle shapefile
343            format as well, namely the OGR extension.
344    
345            * Thuban/Model/data.py: Various small fixes in doc-strings.
346            (FileShapeStore): New class.
347            (ShapefileStore): Derive from FileShapeStore.
348            (ShapefileStore.__init__): Call __init__ of FileShapeStore,
349            rename self.table to self._table, initialize self._bbox
350            (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
351            and self.FileName() instead of self.filename.
352            (ShapefileStore.Table): Use self._table instead of self.table.
353            (ShapefileStore.FileName): Removed (moved to FileShapeStore).
354            (ShapefileStore.BoundingBox):  Use self._bbox instead of self.bbox.
355    
356            * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
357            (SessionSaver.write_data_containers): Only use methods of the
358            base class FileShapeStore.
359    
360    2005-04-26  Martin Schulze  <[email protected]>
361    
362            * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
363            function to the modified render engine
364    
365    2005-04-25  Martin Schulze  <[email protected]>
366    
367            * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
368            Added a description according to the CVS log message
369    
370    2005-04-23  Martin Schulze  <[email protected]>
371    
372            * Thuban/UI/renderer.py: Added a missing import
373    
374    2005-04-23  Russell Nelson  <[email protected]>
375    
376            * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
377            way the previous tool is remembered, so that middle-button
378            panning works even if you haven't selected a tool.
379    
380    2005-04-11  Bernhard Herzog  <[email protected]>
381    
382            * libraries/thuban/wxproj.cpp: Move the compatibility code that
383            deals with the wxPython 2.4 version of wxPython.h into the #ifdef
384            branch that includes wxPython.h because it's only needed when
385            wxPython.h is used.  Also, it won't compile when
386            USE_WX_PYTHON_SWIG_HACK is set otherwise.
387    
388    2005-04-07  Bernhard Herzog  <[email protected]>
389    
390            * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
391            (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
392            ClassGrid.__init__ and it's value is outside of the valid
393            range (must be < 32768).  wxPython 2.5 complains about it with an
394            exception.
395    
396    2005-04-05  Jan-Oliver Wagner <[email protected]>
397    
398            * Doc/manual/thuban-manual-de.xml: More translations.
399    
400    2005-04-05  Bernhard Herzog  <[email protected]>
401    
402            * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
403            wxPython 2.4 as well.  Also, remove a now obsolete comment.
404    
405    2005-04-05  Bernhard Herzog  <[email protected]>
406    
407            Use wxPython.h by default but provide a workaround when it isn't
408            available.
409    
410            * setup.py (wxproj_extension): New variable.  Assign the Extension
411            instance for Lib.wxproj to this variable instead of putting it
412            directly into the listso that it can be accessed by other code
413            later.
414            (thuban_build_ext.user_options): Added boolean option
415            --use-wx-python-swig-hack.
416            (thuban_build_ext.initialize_options): Initialize the new option
417            to False.
418            (thuban_build_ext.finalize_options): If the new option was given,
419            define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
420            (thuban_build_ext): Update the doc-string
421    
422            * libraries/thuban/wxproj.cpp: Normally we use
423            wx/wxPython/wxPython.h now.  Only if USE_WX_PYTHON_SWIG_HACK is
424            defined, use swigPtrConvertHack.h instead.
425    
426            * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
427            copied over from wxPython.h.
428            (decode_pointer_new): New.  Equivalent of decode_pointer for
429            wxPython 2.5.
430            (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
431    
432            * README: Add section on potential build problems which explains
433            how the work-around for a missing wxPython.h is activated.
434    
435    2005-03-29  Bernhard Herzog  <[email protected]>
436    
437            * test/postgissupport.py (find_postgis_sql): Added yet another
438            potential location for (lw)postgis.sql because the file has moved
439            again in postgis 1.0.0 rc4.
440    
441    2005-03-29  Bernhard Herzog  <[email protected]>
442    
443            * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
444            match the site of the legend_icon_layer icon.  Otherwise wxpython
445            2.5 complains when the legend is created with the error:
446    
447            PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
448            bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
449            0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
450            in wxImageList: this might work on this platform but definitely
451            won't under Windows.
452    
453    2005-03-23  Jonathan Coles <[email protected]>
454    
455            These changes add support for adjusting the opacity of a raster layer.
456    
457            * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
458            (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
459            a LAYER_CHANGED event if the opacity actually changes.
460    
461            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
462            layer parameter needed in the implementation of this method in
463            renderer.py.
464    
465            * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
466            typo 00 -> 0.
467    
468            * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
469            control to adjust opacity.
470    
471            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
472            alpha data based on the opacity level of the layer.
473    
474            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
475            accepts a layer parameter.
476    
477            * test/test_layer.py (TestLayerModification.test_raster_layer):
478            Rename opacity method calls and add test for LAYER_CHANGED.
479    
480    2005-03-16  Bernhard Herzog  <[email protected]>
481    
482            * test/test_connector.py (DeletionTestMixin.check_deletions)
483            (DeletionTestMixin.check_deletetions): renamed to check_deletions.
484            update the callers.
485    
486    2005-03-14  Jan-Oliver Wagner <[email protected]>
487    
488            * Doc/manual/thuban-manual-de.xml: More translations.
489    
490    2005-03-10  Jan-Oliver Wagner <[email protected]>
491    
492            Introducing initialization callbacks for extensions.
493    
494            * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
495            optional parameter init_callback.
496            (ExtensionDesc.init_ext): New. Executes the callback and sets
497            a status.
498    
499            * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
500            initialization of the extensions.
501            (ThubanApplication.init_extensions): Init all extensions.
502    
503            * Thuban/UI/about.py (About.__init__): Added status of the extensions
504            to the about text.
505    
506            * Extensions/gns2shp/__init__.py: Added init method for Extension
507            description.
508            (init): New. Contains the initialization of the module.
509    
510    2005-03-04  Nina H�ffmeyer <[email protected]>
511    
512            * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
513            OGRConnection to open a datasource. Removed dialog to display all
514            available drivers. Added some doc strings.
515    
516            * Extensions/ogr/ogrstart.py: Added menu entry for opening an
517            OGRDatasource with a string. Added two opening methods which return an
518            OGRDatasource (either data from file or from DB).
519    
520            * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
521            represents a geometry reference of an OGRFeature. OGRShape now has a
522            list of referenced geometry objects (important for geometry
523            collections).
524            For OGRShapeStores loaded from a DB an ID column can be specified now.
525    
526    2005-02-22  Jan-Oliver Wagner <[email protected]>
527    
528            * test/test_map.py (TestMapWithContents.test_tree_info):
529            Added label layer for comparison.
530    
531    2005-02-18  Jonathan Coles <[email protected]>
532    
533            * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
534            which builds a mask. Handle the majority of an image in a loop,
535            creating 8 bits at a time. Later, handle the edge case where less
536            than 8 bits are packed.
537    
538    2005-02-18  Bernhard Herzog  <[email protected]>
539    
540            * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
541            doc-string
542    
543    2005-02-18  Jonathan Coles <[email protected]>
544    
545            * setup.py: Remove wx_cs_params from gdal compile options.
546    
547    2005-02-18  Jonathan Coles <[email protected]>
548    
549            Refactored baserenderer.py and renderer.py to remove baserenderer.py's
550            dependencies on wxPython. Added a new method projected_raster_layer()
551            that returns a raster layer image in projected space. This must be
552            implemented in classes derived from BaseRenderer. This also eliminates
553            the dependency on gdal in baserenderer.py.
554    
555            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
556            new projected_raster_layer() to get projected raster image instead
557            of directly calling ProjectRasterFile().
558            (BaseRenderer.projected_raster_layer): New. This must be implemented
559            by derived classes. It takes almost the same arguments as ProjectRasterFile
560            did and returns a projected image with mask and alpha data (if requested).
561            (BaseRenderer.render_map_incrementally): Remove the check for gdal since
562            that check will be done in MapRenderer.projected_raster_layer(). This
563            also allows other implementations to use different projection code.
564    
565            * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
566            Implementation of BaseRenderer.projected_raster_layer. Checks for
567            gdal support and wxPython version. Also handles exceptions from
568            ProjectRasterFile.
569    
570            * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
571            and added a variable which can be set through the options argument
572            of ProjectRasterFile.
573    
574            * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
575            Calls ProjectRasterFile and returns the result.
576            (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
577            of calling projected_raster_layer() with different options.
578            (TestBaseRenderer.test_raster_no_projection): Removed tests based on
579            wxPython version and all tests of masks and alpha channels. These are
580            now in test_projected_raster_layer().
581    
582    2005-02-17  Jan-Oliver Wagner <[email protected]>
583    
584            * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
585            doc-strings to comply with coding_guidelines.
586    
587    2005-02-17  Jan-Oliver Wagner <[email protected]>
588    
589            Docstring improvements and minor fixes for labellayer.
590    
591            * Thuban/Model/map.py:
592            (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
593            Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
594            Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
595            Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
596            doc string.
597            (Map.BoundingBox): Removed superfluous test for label_layer
598            and improved doc string.
599            (Map.TreeInfo): Added label_layer and improved sdo string.
600    
601            * Thuban/Model/label.py: Added import of _.
602            (Label, Label.__init__): Improved/added doc string.
603            (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
604            LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
605            Improved/added doc string.
606            (LabelLayer.AddLabel): Use already defined names for
607            align strings and improved doc string.
608            (LabelLayer.TreeInfo): New. Return the object data for
609            the tree view.
610    
611    2005-02-16  Jonathan Coles <[email protected]>
612    
613            Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
614            so that that wxproj doesn't crash. Added GUI support for selecting
615            alpha channel (opacity can't be selected yet).
616    
617            NOTE: If wxPython.h is including in future distribution packages
618            then it will not be necessary to have the files swigPtrConvertHack.h
619            and wxPython_int.h included with Thuban. This is hopefully
620            a temporary workaround.
621    
622            * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
623            access to the macro wxCHECK_VERSION so that it will properly
624            generate a bit mask. There was a problem between wx2.4 and wx2.5
625            that this works around.
626    
627            * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
628            of RasterLayer.MaskType.
629            (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
630            (RasterLayer.MaskType): New. Returns the type of mask to use. Can
631            specify none, a bitmap, or an alpha channel.
632            (RasterLayer.SetMaskType): New. Set what kind of mask to use.
633    
634            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
635            Set the raster warping options for the mask based on the value
636            of RasterLayer.MaskType.
637    
638            * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
639            deprecated calls to SetItemSelectedImage in favor of SetItemImage
640            with wxTreeItemIcon_Selected.
641    
642            * Thuban/UI/rasterlayerproperties.py: Support selecting to use
643            an alpha channel for the mask.
644    
645            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
646            data if it is available and an alpha channel is supported under
647            the current version of wxPython.
648    
649            * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
650            to select whether 1's or 0's select the desired portion of an image
651            in the bit mask. wx2.4 has a bug where the documentation is the opposite
652            from behavior.
653            (ProjectRasterFile): Only generate an alpha channel if the version
654            of wxPython is >= 2.5.3.
655    
656            * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
657            When wxPython >= 2.5.3 use the special swig functions to decode an
658            object's address.
659    
660            * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
661            based on the version of wxPython. If >= 2.5.3 use the special swig
662            functions from wxPython to decode wxPython objects, otherwise use
663            the old method of retrieving the address from the object __repr__ string.
664    
665            * libraries/thuban/wxPython_int.h: Copied from wxPython source.
666            Unnecessary code was removed to make it smaller.
667    
668            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
669            Add tests for returning an alpha channel.
670    
671            * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
672            tests that used removed functions UseMask and SetUseMask
673    
674    
675    2005-02-08  Bernhard Herzog  <[email protected]>
676    
677            More wxPython 2.5 changes.  This time taken from a patch from
678            Daniel Calvelo Aros.
679    
680            * Thuban/UI/tableview.py (QueryTableFrame.__init__)
681            (QueryTableFrame.__init__): Pass the size of a spacer as a single
682            item.
683    
684            * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
685            (ProjFrame.build_dialog): Pass the size of a spacer as a single
686            item.
687    
688            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
689            size of a spacer as a single item.
690    
691            * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
692            size of a spacer as a single item.
693    
694    2005-02-08  Bernhard Herzog  <[email protected]>
695    
696            Compatibility with wxPython 2.5.  The changes should make it work
697            better with 2.5 while still keeping compatibility with 2.4.  There
698            are still problems with 2.5, though.
699    
700            * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
701            of a spacer as a single item.
702    
703            * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
704            from wxControl
705    
706            * Thuban/UI/legend.py (LegendTree): When running with wxPython <
707            2.5, add an implementation of the GetFirstChild method that does
708            not require the second parameter.
709            (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
710            (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
711            (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
712            pass the second parameter to GetFirstChild
713    
714    2005-02-08  Nina H�ffmeyer <[email protected]>
715    
716            * Extensions/ogr/ogrshapes.py: Removed some print commands.
717    
718            * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
719            additional menu but appears as a possibility in the menu Map.
720    
721    2005-02-07  Jonathan Coles <[email protected]>
722            * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
723            and PYTHON_ERRF since they were no longer necessary.
724    
725    2005-02-07  Bernhard Reiter <[email protected]>
726            * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
727            Enable translation for message string.
728    
729    2005-02-06  Martin Schulze  <[email protected]>
730    
731            * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
732            the arguments of the contstructor to fit the global scheme
733    
734    2005-01-31  Nina H�ffmeyer <[email protected]>
735    
736            * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
737            some dialogs needed to start ogr.
738            
739            * Extensions/ogr/__init__.py: Changed comments to avoid encoding
740            warnings.
741    
742            * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
743            encoding warnings.
744    
745    2005-01-28  Jonathan Coles <[email protected]>
746    
747            * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
748            mask is packed into a bit array. It's now slightly faster.
749    
750    2005-01-28  Jonathan Coles <[email protected]>
751    
752            * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
753            default to true.
754    
755            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
756            code that loads the state of the layer's use_mask flag. Its
757            usefulness is still being debated.
758    
759            * Thuban/Model/save.py (SessionSaver.write_layer): Remove
760            code that saves the state of the layer's use_mask flag. Its
761            usefulness is still being debated.
762    
763            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
764            options to ProjectRasterFile based on the state of layer.UseMask().
765            Catch more exceptions from ProjectRasterFile so that Thuban doesn't
766            quit is there is a problem projecting.
767            (BaseRenderer.draw_raster_data): Change the documentation to
768            describe the new format (XBM) that the mask data will be in.
769    
770            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
771            data is in XBM format when format='RAW' which means it doesn't
772            need to be converted to a wxImage before being used as a mask
773            for a wxBitmap. Assume that if format != 'RAW' that the image
774            data and mask data are in the same format.
775    
776            * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
777            and a mask is requested, convert the alpha band to a bit array in
778            XBM format. if an alpha channel is requested, simply return the
779            data in the alpha band. Provide better error handling by returning
780            python error messages (also fixes RT #2947).
781            (ProjectRasterFile): Support multiple mask options, rather than simply
782            a flag indicating that a mask should or should not be used. Provide
783            better error handling by returning python error messages.
784    
785            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
786            Add mask data to test.
787    
788            * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
789            should use the mask by default.
790            (TestLayerModificaton.test_raster_layer): Test that a layer should use
791            the mask by default.
792    
793            * test/test_load.py (TestRasterLayer.test): Remove testing for
794            use_mask flag in file.
795    
796            * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
797            for use_mask in file.
798    
799            * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
800            
801    2005-01-26  Jonathan Coles <[email protected]>
802    
803            Add a new dialog box for raster layers. The dialog box allows
804            the user to toggle a mask that is generated by ProjectRasterFile
805            and is used to only draw the real parts of the projected image.
806    
807            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
808            Instruct the warping code to generate a mask if the raster layer
809            requests one.
810            (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
811    
812            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
813            obsolete optional mask argument.
814    
815            * Thuban/UI/classifier.py (Classifier): Change the parent class
816            to LayerProperties and rework the code to support layout calls
817            from the parent.
818            (Classifier.dialog_layout): New. Layout the dialog box.
819            (Classifier.map_layers_removed): Removed. Moved to parent class.
820            (Classifier.map_replaced): Removed. Moved to parent class.
821            (Classifier._OnTry): Renamed to OnTry to support parent class.
822            (Classifier.OnClose): Removed. Supplied in parent class.
823            (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
824            (Classifier._OnOK): Renamed to OnOK to support parent class.
825            (Classifier._OnRevert): Renamed to OnRevert to support parent class.
826    
827            * Thuban/UI/layerproperties.py: New. Base class for layer properties
828            dialog boxes.
829    
830            * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
831            raster layer properties.
832    
833            * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
834            with the non-simple version supplied with gdal. This allows added
835            features such as creating an alpha band.
836            (GetImageData): Generate a mask array from the alpha band that is
837            generated by gdal if the user has selected it. Try to support images
838            that have more than three bands, such as images with RGB plus an
839            alpha band.
840            (ProjectRasterFile): Convert python argument for mask and tell
841            gdal to enable or disable an alpha band.
842    
843            * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
844            describing what kind of layer the class is. Defaults to "Unknown",
845            but should be overridden by subclasses.
846            (Layer.Type): New. Override base class method.
847            (RasterLayer.__init__): Create a flag for using a mask. Record extra
848            data from gdal for display in the properties dialog.
849            (RasterLayer.Type): New. Override base class method.
850            (RasterLayer.UseMask): New. Returns True if the mask should be used.
851            (RasterLayer.SetUseMask): New. Set if the mask should be used.
852            (RasterLayer.ImageInfo): New. Return extra information about the image.
853    
854            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
855            the mask information.
856    
857            * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
858    
859            * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
860            Classifier classes as dialogs to use with the proper layer types.
861    
862            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
863            Fix test.
864    
865            * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
866            (TestLayerModification.build_path): New. Support function.
867            (TestLayerModification.test_raster_layer): New. Test new methods.
868    
869            * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
870    
871            * test/test_load.py (TestRasterLayer): Add tests for mask.
872    
873            * test/test_load_1_0_1.py: New. Copied from test_load.py.
874    
875            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
876            obsolete optional mask argument.
877    
878    2005-01-26  Nina H�ffmeyer <[email protected]>
879    
880            * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
881            which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
882            RowOrdinalToId() and ReadRowAsDict().
883    
884            * Extensions/ogr/ogrstart.py: Added menu item which opens database
885            layers for existing database connections.
886    
887            * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
888    
889    
890    2005-01-26  Jan-Oliver Wagner <[email protected]>
891    
892            * Doc/manual/thuban-manual-de.xml: More translations.
893    
894    2005-01-24  Bernhard Herzog  <[email protected]>
895    
896            Rework the status bar updates a bit to make sure the message about
897            the projections is produced at the right times.
898    
899            * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
900            New class variable with messages that may require a status bar
901            update.
902            (MainWindow.view_position_changed)
903            (MainWindow.update_status_bar): Rename from view_position_changed
904            to update_status_bar.  It's meaning has changed now that it may
905            also generate messages about problems with projection settings.
906            (MainWindow.__init__): Use the new update_status_bar_messages
907            class variable to subscribe update_status_bar
908            (MainWindow.set_position_text): Update doc-string.  This method
909            has to be renamed at some point.  See doc-string and comments.
910            (MainWindow.OnClose): Unsubscribe update_status_bar from all
911            messages in update_status_bar_messages
912    
913            * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
914            class attribute.  map messages to be forwarded by the viewport.
915            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
916            the messages in forwarded_map_messages
917    
918    2005-01-21  Bernhard Herzog  <[email protected]>
919    
920            * test/postgissupport.py (PostGISDatabase.__init__): Tweak
921            doc-string
922            (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
923            different name for the initialization SQL file.
924    
925    2005-01-21  Jonathan Coles <[email protected]>
926    
927            * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
928            a projection and returns a formatted string representing the
929            parameters to feed to gdalwarp. This function eliminates
930            redundancy in draw_raster_layer().
931            (BaseRenderer.render_map_incrementally): Removed the optimization which
932            drew the top most raster layer first and then only those vector-
933            based layers that are above it. With the support for transparency
934            this optimization breaks correct behaviour.
935            (BaseRenderer.draw_raster_layer): Reorganize code to support possible
936            future enhancements to raster layer bounding box. The old behaviour has
937            not changed. Also, change calling parameters to draw_raster_data()
938            to specify new RAW data format and mask.
939            (BaseRenderer.draw_raster_data): Change signature to include an optional
940            parameter for mask information. Change documentation to mention
941            support for new parameter and added option for RAW data format.
942            The data argument is now a list of [width, height, data].
943    
944            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
945            mask parameter. Add new condition for RAW format, which
946            significantly reduces rendering time. Add condition for
947            mask parameter.
948    
949            * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
950            data array of RGB values from the projected image returned from
951            the gdal warping functions. In the case of palette based images, it
952            converts the NO_DATA index to the mask color.
953            (ProjectRasterFile): Removed all custom memory driver references
954            and replaced it with the standard in-memory dataset provided
955            by gdal. The return data is no longer a BMP file, but an array
956            of RGB values, one set triple per pixel.
957    
958            * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
959            * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
960            * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
961    
962            * setup.py (thuban_build_ext.finalize_options): Removed mention
963            of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
964            files. These are obsolete with the new version of gdalwarp.cpp
965    
966            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
967            Updated signature.
968            (TestBaseRenderer.test_raster_no_projection): Changed the test
969            data to be data in the uncompressed RAW format returned from
970            ProjectRasterFile.
971    
972    2005-01-21  Jan-Oliver Wagner <[email protected]>
973    
974            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
975            string available for i18n.
976    
977    2005-01-20  Russell Nelson  <[email protected]>
978    
979            * Resources/Projections/defaults.proj: Ruin the speling of the
980            Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
981            It's the wrong thing to do in the long run, but it's necessary for
982            those users until that bug is fixed.  Otherwise the projection
983            dialog segfaults.  Better to annoy some Lambert-93 users with a
984            spelling mistake than every Fedora Core 3 user of Thuban-CVS.
985    
986    2005-01-20  Bernhard Reiter <[email protected]>
987    
988            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
989            docstring and comment that the warning code here is a hack.
990    
991    2005-01-20  Russell Nelson  <[email protected]>
992    
993            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
994            user about misprojected layers when their lat/lon bounding
995            box exceeds rational lat/lon values.
996    
997    2005-01-20  Bernhard Reiter <[email protected]>
998    
999            * Thuban/UI/about.py (unicodeToLocale): Improved:
1000            Use 'ascii' and then 'replace' for other characters
1001            when getdefaultlocale returns None. Thanks to Bernhard H. .
1002    
1003    2005-01-20  Bernhard Reiter <[email protected]>
1004    
1005            * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1006            that OnRangeText might be called twice and using None as argument.
1007    
1008    2005-01-20  Bernhard Reiter <[email protected]>
1009    
1010            * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1011            OnRangeText(0) to work around a different in wx Behaviour noticed
1012            on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1013    
1014    2005-01-20  Bernhard Reiter <[email protected]>
1015    
1016            * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1017            None. (Fixes rt#2910.)
1018            
1019    2005-01-18  Frank Koormann <[email protected]>
1020    
1021            New Extension: mouseposition
1022            Tool to collect mouse click positions (map coordinates) in a dialog.
1023    
1024            * Extensions/mouseposition/__init__.py: New, extension registration
1025    
1026            * Extensions/mouseposition/mouseposition.py: New, implements the
1027            dialog and adds a tool to Thuban mainwindow.
1028    
1029            * Extensions/mouseposition/position.xpm: New, icon for tool.
1030    
1031    2005-01-14  Jan-Oliver Wagner <[email protected]>
1032    
1033            * Doc/manual/thuban-manual-de.xml: More translations.
1034    
1035    2005-01-11  Frank Koormann <[email protected]>
1036    
1037            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1038            Fix indention bug.
1039    
1040    2005-01-09  Frank Koormann <[email protected]>
1041    
1042            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1043            BugFix 2901: Explicitly copy layers ClassificationColumn since it
1044            is not part of the layers Classification.
1045    
1046    2005-01-03  Frank Koormann <[email protected]>
1047    
1048            * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1049            BugFix 2883: Former implementation only worked on classified point
1050            layers: KeyError was raised, now use the default size if field is None.
1051    
1052    2004-12-27  Bernhard Reiter <[email protected]>
1053    
1054            svgexport 1.0.0cvs: Fixed label export.
1055    
1056            * Extensions/svgexport/test/test_svgmapwriter.py:
1057            class TestSVGRenderer(): New class; new test test_label_font().
1058    
1059            * Extensions/svgexport/svgmapwriter.py
1060            (SVGRenderer.label_font()): initialised Font size with self.factor now,
1061            makes test_label_font happy.
1062    
1063            * Extensions/svgexport/TODO: crossed out fixed label export item.
1064            Added item for options.
1065    
1066            * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1067    
1068    2004-12-27  Russell Nelson  <[email protected]>
1069    
1070            Middle mouse button pans.
1071    
1072            * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1073            OnMiddleDown and OnMiddleUp events.
1074            (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1075            previously used tool.
1076            (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1077            pressing the middle mouse button.
1078    
1079    2004-12-27  Jan-Oliver Wagner <[email protected]>
1080    
1081            * Doc/manual/thuban-manual-de.xml: More translations.
1082    
1083    2004-12-23  Jan-Oliver Wagner <[email protected]>
1084    
1085            * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1086            \n to stderr after the warnings. Thanks to Russell Nelson.
1087    
1088    2004-12-20  Nina Hueffmeyer <[email protected]>
1089    
1090            * Extensions/ogr/ogrshapes.py: Fixed some issues from
1091            Bernhard (coding guidelines etc.). Additionally it is now possible to
1092            display shapefiles containing feature collections (e.g.polygons
1093            with holes). Works with gdal 1.2.1 now.
1094    
1095            * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1096            from Bernhard (coding guidelines etc.). If ogr can't be imported,
1097            tests are skipped now.
1098    
1099            * Extensions/ogr/ogrstart.py: Fixed some typings.
1100    
1101    2004-12-20  Bernhard Reiter <[email protected]>
1102    
1103            * Extensions/svgexport/TODO: updated to add support for
1104            raster layers and labels for 1.0.1.
1105    
1106            * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1107            Issue a warning now.
1108    
1109    2004-12-19  Bernhard Reiter <[email protected]>
1110    
1111            * Extensions/svgexport/TODO: Added idea to support triggering
1112            the application down the pipe.
1113    
1114    2004-12-19  Bernhard Reiter <[email protected]>
1115    
1116            svgexport: Improved code quality, mainly by better naming.
1117    
1118            * Extensions/svgexport/svgmapwriter.py:
1119            DrawPath() renamed to DrawPolygonPath(),
1120            added documentation, improved comments and variable names.
1121            
1122            * Extensions/svgexport/svgmapwriter.py,
1123              Extensions/svgexport/test/test_svgmapwriter.py:
1124            All using DrawPolygonPath() now, the default parameter closed=True
1125            omitted.
1126    
1127            * Extensions/svgexport/test/test_svgmapwriter.py:
1128            renamed test_polygon_opened() to test_polyline()
1129            renamed test_transparent_polygon() to test_transparent_polyline()
1130    
1131    2004-12-18  Jan-Oliver Wagner <[email protected]>
1132    
1133            Some fixes of gns2shp extension.
1134    
1135            * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1136            package.
1137    
1138            * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1139            dynamically.
1140    
1141            * Extensions/gns2shp/test/README: Simplified description how to test.
1142    
1143            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1144            fixed some dimensions of fields according to the GNS documentation
1145            which seems to change undocumented.
1146            Now killing trailing \n and/or \r from MODIFY_DATE.
1147            This fixes RT#2453.
1148    
1149    2004-12-18  Bernhard Reiter <[email protected]>
1150    
1151            svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1152    
1153            * Extensions/svgexport/test/test_svgmapwriter.py:
1154            Added new tests: test_export_polygon_with_hole()
1155            and test_polygon_with_hole().
1156    
1157            * Extensions/svgexport/svgmapwriter.py
1158            (draw_polygon_shape()): Uses DrawPath correctly now.
1159    
1160            * Doc/manual/thuban-manual.xml: Added documentation for stable
1161            extention svgexport.    
1162            * Doc/manual/thuban-manual-de.xml: Copied English section about
1163            svexport over.
1164    
1165            * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1166    
1167            * Extensions/svgexport/svgsaver.py,maplegend.py:
1168            Moved from experimental to stable extension menu.
1169    
1170            * Extensions/svgexport/TODO: updated.
1171    
1172    
1173    2004-12-18  Bernhard Reiter <[email protected]>
1174    
1175            Added Extensions/svgexport/TODO
1176    
1177    2004-12-18  Bernhard Reiter <[email protected]>
1178    
1179            Refactored in svgexport:
1180            DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1181    
1182            * Extensions/svgexport/svgmapwriter.py
1183            Added verbosity level 3 to print out polygon points.
1184            (class Point): added __repr__
1185            (class Brush, __str__()): Added space after ,.
1186            (DrawPolygon): Renamed to DrawPath()
1187            (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1188            (DrawLines): Using DrawPath now.
1189    
1190            * Extensions/svgexport/test/test_svgmapwriter.py:
1191            Replaced DrawPolygon() calls with DrawPath() and put the first argument
1192            inside another list. Adapted test data with a newline before "M".
1193    
1194    2004-12-18  Bernhard Reiter <[email protected]>
1195            
1196            Refactored svgexport tests: 9 double tests runs eliminated;
1197            code size reduced by 8 lines.
1198    
1199            * Extensions/svgexport/test/test_svgmapwriter.py:
1200            (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1201            (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1202            (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1203            this fixed the double running of the nine tests of TestVirtualDC.
1204            (class TestVirtualDC): Using self.dc and self.file from setUp().
1205    
1206    2004-12-17  Bernhard Herzog  <[email protected]>
1207    
1208            Two windows specific fixes ported from thuban-1�0-branch:
1209    
1210            * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1211            instead of getlocale because getlocale doesn't return a usable
1212            encoding name on a german windows 2000
1213    
1214            * setup.py: windows build: Removed the absolute path names and
1215            made all prfixes relative to the directory containing setup.py.
1216            Makes it a little easier to adapt to a different system.
1217    
1218    2004-12-16  Bernhard Herzog  <[email protected]>
1219    
1220            Add support for PostGIS tables with LINESTRING geometries.
1221            Fixes RT#2299
1222    
1223            * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1224    
1225            * test/postgissupport.py
1226            (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1227            table to "roads-multi" because it now uses MULTILINESTRING
1228            geometries and introduce a new "roads" table that uses LINESTRING
1229            (coords_to_multilinestring): Make the doc string more precise
1230            (coords_to_linestring): New.  Create a LINESTRING WKT
1231            representatin
1232            (wkt_converter): Add coords_to_linestring
1233            (upload_shapefile): Rephrase the doc-string a bit.
1234    
1235            * test/test_postgis_db.py (TestPostGISShapestoreArc)
1236            (LineStringTests)
1237            (TestPostGISShapestoreLineString)
1238            (TestPostGISShapestoreMultiLineString): Split
1239            TestPostGISShapestoreArc into a base class LineStringTests and two
1240            derived classes TestPostGISShapestoreLineString for LINESTRING
1241            geometries and TestPostGISShapestoreMultiLineString for
1242            MULTILINESTRING geometries.  Most test methods are in the base
1243            class with the exception of tests that explicitly check the raw
1244            format.
1245    
1246    2004-12-16  Bernhard Herzog  <[email protected]>
1247    
1248            Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1249    
1250            * test/postgissupport.py (find_postgis_sql): Different postgis
1251            versions put the postgis.sql file into slightly different places
1252            so we have to look in both.  The updated doc string describes this
1253            is more detail.
1254    
1255            * test/test_postgis_db.py
1256            (TestPostGISSpecialCases.test_column_name_quoting): The return
1257            value of UniqueValues is unsorted, so it has to be sorted for
1258            comparison.
1259    
1260    2004-12-16  Bernhard Herzog  <[email protected]>
1261    
1262            Fix for RT#2237
1263    
1264            * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1265            panel to be shown is the UnknownProjPanel disable the OK and Try
1266            buttons.  Otherwise enable them.
1267            (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1268            the parameters.  In that case __GetProjection also returns None
1269            now.
1270    
1271    2004-12-15  Bernhard Herzog  <[email protected]>
1272    
1273            * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1274            minimum number of classes to 2.  The calculate_quantiles needs at
1275            least two and raises an exception otherwise.  
1276            Fixes RT#2549
1277    
1278    2004-12-15  Bernhard Herzog  <[email protected]>
1279    
1280            * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1281            so that it returns a result for select statements.
1282            (PostgreSQLServer.server_version): New.  Return the version of the
1283            server software.
1284            (PostgreSQLServer.require_authentication): The format of
1285            pg_hba.conf has changed between PostgrSQL 7.2 and 7.3.  Check the
1286            server version and generate the file in the correct format
1287    
1288    2004-12-15  Bernhard Herzog  <[email protected]>
1289    
1290            * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1291            in the doc string and rephrase it a little.
1292    
1293    2004-12-15  Frank Koormann <[email protected]>
1294    
1295            * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1296            session has been loaded successfully. The check is called by the relevant
1297            tests after executing load_session().
1298    
1299    2004-12-13  Bernhard Herzog  <[email protected]>
1300    
1301            Make sure the region used to determine which shapes are visible
1302            actually matches the region on the printed page.  If this isn't
1303            done properly some shapes might not be printed.  
1304            Fixes RT #2692
1305    
1306            * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1307            renderer has to be at the same position as the mapregion
1308    
1309            * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1310            has to be moved by (self.shiftx, self.shifty) too.
1311    
1312    2004-12-13  Bernhard Herzog  <[email protected]>
1313    
1314            * libraries/pyprojection/Projection.i: Work around a bug in the
1315            generated python code which leads to exception in the __del__
1316            method when the constructor fails.  See the comments in the code
1317            for more details.
1318    
1319            * libraries/pyprojection/Projection.py: Updated from Projection.i
1320            with SWIG.
1321    
1322    2004-12-13  Bernhard Herzog  <[email protected]>
1323    
1324            * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1325            (TestAltPath.test_02_path_error_fix_from_list)
1326            (TestAltPath.test_05_path_error_fix_from_list_changed)
1327            (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1328            is destroyed in tearDown, so there's no need to do it in a test
1329            case.
1330    
1331            * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1332            debug print
1333    
1334    2004-12-13  Bernhard Herzog  <[email protected]>
1335    
1336            * Extensions/svgexport/test/test_svgmapwriter.py
1337            (TestDrawSplines.setUp): Do not use super with the unittest
1338            classes because in Python 2.2 they're still old-style classes.
1339    
1340    2004-12-13  Frank Koormann <[email protected]>
1341    
1342        Alternative Path feature: When loading a (moved) session where
1343            shapefiles cannot be found, ask the user. Use the specified path
1344            if further shapefiles are missing. However, ask the usr for confirmation
1345            in such cases.
1346    
1347            * test/test_load.py (TestAltPath): New, tests for alternative path feature
1348            in load_session()
1349            (Shapefile_CallBack): Helper, implements controllable callback.
1350    
1351            * Thuban/UI/application.py (ThubanApplication.OnInit):
1352            Added "alt_path" to self.path
1353            (ThubanApplication.OpenSession): Added shapefile_callback as second
1354            callback similar to db_connection_callback.
1355            (ThubanApplication.run_alt_path_dialog): New, implementaion of
1356            shapefile_callback. In addition to raising the dialog the control of
1357            self.path('alt_path') is implemented here.
1358    
1359            * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1360            (SessionLoader.open_shapefile): Open shapefile, eventually with
1361            alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1362            formerly used in start_fileshapesource()/start_layer().
1363            (SessionLoader.start_fileshapesource): Call open_shapefile().
1364            (SessionLoader.start_layer): Call open_shapefile().
1365            (load_session): Added shapefile_callback.
1366    
1367            * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1368            feature (search / check).
1369            
1370            * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1371    
1372    2004-12-11  Bernhard Reiter <[email protected]>
1373    
1374             svgexport 0.9.2: Point size supports for maps.
1375    
1376            * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1377            (def draw_point_shape): new parameter size defaults to 2 as before.
1378            (draw_shape_layer_incrementally): Moved draw_func log line higher.
1379            Added draw_func call with size when dealing with a point layer.
1380    
1381            * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1382            
1383    2004-12-11  Bernhard Reiter <[email protected]>
1384    
1385            Made sure that newlines are inserted in the svg path d attributes
1386            to raise the chance that the line length will be below 255 characters,
1387            as recommended by REC SVG 1.1 in section 8.3.1.
1388    
1389            * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1390            Adding \n before L's and changed whitespace handling.
1391    
1392            * Extensions/svgexport/test/test_svgmapwriter.py:
1393            Adapted tests to new whitespace handling of DrawPolygon.
1394    
1395    2004-12-11  Bernhard Reiter <[email protected]>
1396    
1397            * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1398    
1399            * Extensions/svgexport/test/test_svgmapwriter.py:
1400            Removed test_drawbezier in favour of new test_drawspline3 and
1401            test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1402            All only to test DrawSpline.
1403    
1404            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1405            New implementation now really using the strange algorithm of
1406            xfig 3.1's approximated splines and its conversion to postscript
1407            with one twist: SVG can do quadratic beziers, so skipped translation
1408            to cubic beziers.
1409            (TestWithDC): Typo in comment fixed.
1410    
1411    2004-12-09  Martin Schulze  <[email protected]>
1412    
1413            * Thuban/Model/classgen.py: Added missing character encoding
1414    
1415            * Extensions/wms/properties.py (OpenWMSProperties): removed
1416    
1417            * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1418            support for get_srs_discrepancies() since there are no
1419            discrepancies anymore (was a thinko)
1420    
1421            * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1422            format priority now that more formats are supported globally by
1423            the render engine.
1424    
1425    2004-12-08  Silke Reimer <[email protected]>
1426            * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1427            because it is not available in all versions of ogr
1428    
1429    2004-12-08  Bernhard Reiter <[email protected]>
1430            * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1431            global tests until a real one is commited.
1432    
1433    2004-12-07 Nina H�ffmeyer <[email protected]>
1434    
1435            * /Extensions/ogr/: Adding a new extension to read shapefiles with
1436            ogr. It is planned to add other vector formats.
1437    
1438            * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1439    
1440    2004-12-07  Jan-Oliver Wagner <[email protected]>
1441    
1442            * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1443            part of a (non-)fix to renable that the tests are always
1444            executed.
1445    
1446    2004-12-07  Bernhard Reiter <[email protected]>
1447    
1448            * Extensions/svgexport/test/test_svgmapwriter.py:
1449            Added test_drawbezier() to test DrawSpline().
1450    
1451            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1452            Really implemented bezier drawing.
1453    
1454            * Extensions/svgexport/__init__.py: Bumped version of svgexport
1455            to 0.9.1 because now the legend examples lines styles
1456            will be drawing with beziers.
1457    
1458    2004-12-05  Martin Schulze  <[email protected]>
1459    
1460            * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1461            GIF as supported bitmap image formats (helpful for the WMS extension)
1462    
1463    2004-11-30  Martin Schulze  <[email protected]>
1464    
1465            * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1466            Improved the test for the internal compare method
1467    
1468    2004-11-27  Jan-Oliver Wagner <[email protected]>
1469    
1470            * Thuban/UI/about.py (About.__init__): Added
1471            Norbert Solymosi for hungarian translation and Ole Rahn
1472            as contrbutor. Moved Bernhard Reiter from Contributor
1473            to Developer.
1474    
1475    2004-11-27  Bernhard Reiter <[email protected]>
1476    
1477            * Extensions/svgexport/test/test_svgmapwriter.py:
1478            Removed Jan from author list as he did not change enough significant
1479            lines yet.
1480    
1481            * Extensions/svgexport/__init__.py: Added Bernhard as author
1482            of the Extension.
1483    
1484    2004-11-27  Jan-Oliver Wagner <[email protected]>
1485    
1486            * po/hu.po: New. Hungarian translation. Contributed
1487            by Norbert Solymosi.
1488    
1489    2004-11-26  Bernhard Herzog  <[email protected]>
1490    
1491            * Extensions/svgexport/test/test_svgmapwriter.py
1492            (Testobjectexport.test_transparent_polygon): Commented out some
1493            debug prints
1494    
1495    2004-11-24  Jan-Oliver Wagner <[email protected]>
1496    
1497            Fix broken tests for svg extension and added svg legend
1498            to Experimental menu.
1499    
1500            * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1501            the test run correctly even if the extension is a package.
1502            Also removed the "import Thuban" which makes no sense.
1503    
1504            * Extensions/svgexport/__init__.py: Fix to have the extensions'
1505            test module also be executed from the global test routine.
1506            This is done by looking for the absense of the DISPLAY variable.
1507    
1508            * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1509            to Experimental menu since this module has yet not reached a stable
1510            status (ie. 1.0).
1511    
1512    2004-11-22  Bernhard Reiter <[email protected]>
1513    
1514            * Extensions/svgexport/svgmapwriter.py:
1515            Added verbose variable and some logging depending on it.
1516            (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1517            because counting i is not necessary.
1518            (class Pen, class Brush): Added simple __str__ methods.
1519            (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1520            not exported to svg file) Note: holes still unhandled.
1521    
1522            * Extensions/svgexport/test/test_svgmapwriter.py:
1523                    Made a baseclass TestWithDC for test needed a DC.
1524                    Added tests for bug #2698 (transparent polygons are not
1525                    exported to svg file):
1526                    Testobjectexport.test_transparent_polygon()
1527    
1528            * Thuban/Model/base.py (UnsetModified):
1529            Fixed some typos in docstring.
1530    
1531            * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1532            Added hints on the used algorithm for handling holes.
1533    
1534    2004-11-20  Jan-Oliver Wagner <[email protected]>
1535    
1536            Some face lifting for the examples.
1537    
1538            * Examples/__init__.py: Make this directory a package.
1539    
1540            * Examples/simple_extensions/__init__.py: Make this directory a package.
1541    
1542            * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1543            menu to Examples menu.
1544    
1545            * Examples/simple_extensions/simple_command.py: Some more comments,
1546            minor changes.
1547    
1548            * Examples/simple_extensions/simple_tool.py: Minor changes.
1549    
1550    2004-11-20  Jan-Oliver Wagner <[email protected]>
1551    
1552            Changed way of extension registry for wms and added extension
1553            registry for umn_mapserver extension.
1554    
1555            * Extensions/wms/__init__.py: Added registry entry and the importing
1556            of the actual wms module. Included a test for the required PyOGCLib.
1557    
1558            * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1559    
1560            * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1561            importing of the actual umn mapserver management modules.
1562            Included a test for the required Python MapScript.
1563    
1564    2004-11-20  Jan-Oliver Wagner <[email protected]>
1565    
1566            Changed way of extension registry for importAPR, bboxdump
1567            and added extension registry for svgexport.extension registry for
1568            svgexport.
1569    
1570            * Extensions/importAPR/__init__.py: Added registry entry and the importing
1571            of the actual importAPR module.
1572    
1573            * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1574            __init__.py).
1575    
1576            * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1577            ï¿½ï¿½ï¿½ï¿½of the actual bboxdump module.
1578    
1579            * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1580            ï¿½ï¿½ï¿½ï¿½__init__.py).
1581    
1582            * Extensions/svgexport/__init__.py: Added registry entry and the importing
1583            of the svgsaver module.
1584    
1585            * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1586            to Experimental menu since this module has yet not reached a stable
1587            status (ie. 1.0).
1588    
1589    2004-11-18  Jan-Oliver Wagner <[email protected]>
1590    
1591            Now the hit test considers the size of point symbols.
1592    
1593            * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1594            'size' defaulting to the previously fixed value 5.
1595            Extended doc-string.
1596            (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1597            for symbols.
1598            Now the size of the largest point symbol is determined to find out
1599            about whether the point has been hit.
1600            This fixes the problem that only clicks inside a fixed distance of
1601            5 where found.
1602    
1603    2004-11-17  Jan-Oliver Wagner <[email protected]>
1604    
1605            Another open issue fixed regarding sizeable symbols: correct rendering of
1606            selected symbols.
1607    
1608            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1609            Added consideration of the specific size of point symbols.
1610            The property for each point symbol is retrieved and the size applied
1611            for the rendering method.
1612            Added doc-string.
1613    
1614    2004-11-16  Jan-Oliver Wagner <[email protected]>
1615    
1616            Changed way of Extension Registry for gns2shp and profiling.
1617    
1618            * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1619            __init__.py).
1620    
1621            * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1622            of the actual gns2shp module.
1623    
1624            * Extensions/profiling/profiling.py: Removed registry entry (moved to
1625            __init__.py).
1626    
1627            * Extensions/profiling/__init__.py: Added registry entry and the importing
1628            of the actual profiling module.
1629    
1630    2004-10-28  Bernhard Reiter <[email protected]>
1631    
1632            * Extensions/svgexport/: Minor improvements to doc strings.
1633    
1634    2004-10-07  Jan-Oliver Wagner <[email protected]>
1635    
1636            Further elements for sizable point objects now
1637            making this feature usable though not yet complete.
1638    
1639            * Thuban/Model/save.py (SessionSaver.write_classification): Write
1640            attribute 'size' for cldata when the shape layer is of point type.
1641            This also now make the test_load.py tests happy.
1642    
1643            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1644            gradient.
1645    
1646            * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1647            ID_SELPROP_SPINCTRL_LINEWIDTH.
1648            (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1649            (ID_SELPROP_SPINCTRL_SIZE): New Id.
1650            (SelectPropertiesDialog.__init__): Added a second spin control
1651            for the size in case the corresponding layer is of point type.
1652            (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1653            (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1654            (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1655            and refresh preview.
1656    
1657    
1658    
1659    2004-10-04  Martin Schulze  <[email protected]>
1660    
1661            * Extensions/wms/test/test_parser.py
1662            (TestWMSCapabilitiesParser.test_compareLists): Added missing
1663            self-test for compareLists()
1664            (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1665            self-test for compareDicts()
1666            (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1667            to verify the test routine fails with non-equal arguments
1668            (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1669            to verify the test routine fails with non-equal arguments
1670    
1671    2004-10-03  Jan-Oliver Wagner <[email protected]>
1672    
1673            First elements for sizeable point objects.
1674    
1675            * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1676    
1677            * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1678    
1679            * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1680            of a corresponding argument is given.
1681            (TestSymbolSize): New. Test the size attribute of cldata.
1682    
1683            * Thuban/Model/classification.py: Removed some trailing whitespaces.
1684            (ClassGroupProperties.__init__): Set default size.
1685            (ClassGroupProperties.SetProperties): Set the size.
1686            (ClassGroupProperties.GetSize): New. Return the size.
1687            (ClassGroupProperties.SetSize): New. Set the size.
1688            (ClassGroupProperties__eq__): Compare also size.
1689            (ClassGroupProperties__repr__): Print also size.
1690    
1691            * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1692            the size attribute.
1693    
1694            * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1695            Also, now there is a return value that indicates whether the drawing
1696            size exceeded the given rect extent and if so the new extent.
1697            Finally, point objects are drawn depending on the size. If either
1698            the width or height is exceeded, the new extent is returned.
1699            (ClassRenderer.Draw): Now when calling the previewer drawing function,
1700            evaluate the return value and, if not None, adapt the grid widget size
1701            accordingly and redraw again.
1702    
1703            * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1704            If the draw function is for points, call it with the size as additional
1705            parameter.
1706            (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1707            the size. Compute the radius using the size.
1708    
1709            * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1710            that Thuban supports size, apply this correctly.
1711    
1712            * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1713    
1714    2004-10-03  Jan-Oliver Wagner <[email protected]>
1715    
1716            * Doc/manual/thuban-manual-de.xml: Started translation of
1717            Map chapter.
1718    
1719    2004-10-01  Martin Schulze  <[email protected]>
1720    
1721            * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1722            argument for general use through properties-dialog selector
1723            
1724            * Thuban/UI/classifier.py: Register properties dialog classes for
1725            both provided layer classes/types.
1726    
1727            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1728            map can be retrieved through the parent which is passed to the
1729            constructor anyway and doesn't require an argument of its own,
1730            required for the unification of arguments for general use through
1731            properties-dialog selector.
1732            (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1733            whether a dialog is already opened (and raising it to the users
1734            attention) and creating a new dialog into a function of its own
1735            (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1736            method
1737            (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1738            global registration of properties dialog classes (which are indeed
1739            layer-specific).
1740    
1741            * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1742            for general use through properties-dialog selector, the map can be
1743            retrieved through the parent and doesn't require an argument of
1744            its own.
1745    
1746            * Extensions/wms/wms.py: Register the properties dialog class for
1747            the provided WMS layer
1748    
1749    2004-09-28  Jan-Oliver Wagner <[email protected]>
1750    
1751            New feature: Registry for Extensions.
1752    
1753            * Thuban/UI/extensionregistry.py: This module defines a registry for
1754            Extensions.
1755    
1756            * Thuban/UI/about.py (About.__init__): Added description
1757            of the registered extensions with all of the information.
1758    
1759            * Thuban/Model/extension.py (Extension): Improved doc-string.
1760    
1761            * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1762            Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1763            Extensions/wms/wms.py: Added registration of the extension.
1764    
1765    2004-09-27  Bernhard Reiter <[email protected]>
1766    
1767            More fixes to svgexport to make used ids unique and
1768            conforming to XML's Name production.
1769    
1770            * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1771            test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1772            test_make_id_nonintegersetid().  Switched SetID and SetBaseID.
1773            Added Bernhard R. as author.
1774            * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1775            concatenation char now (makes test_make_ide_nosetbaseid() valid).
1776            Also transform second id part with "%d" and catch the TypeError
1777            to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1778            Corrected typo inBernhard's author line.
1779            (SetBaseID): Return the transformed base id. Transform characters
1780            which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1781            import binascii. If to be set string starts with "xml" or so, add "t".
1782            (draw_shape_layer_incrementally): use the returned value of SetBaseID
1783            for used_baseids checks.
1784    
1785    2004-09-25  Bernhard Herzog  <[email protected]>
1786    
1787            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1788            Remove a debug print and some tab characters.
1789    
1790    2004-09-25  Bernhard Reiter <[email protected]>
1791    
1792            * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1793            (SetBaseID, SetID, make_id): Improved docstring comments to explain
1794            the interaction of the three functions and the XML id contrains.
1795    
1796    
1797    2004-09-23  Jan-Oliver Wagner <[email protected]>
1798    
1799            * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1800            Module.
1801    
1802            * Doc/README: Added info on ThubanModel.xmi.
1803    
1804    2004-09-23  Jan-Oliver Wagner <[email protected]>
1805    
1806            * Doc/README: New. Some info about how to generate technical
1807            documentation from the source code.
1808            This text was send to the Thuban developer mailing list on
1809            September 21st 2004 by Bernhard Reiter.
1810    
1811    2004-09-21  Bernhard Reiter <[email protected]>
1812    
1813            Improved the svgexport to only use unique ids. Will issues
1814            an error message dialoge when two layer names are the same.
1815            ShapeIDs are now added with a dash within the svg ids.
1816    
1817            * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1818            * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1819            (TestSVGRenderer): New test class with test_make_in() and
1820            test_check_for_layer_name_clash()
1821            * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1822            and draw_shape_layer_incrementally() to not use a baseid twice,
1823            satisfying test_check_for_layer_name_clash()
1824            (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1825            test_make_in().
1826            * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1827            and wxICON_HAND.
1828            (write_to_svg): Put dc and rendering in a try statement and on
1829            catching SVGmapWriterError notify the user and delete the target file.
1830    
1831    2004-09-20  Bernhard Reiter <[email protected]>
1832    
1833            * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1834    
1835    2004-09-03  Jan Sch�ngel  <[email protected]>
1836    
1837            * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
1838            small bug with the line color. Now the line color will now only set
1839            if it is set in Thuban an not Transparent.
1840            
1841            * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
1842            deleting the layers from mapfile. Now all layers will delete backwards
1843            from the last.
1844    
1845    2004-08-20  Silke Reimer <[email protected]>
1846    
1847            * Thuban/Model/layer.py:
1848            Fixes bug in projection handling: Otherwise very large region might not
1849            have valid values in the layer's projection.
1850    
1851    2004-08-20  Silke Reimer <[email protected]>
1852    
1853            * Thuban/UI/about.py:
1854            small changes to be consistent with coding style.
1855              
1856    2004-08-13  Martin Schulze  <[email protected]>
1857    
1858            * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
1859            Adjusted a comment
1860    
1861    2004-08-11  Silke Reimer <[email protected]>
1862    
1863            * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
1864                    too many and too enhanced imports of locale
1865    
1866    2004-08-10  Silke Reimer <[email protected]>
1867    
1868            * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
1869                    function unicodeToLocale() to convert special characters to users
1870                    locale encoding
1871    
1872    2004-08-10  Jan-Oliver Wagner <[email protected]>
1873    
1874            * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
1875            lower case letter'
1876    
1877    2004-08-09  Jan Sch�ngel  <[email protected]>
1878    
1879            * ChangeLog: Rewrite the last ChangeLog entry to follow
1880            the standard way.
1881    
1882            * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
1883            the function where it is needed, because it don't works if it stands
1884            at the beginning.
1885            (MF_Layer.__init__): Removed the extra numclassed variable. Now
1886            numclasses from the mapscript will be used.
1887            (MF_Layer.get_index): New. Return the index of the layer in mapfile.
1888            (MF_Layer.set_classes): New. A Classlist will be set to the layer.
1889            (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
1890            (MF_Layer.remove_allclasses): New. All class of the layer will remove.
1891            (MF_Map.create_new_layer): New. A new Layer is created and associated
1892            with the mapscript object.
1893            (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
1894            the mapscript.
1895            (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
1896            linked to the layer in thuban, else the layerobject linked to the
1897            thubanlayer will be used.
1898            AnnotationLayer will now store the filename of the shapefile.
1899            (MF_Map.remove_layer): If a layer is removed the associated object
1900            must be set new.
1901            
1902            * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
1903            layers which are exists in thuban to the mapobj. All removed Layers
1904            will be removed from the mapobj.
1905            Added comments to all functions.
1906            (thuban_to_map): No layer will be removed here.
1907            
1908            * Extensions/umn_mapserver/mf_handle.py
1909            (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
1910            Layersettings for the mapserver kann be edited.
1911    
1912            * Extensions/umn_mapserver/mf_import.py: Now all layers which are
1913            imported, will be linked with the associated MF_Layer.
1914            (import_mapfile): All layers, which are not selected, will be removed.
1915            Disable the "import layer from mapfile" menu option.
1916    
1917            * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
1918            Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
1919            layer on permanently.
1920    
1921    2004-08-03  Jan Sch�ngel  <[email protected]>
1922    
1923            * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1924            New. This function removes all metadata
1925            (MF_Layer.set_group): New. Set the group setting.
1926            (MF_Layer.get_group): New. Get the group setting.
1927            (MF_Map): Removed the extra numlayers variable, used the mapscript
1928            parameter instead.
1929            (MF_Map.get_numlayers): New. This get numlayers.
1930            (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1931            (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1932            if the object is an instance. Also added the annotation layer here to
1933            export, but only the layer is created in the mapfile.
1934    
1935            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1936            the check if a mapobj exist, because its not needed anymore. The
1937            export function is only available if a mapobj exist.
1938            Use the new function to remove all layers.
1939            
1940            * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1941            option and the metadata button. The layer dialog is temporary disabled.
1942            (Metadata_CustomDataTable): Added some functions to show the grid
1943            correct.
1944    
1945            * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1946            the number of layer from import_mapfile to this function.
1947            (AnnotationLayer): New. This Class shows the Annotation layer in
1948            thuban. The layer don't do anything. It's only to show the layer
1949            and to save the layer order.
1950            (add_annotationlayer): New. Import an annotation layer to thuban.
1951            (select_layer2import): New. Import only layers to thuban and not
1952            the other settings like projection or scalebar.
1953            (create_new_mapfile): Moved the _has_umn_mapobj function and the
1954            create_new_mapfile functions from mf_handle.py to mf_import.py.
1955            
1956            * Extensions/umn_mapserver/sample/iceland.map: Added the group
1957            parameter to the roads and cultural layers. Also added a new
1958            Annotation Layer for the cultural points.
1959    
1960            * Extensions/umn_mapserver/sample/iceland.html: Added the select
1961            option for the annotation layer.
1962    
1963            * Extensions/umn_mapserver/sample/index.html: Added the start
1964            parameter for the annotation layer.
1965    
1966    2004-08-01  Jan-Oliver Wagner <[email protected]>
1967    
1968            * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1969            translation completed.
1970    
1971            * Doc/manual/thuban-manual.xml (Chapter Session Management):
1972            Fixed unprecise description for Save Session.
1973    
1974    2004-07-31  Jan-Oliver Wagner <[email protected]>
1975    
1976            Started translation of Users Manual into german.
1977    
1978            * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1979    
1980            * Doc/manual/Makefile: Added build instructions for german
1981            users manual.
1982    
1983            * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1984    
1985    2004-07-28  Jan Sch�ngel  <[email protected]>
1986    
1987            * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1988            functions. Now all metadata will handle by the function and its not
1989            needed to initialize it from outside. Therefor the associated mapobj
1990            will be stored in the Metadata Object. So we can use the special
1991            functions from the associated mapobj to get the Metadata.
1992            Therefor all initialization code for the metadata is removed from the
1993            other classes.
1994            (MF_Layer): Added a function to get the metadata object.
1995            (MF_Map): Added a function to set the mappath, the path where
1996            the mapfile ist stored.
1997    
1998            * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1999            to set the extent in the mapfile. Now the code is set by the displayed
2000            data in the Thuban-view.
2001            (export_mapfile): The shapepath is now set empty, until relative
2002            pathnames are supported.
2003    
2004            * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2005            metadata. Yet only mapfile metadata are supported. Layer and class
2006            supported are not implemented.
2007            Added a dialog to handle layer informations. The dialog only shows the
2008            selected layer at the moment.
2009    
2010            * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2011            code for setting the extent in thuban. Now the extent is set to the
2012            given extent from the mapfile.
2013            Fixed a logical mistake. Now the extent is set when realy a layer is
2014            loaded, and not if one is selected to load.
2015    
2016            * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2017            move the shown map in the browser.
2018    
2019            * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2020            line to the mapobj and added metadata to the political layer.
2021    
2022            * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2023            for Metadata.
2024    
2025    2004-07-26  Martin Schulze  <[email protected]>
2026    
2027            * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2028            ClassMapper
2029    
2030            * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2031            case for the new ClassMapper
2032    
2033    
2034    2004-07-22  Bernhard Herzog  <[email protected]>
2035    
2036            * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New.  Return the
2037            visible extent of the map in projected coordinates
2038    
2039            * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2040            (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2041            tests.
2042            (SimpleViewPortTest.test_visible_extent): New. The real test for
2043            VisibleExtent()
2044    
2045    2004-07-22  Bernhard Herzog  <[email protected]>
2046    
2047            * test/test_viewport.py: Use support.run_tests as the main
2048            function when running asa script.
2049    
2050    2004-07-22  Jan Sch�ngel <[email protected]>
2051    
2052            * Extensions/umn_mapserver/mf_export.py: Added "import os"
2053            Removed the old "import Thuban.UI.mainwindow" code.
2054            (tbextent_to_map): Removed the extra function and at the code direct
2055            to "thuban_to_map" function.
2056            (write_creatorcomment): Added. Now a short comment is added to the
2057            beginning of an generated mapfile.
2058            (export_mapfile): Now the Path and filename are saved in to variables,
2059            and not together in one variable. This is needed for the new
2060            write_creatorcomment function.
2061                    
2062            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2063            import module "re". Also added Range and the ClassGroupRange import
2064            from Thuban. Both are needed for the new range expression import.
2065            (create_rangeexpression): Added. Creates a Range Expression in Thuban
2066            style from a given mapfile expression.
2067            (added_rasterlayer): Make some small code changes. The shapepath is
2068            now stored in an extra variable and the clazz_name is set empty if no
2069            class name set in the mapfile.
2070            Changed the Error message for Range Expressions, becaus the new
2071            function create a error string which will be shown in the dialog.
2072    
2073            * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2074            range expression import.
2075    
2076    2004-07-21  Jan-Oliver Wagner <[email protected]>
2077    
2078            * Extensions/umn_mapserver/README: Added hint that
2079            installation as root can be avoided. Removed all tabs.
2080    
2081    2004-07-16  Bernhard Herzog  <[email protected]>
2082    
2083            * test/test_viewport.py
2084            (ViewPortTest.test_changing_map_projection): Check that changing
2085            the projection of an empty map shown in a viewport doesn't lead to
2086            exceptions in the viewport's handler for the
2087            MAP_PROJECTION_CHANGED messages
2088    
2089            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2090            try to keep the same region visible when the map actually contains
2091            something
2092    
2093    2004-07-15  Jan Sch�ngel <[email protected]>
2094    
2095            * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2096            mappath directly from the mapobj. Is needed because of the changes
2097            in mf_import.py.
2098            (MF_Layer.add_thubanclass): Added a new comment.
2099            (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2100            mapobj is empty there is no extent get from thuban an so no one can
2101            set to th mapobj.
2102            
2103            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2104            the discription.
2105            Split the funktion in to three smaller ones. The new functions are
2106            add_rasterlayer, add_polygonlayer and select_layer2import.
2107            Removed the mapfilepath and filepath initialisation, because its know
2108            include in the new functions.
2109            Now nothing will be imported if cancel is pressed in the
2110            layer choice dialog.
2111    
2112    2004-07-14  Jan Sch�ngel <[email protected]>
2113    
2114            * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2115            import.
2116            (MF_Symbolset): Removed the extra variable for numsymbols.
2117            (MF_Class.__init__): Added a comment to the exception clause.
2118            Removed the extent init, because it was not needed anymore.
2119            (MF_Layer.add_thubanclass): Added the code to set the class name to
2120            the expression value from thuban if no label is defined.
2121            Added the code to export Range expressions from thuban to the mapfile.
2122            (MF_Map.set_extent): Removed the exception and replace it by some if
2123            code. If the size of a map is not defined the size will be set to 1,1.
2124            This is necessary because if the extent is set, mapscript checks if
2125            the size is greater than zero.
2126            (MF_Web): Added the get and set function for the template.
2127    
2128            * Extensions/umn_mapserver/mf_export.py: Added the function to check
2129            if a mapobject exists and used it to set the status of the menu items.
2130            If no mapfile exists the settings could not be edditied.
2131            Define after which menuitem the exportitem will include.
2132            
2133            * Extensions/umn_mapserver/mf_handle.py: Removed the import
2134            Thuban.UI.mainwindow clause, because it is not needed.
2135            Added the command Refresh() to all "OnChangeColor()" functions,
2136            because the color preview window was not updated on a color change.
2137            Added the function to check if a mapobject exists and used it to set the
2138            status of the menu items. If no mapobject exists the settings could not
2139            be edditied.
2140            (Map_Dialog): Moved the imagetype selector from the
2141            Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2142            (Web_Dialog): Removed the name label and added the template textbox.
2143    
2144            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2145            the exception handling on loading the layers by an if statement. It
2146            is not necessary to us the exception there.
2147            The Filepath creation now use os.path.join to build the path.
2148    
2149            * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2150            definition from global to the setUp function. Now the testMap will
2151            initialize new on each test.
2152    
2153            * Extensions/umn_mapserver/sample/iceland.map: Include three new
2154            classes in the Line Layer, to test logical Expressions.
2155            Set the status of the class "Point9" in the Point Layer to off
2156            
2157    2004-07-13  Bernhard Herzog  <[email protected]>
2158    
2159            * Thuban/UI/baserenderer.py
2160            (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2161            optimization that tries not to draw layers under a raster layer.
2162            The bug was harmless.  All it effectively did was to produce The a
2163            strange messages about not being able to draw Layer instances for
2164            all vector layers below a raster layer which would be invisible
2165            anyway because the raster layer currently always covers the entire
2166            window
2167    
2168    2004-07-08  Jan Sch�ngel <[email protected]>
2169    
2170            * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2171            a list of supported outputformats. This formats are not alle supported
2172            because there is no possibility to get the outputformat without the
2173            name known. Make some formal changes to the code.
2174            (MF_Map.set_name()): Fixed a bug if the name is None.
2175    
2176            * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2177            statement, because its not needed anymore. The Outputformat is now
2178            given as string from the object. Make some formal changes to the code.
2179    
2180            * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2181            most of the new setting which were added during the last changes.
2182            Removed the MF_Size Test.
2183            
2184            * Extensions/umn_mapserver/test/test.map: Added a new class to the
2185            cultural Layer to test expressions and the the status of that layer
2186            from on to default.
2187            Changed the data path the the correct Thuban Data
2188            Added the Outputformat Object and Symbol Object
2189            
2190    2004-07-07  Jan Sch�ngel <[email protected]>
2191    
2192            * Extensions/umn_mapserver/mapfile.py: Added some new
2193            settings to edit (outputformat, label, imagetype)
2194    
2195            * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2196            the Label Dialog and add the OutputDialog.
2197            Make some changes to the code order.
2198    
2199    2004-07-06  Jan Sch�ngel <[email protected]>
2200    
2201            * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2202            and line Obj and add the scalebar_status_type, scalebar_style_type and
2203            scalebar_position_type.
2204            Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2205            are only used to create a Symbol like the circle in Thuban.
2206            Added the scalebarObject (MF_Scalebar)
2207            (MF_Class): Added set_status and get_status.
2208            (MF_Layer.add_thubanclass): Added code to set the class status
2209            (MF_Map): Added code to handle the symbols and scalebar
2210            (MF_Label): Added the set_partials and get_partials functions
2211            
2212            * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2213            from mapfile. Added a function to create a circle object like the one
2214            from thuban if no one exists.
2215            
2216            * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2217            press ok in the assosiated dialog and not at the end of the
2218            colordialog.
2219            Added the Dialog for the Scalebar.
2220            (Label_Dialog): Added the offset option
2221    
2222            * Extensions/umn_mapserver/mf_import.py: Added code to import the
2223            status of the Classes.
2224            Fixed a bug with the projection. Now the to_meter parameter will be
2225            added to the Projection only if it doesn't exists.
2226    
2227    2004-07-01  Jan Sch�ngel <[email protected]>
2228    
2229            Added the functionality to handle the content thuban is not
2230            able to handle directly.
2231    
2232            * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2233            Thuban with the possibility to edit the mapfile content.        
2234            
2235            * Extensions/umn_mapserver/mf_import.py: Added the possibility
2236            to import mapfiles without any layer selected. So it is possible
2237            to edit the other settings in a mapfile.
2238            (import_mapfile): Added code to use the editing functions.
2239            Added the possibility to import the projection to a layer if one
2240            is defined.
2241            Status settings (On,Off) will now set in thuban (visible, invisible).
2242            fixed a bug with with classnames. If no classname is set in mapfile
2243            the value in Thuban will set to the expression.
2244            
2245            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2246            possibility to save a new mapfile or use the old one which is
2247            imported or new created.
2248            Added code to use the editing functions.
2249            Remove some not needed import statements
2250    
2251            * Extensions/umn_mapserver/mapfile.py: Added new types which are
2252            need for the editing functions.
2253            Added needed set-functions for the editing functions.
2254            Added the possibility to export rasterimages.
2255            Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2256            MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2257            moment.
2258            (MF_Class.set_thubanstyle): Now point layers will set to a default
2259            symbol to show a circle in mapserver and not only a 1px dot.
2260            (MF_Style.__init__): Fixed a bug with the color. Color was not set
2261            correct before.
2262            (MF_Size): Removed, because it is not needed.
2263            
2264            * Extensions/umn_mapserver/README: Added the hints to use the
2265            export and editing functions, too.
2266    
2267            * Extensions/umn_mapserver/sample/iceland.map: Added the
2268            new parameter "UNITS METERS".
2269            Change the political layer to status OFF.
2270    
2271            * Extensions/umn_mapserver/sample/README: Added some
2272            more details to setup the sample in the MapServer.
2273            
2274    2004-06-26  Bernhard Reiter <[email protected]>
2275    
2276            * Extensions/svgexport/test/test_svgmapwriter.py:
2277            Removed class VFile and used standard StringIO instead.
2278    
2279    2004-06-23  Jan Sch�ngel  <[email protected]>
2280    
2281            Add the export function to the umn_mapserver extension.
2282    
2283            * Extension/umn_mapserver/mf_export.py: New. This module extents
2284            Thuban with the possibility to export the Thuban content.
2285    
2286            * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2287            with the export module. Especially added the possibility to
2288            add thuban objects directly to the map objects.
2289    
2290            * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2291            because of the hint from Bernhard Herzog.
2292            Corrected the handling of absolute pathnames.
2293            Changed the Text of the Menu-Item, now the beginning is upper case.
2294    
2295            * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2296    
2297    2004-06-16  Jan Sch�ngel  <[email protected]>
2298    
2299            Add a sample and make some changes.
2300    
2301            * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2302            import from * to explicit used statements. Changed the
2303            Thuban.UI.mainwindow import phrase, too.
2304            (import_mapfile):Corrected a clerical mistake.
2305            Added wxCHANGE_DIR in OpenFile Dialog.
2306            Added a MultipleChoiceDialog, to select the layers to load from
2307            mapfile into thuban. Thereby the projection is only set if one layer
2308            is selected.
2309            Added the possibility to handle relative pathnames which uses
2310            up-level references.
2311            Removed some doubled code.
2312            Corrected an error with integer values used as label in thuban
2313            ClassGroup.
2314            
2315            * Extensions/umn_mapserver/sample: New.
2316    
2317            * Extensions/umn_mapserver/sample/README: New. Describes the
2318            usage of the sample files.
2319    
2320            * Extensions/umn_mapserver/sample/iceland.map: New. This is
2321            a suitable .map-file for the iceland data.
2322    
2323            * Extensions/umn_mapserver/sample/index.html: New. The template
2324            for the mapfile.  
2325    
2326            * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2327            file for the Iceland Application on web.
2328    
2329            * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2330            some details.
2331    
2332            * Extensions/umn_mapserver/test/test_mapserver
2333            (mapserver_import_Test_generalClasses.test_MF_Color):
2334            Corrected the thubancolor test.
2335    
2336    2004-06-15  Jan Sch�ngel  <[email protected]>
2337    
2338            * Extensions/umn_mapserver/README: New. Install instruction.
2339    
2340    2004-06-14  Bernhard Reiter <[email protected]>
2341    
2342            * libraries/thuban/cpl_mfile.h: Added copyright header.
2343    
2344            * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2345            Free Software License so that it is most useful with gdalwarp
2346            and bmpdataset.
2347    
2348    2004-06-14  Bernhard Herzog  <[email protected]>
2349    
2350            * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2351            import of wxPython.wx itself (as opposed to the contents of
2352            wxPython.wx).  For some reason wxPython.wx is available as
2353            wxPython.wx.wx in at least some 2.4 releases.  Fixes RT#2482
2354            wrt. wxPython 2.4.
2355    
2356    2004-06-10  Jan Sch�ngel  <[email protected]>
2357    
2358            Initial version of new extension "umn_mapserver".  This extension aims
2359            to manage configuration for the UMN MapServer application.  This
2360            inital version just imports the .map-files and displays all, Thuban is
2361            capable of.
2362    
2363            * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2364    
2365            * Extensions/umn_mapserver/test/README: New. Describes how to run the
2366            tests.
2367    
2368            * Extensions/umn_mapserver/test/test.map: New. This is a test
2369            .map-file for automated tests of the umn_mapserver extension of
2370            Thuban.
2371    
2372            * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2373            UMN Mapserver classes.
2374    
2375            * Extensions/umn_mapserver/__init__.py: New. Init to make this
2376            directory a package.
2377    
2378            * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2379            '.map'-file objects.
2380    
2381            * Extensions/umn_mapserver/mf_import.py: New. This module extends
2382            Thuban with the possibility to handle UMN MapServer mapfiles.
2383    
2384    2004-06-03  Bernhard Herzog  <[email protected]>
2385    
2386            * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2387            to a tuple before using it as arguments to the % operator.  This
2388            fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2389            reported today on thuban-list by Jan Sch�ngel
2390    
2391            * test/test_layer.py (TestLayerModification.setUp): Save the
2392            filename as an instance variable so we can refer to it in tests
2393            (TestLayerModification.test_tree_info): Uncomment this method
2394            again and make it work.  This tests for the formatting issue
2395            filed in RT#2239 on 2004-01-13
2396    
2397    2004-05-28  Bernhard Herzog  <[email protected]>
2398    
2399            * Thuban/UI/baserenderer.py: Fix some typos.
2400    
2401    2004-05-18  Jan-Oliver Wagner <[email protected]>
2402    
2403            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2404            by increasing a field size.
2405    
2406    2004-05-17  Bernhard Herzog  <[email protected]>
2407    
2408            Update to newest shapelib and get rid of Thuban specific
2409            extensions, i.e. use the new DBFUpdateHeader instead of our
2410            DBFCommit kludge
2411    
2412            * libraries/shapelib/shpopen.c: Update to version from current
2413            shapelib CVS.
2414    
2415            * libraries/shapelib/shapefil.h: Update to version from current
2416            shapelib CVS.
2417    
2418            * libraries/shapelib/dbfopen.c: Update to version from current
2419            shapelib CVS.
2420            (DBFCommit): Effectively removed since shapelib itself has
2421            DBFUpdateHeader now which is better for what DBFCommit wanted to
2422            achieve.  
2423            We're now using an unmodified version of dbfopen.
2424    
2425            * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2426            value '1' to the Lib.dbflibc extension.  This simply reflects the
2427            shapelib and pyshapelib updates
2428    
2429    2004-05-16  Jan-Oliver Wagner <[email protected]>
2430    
2431            Finished introduction of Menu.FindOrInsertMenu.
2432    
2433            * Extensions/drawshape/drawshape.py: Add the command
2434            to the experimental menu additionally to the toolbar.
2435    
2436            * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2437            finding menu on its own.
2438    
2439            * Doc/manual/thuban-manual.xml: updated sample file
2440            to use FindOrInsertMenu().
2441    
2442            * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2443            instead of finding menu on its own.
2444    
2445    2004-05-11  Jan-Oliver Wagner <[email protected]>
2446    
2447            * test/test_menu.py (MenuTest.test): Added testing
2448            of method Menu.FindOrInsertMenu.
2449    
2450    2004-05-10  Jan-Oliver Wagner <[email protected]>
2451    
2452            Introduce and use Menu.FindOrInsertMenu.
2453    
2454            * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2455              given menu or, if not found, insert it.
2456    
2457            * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2458            /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2459            /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2460            menu on its own.
2461    
2462    2004-05-06  Jan-Oliver Wagner <[email protected]>
2463    
2464            Introduce a abstract ColorDialog class and remove
2465            and outdated file.
2466    
2467            * Thuban/UI/proj4dialog.py: Removed. It is has been
2468            replaced by projdialog for quite a while and is not used
2469            anymore.
2470    
2471            * Thuban/UI/colordialog.py: New. Abstraction for color selection
2472            dialog(s).
2473    
2474            * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2475            Now calls the abstract ColorDialog instead of wxColourDialog.
2476            This also removed the dependency to Color class conversion
2477            from this function.
2478    
2479    2004-05-04  Frank Koormann  <[email protected]>
2480    
2481            * Extensions/bboxdump/__init__.py: Fixed string left over from
2482            copying.
2483    
2484            * Extensions/bboxdump/bboxdump.py (bboxdump):
2485            Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2486            xrange(layer.NumShapes()). Compile the bboxmessage from a list
2487            of formatted outputs (string.join) instead of appending to the
2488            message. Two progress bar dialogs to report progress on the sometimes
2489            lenghty processing.
2490    
2491    2004-04-22  Frank Koormann  <[email protected]>
2492    
2493            New Extension to dump bounding boxes of all shapes of the selected
2494            layer. An optional column can be specified to group the objects,
2495            in this case the bounding box is a union of the separate boxes.
2496            Dump can be displayed in a ScrolledMessageDialog or written to file.
2497            The Extension is simply a combination of available and well tested
2498            Thuban functionality.
2499    
2500            * Extensions/bboxdump/__init__.py: New: Init to make this
2501            directory a package.
2502    
2503            * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2504            all shapes of the selected layer.
2505    
2506    2004-04-22  Jan-Oliver Wagner <[email protected]>
2507    
2508            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2509            strings to be i18n now.
2510    
2511    2004-04-18  Jan-Oliver Wagner <[email protected]>
2512    
2513            Changing popup menu of legend from direct building
2514            to using the Menu construction as used for the mainwindow.
2515    
2516            * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2517            layer_to_bottom, layer_visibility
2518            (MainWindow.LayerToTop): New. Put current layer to the top.
2519            (MainWindow.LayerToBottom): New. Put current layer to bottom.
2520            (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2521            Replace 1,0 by True, False.
2522            (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2523            current layer.
2524            (MainWindow.LayerShowTable): Removed raising of dialog.
2525            (_has_selected_layer_visible): New. Support function.
2526    
2527            * Thuban/UI/legend.py: ID_POP_xxx: removed.
2528            (LegendPanel.__init__): Removed EVT_MENU bindings.
2529            (LegendTree._OnRightClick): Replace direct creation of
2530            menu via wx Classes by applying the menu definition
2531            as of Menu class of menu.py.
2532            
2533    2004-04-16  Jan-Oliver Wagner <[email protected]>
2534    
2535            * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2536        button string to stronger clearify that Thuban will be closed when hitting
2537            the button.
2538    
2539            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2540            Now for layers without a ShapeStore a corresponding message is given
2541            to the user, that this layer has no table to show.
2542    
2543    2004-04-15  Martin Schulze  <[email protected]>
2544    
2545            * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2546            recalculate the format for the internal render engine as well.
2547    
2548            * Extensions/wms/properties.py (wmsProperties): First start for a
2549            properties dialog.  It's functional for a first selection of
2550            layers, but still has some weired wxWidgets/GTK problems but
2551            beautification can be done later.
2552    
2553            * Extensions/wms/layer.py: Added more documentation
2554            (WMSLayer.getFormats): New: Return list of supported image formats
2555            by the WMS server
2556            (WMSLayer.getLayers): New: Return the list of layer names
2557            supported by the WMS server
2558            (WMSLayer.getLayerTitle): New: Return the title of the named layer
2559            (WMSLayer.getWMSFormat): New: Return the image format that is used
2560            for WMS GetMap requests
2561            (WMSLayer.setWMSFormat): New: Set the image format that is used
2562            for WMS GetMap requests
2563            (WMSLayer.__init__): Move away from using only one layer to using
2564            a list of layers (unsorted at the moment, though).
2565            (WMSLayer.getVisibleLayers): New: Return the list of names for all
2566            visible layers
2567            (WMSLayer.setVisibleLayers): New: Set the list of names for all
2568            visible layers
2569    
2570            * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2571            order to establish a clean structure.
2572    
2573            * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2574            own in order to establish a clean structure.
2575    
2576    2004-04-13  Martin Schulze  <[email protected]>
2577    
2578            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2579            support for oldstyle (WMS 1.0 apparently) image format
2580            specification.
2581    
2582            * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2583            supported graphic formats back to JPEG and BMP, PNG and others are
2584            too *cough* experimental...  Sorry, I meant to filter this out
2585            before I committed this part.  This should make the WMS extension
2586            run from CVS again.
2587            (wms_dialog): Reset an empty URL to None so that the subsequent
2588            program can depend on this, since the dialog will indeed return an
2589            empty URL, causing another declaration of love by Python.
2590    
2591            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2592            Whenever a native BoundingBox request cannot be fulfilled, check
2593            whether the requested SRS is EPSG:3426, in which case return the
2594            LatLonBoundingBox values.
2595    
2596            * Extensions/wms/test/test_parser.py
2597            (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2598            ignoring AUTO:* SRS.
2599            (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2600            Added another test method to test whether the LatLonBoundingBox
2601            values will be returned if BoundingBox values are requested with
2602            SRS set to EPSG:3426.
2603    
2604            * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2605            Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2606            the moment by placing them into a variable which is currently
2607            unused.  Also test whether the EPSG SRS is numerical as it should
2608            be and add an error message if it is not.
2609    
2610            * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2611            appear in the real world as well.  Since we cannot handle them yet
2612            (OGCLib can't either), we will ignore them for the moment.
2613    
2614            * Extensions/wms/parser.py: Use a variable for denoting the sample
2615            filename
2616            (WMSCapabilitiesParser.peekLayers): Added support for error
2617            messages during grok().  They will be aggregated in an array and
2618            may be displayed later.  We may have to add a classification
2619            "Warning" and "Error" to this.  That requires more experience,
2620            though, since not every error may be lethal.
2621    
2622            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2623            ShowTable() dialog/frame when the user attempts to display it
2624            while it has been opened before already and not closed again.
2625    
2626    2004-04-11  Martin Schulze  <[email protected]>
2627    
2628            * Extensions/wms/infodialog.py: Adjusted the class documentation
2629    
2630            * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2631            Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2632            wxWidgets variants.
2633            (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2634    
2635            * Extensions/wms/infodialog.py: Added an information dialog that
2636            will display various information about the WMS current resource,
2637            so that additional information such as the title, the abstract,
2638            fees and access constraints can be displayed for the user if they
2639            are documented in the WMS XML.
2640    
2641    2004-04-10  Martin Schulze  <[email protected]>
2642    
2643            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2644            string handling.  It's "foo".lower() and not lower(foo) without
2645            lower imported from strings or something.
2646    
2647            * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2648            from capabilities.py and parser.py.  Implement priority list for
2649            supported graphics formats, take care of wbmp != bmp.  PNG, TIFF
2650            and GIF are supported here, but not yet by main Thuban.  Hence,
2651            support for them may be removed later.  Special contribution to
2652            usability: get wxWidgets to change the cursor when we're waiting
2653            for data from the network so the user won't start to worry.  This
2654            causes a redrawing error/warning, though.
2655    
2656            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2657            the DOM object.
2658    
2659    2004-04-01  Martin Schulze  <[email protected]>
2660    
2661            * Extensions/wms/capabilities.py: Adjusted documentation
2662            (WMSCapabilities.__init__): Improved documentation, fixed syntax
2663            (WMSCapabilities.saveCapabilities): Only catch IOError when
2664            handling files
2665            (WMSCapabilities.loadCapabilities): Only catch IOError when
2666            handling files
2667            __main__: corrected variable naming
2668            (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2669            class a specialisation of WMSCapabilitiesParser as well.  Also
2670            execute grok() after loading or fetching capabilities, if that
2671            went well, so that subsequent calls can already access the data.
2672            (WMSCapabilities.getVersion): Export the used version of the
2673            GetCapabilities request, so we can use it for subsequent calls,
2674            i.e. for GetMap requests.
2675            (WMSCapabilities.fetchCapabilities): Added proper error handling
2676            when the GetCapabilities request failed, so that the surrounding
2677            program can act accordingly.
2678    
2679    2004-03-30  Martin Schulze  <[email protected]>
2680    
2681            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2682            Adjusted the getLayerSRS method to return the list of SRSes
2683            extracted from <SRS> elements instead of <BoundingBox> elements.
2684            Added a bit of documentation as well.
2685            (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2686            since it was only implemented due to a misunderstanding.
2687    
2688            * Extensions/wms/test/test_parser.py
2689            (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2690            reflect the corrected interpretation of the standard: i.e. a layer
2691            does not have to define a BoundingBox for all SRSes it supports.
2692            Hence the <SRS></SRS> specification is authoritative, not the list
2693            of BoundingBoxes.
2694            (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2695            to ensure None is returned for a non-existing SRS.
2696            (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2697            since it is not applicable anymore.  Listing more SRSes in <SRS>
2698            elements is valid according to the specs.
2699    
2700    2004-03-26  Bernhard Reiter <[email protected]>
2701    
2702            * README: Nicer formatting of text. Improved descriptions.
2703            Reflected wxWidgets name change.
2704            
2705            * Thuban/UI/about.py: Extended copyright to 2004 and added
2706            information about the thuban-devel mailinglist.
2707    
2708    2004-03-24  Martin Schulze  <[email protected]>
2709    
2710            * Extensions/wms/capabilities.py: Renamed the class to contain
2711            'WMS', also added a linebreak where required
2712    
2713            * Extensions/wms/parser.py: Finally added the XML parser for the
2714            GetCapabilities response.
2715    
2716            * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2717            <SRS> elements match the <BoundingBox> elements, except for the
2718            layer 'beschriftung'.
2719    
2720            * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2721            since Python uses unicode strings internally, otherwise
2722            comparisons will fail.  Removed tests for getLayerBBoxSRS() since
2723            the SRS will be calculated anyway and this method is obsoleted by
2724            getLayerSRS().  Denote SRS as strings and not as cardinal numbers.
2725            Move loading the sample file into the setUp method.  Added a test
2726            for finding the integrity problem in the sample response.
2727            Improved formatting.
2728    
2729            * Extensions/wms/domutils.py: Added convenience routines for
2730            handling of Document Object Model (DOM) nodes.
2731    
2732            * Extensions/wms/test/test_domutils.py: Added a test for the
2733            domutils module
2734    
2735    2004-03-19  Martin Schulze  <[email protected]>
2736    
2737            * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2738            Moved path detection and adding into a module of its own,
2739            adjustpath, which exports thubandir as main Thuban directory.
2740    
2741            * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2742            detection and adding into a module of its own, adjustpath, which
2743            exports thubandir as main Thuban directory.  Reorganised the
2744            module in order to support the SkipTest feature for Thuban test
2745            cases.
2746    
2747            * Extensions/wms/test/adjustpath.py: Moved path detection and
2748            adding into a module of its own.
2749    
2750    2004-03-18  Martin Schulze  <[email protected]>
2751    
2752            * Extensions/wms/test/test_parser.py: Added another test for
2753            checking whether the WMS XML parser (to be implemented) returns
2754            the information we expect.  This requires a sample WMS WML file
2755            (sample.xml) which has been extracted from the frida server and
2756            "improved" manually.
2757    
2758            * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2759            main Thuban directory to the path in order to be able to import
2760            random modules.  Adjusted the PyOGCLib detection to reuse the
2761            information gathered.  Also added a note about the PYTHONPATH
2762            environment variable.
2763    
2764            * Extensions/wms/test/test_ogclib.py: The format specification is
2765            a mime-type, not a graphic format, hence image/jpeg wou ld be the
2766            proper format and not JPEG.  We'll also have to take care of the
2767            encoding of / as %2F.
2768    
2769    2004-03-16  Martin Schulze  <[email protected]>
2770    
2771            * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2772            comprehensive test for the getMapURL method, built compare URLs
2773            according to the documentation in OGC 01-068r3
2774    
2775            * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2776            class WMSCapabilities to manage capabilites, will incorporate
2777            parsing the capabilities response and provide details for other
2778            classes.
2779    
2780    2004-03-12  Bernhard Herzog  <[email protected]>
2781    
2782            Support views in addition to normal tables in the postgis
2783            shapestore
2784    
2785            * Thuban/Model/postgisdb.py
2786            (PostGISShapeStore._fetch_table_information): Add a fallback for
2787            the case where the table name is not in the geometry_columns
2788            table.  This is usually the case for views.  Also, set
2789            self.shapestore here.
2790            (PostGISShapeStore.ShapeType): No need to query the database all
2791            the time.  The shape type is now determined in
2792            _fetch_table_information
2793    
2794            * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2795            (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2796            New parameter to specify views.
2797            (PostGISDatabase.has_data): Also compare the views.  New views
2798            parameter
2799            (PostGISDatabase.initdb): Create the views.
2800            (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2801            view
2802    
2803            * test/test_postgis_db.py
2804            (TestPostGISShapestorePointFromViews): New.  Test a
2805            PostGISShapeStore with a view
2806            (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2807            the geometry_column explicitly to test whether that works
2808    
2809    2004-03-12  Bernhard Herzog  <[email protected]>
2810    
2811            Final step for explicit id/geometry columns: Loading and saving
2812    
2813            * Resources/XML/thuban-1.1.dtd: New.  Derived from thuban-1.0.dtd
2814            with the following changes:
2815            (dbshapesource): Two new attributes id_column and geometry_column
2816    
2817            * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2818            (SessionSaver.write_session): Use the new namespace
2819            (SessionSaver.write_data_containers): Write the new dbshapesource
2820            parameters
2821    
2822            * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2823            the new file format version
2824            (SessionLoader.start_dbshapesource): Handle the new db parameters
2825    
2826            * test/test_save.py: Update to the new dtd and namespace
2827            (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2828            mock object to provide a working IDColumn method.
2829    
2830            * test/test_load_1_0.py: New.  Copy of the test_load.py before
2831            today's changes but with the round-trip tests removed.
2832    
2833            * test/test_load_0_9.py: Update doc-string.
2834    
2835            * test/test_load.py: Update all .thuban files to the new dtd and
2836            namespace.
2837            (TestPostGISLayer.file_contents): Add the new dbshapesource
2838            paramters
2839    
2840    2004-03-11  Bernhard Herzog  <[email protected]>
2841    
2842            Next step for explicit id/geometry columns: User interaction
2843    
2844            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
2845            the dialog is constructed. Add combo boxes to select id and
2846            geometry column.  Rename some instance variables.
2847            (ChooseDBTableDialog.GetTable): Return id and geometry column
2848            names
2849            (ChooseDBTableDialog.OnTableSelect): New. Event handler for
2850            selections in the table list
2851    
2852            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
2853            and geometry_column
2854    
2855            * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
2856            parameters for id_column and geometry column of PostGISShapeStore
2857            here as well.
2858    
2859            * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
2860            (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
2861            (PostGISConnection.GeometryTables): Use a better query to
2862            determine which relations in the database might be usable for
2863            shapestores.  Now supports views as well but is more PostgreSQL
2864            specific
2865            (PostGISConnection.table_columns): New. Somewhat experimental
2866            method to let the db dialogs provide lists of columns to users so
2867            that they can select id and geometry columns.
2868            (PostGISTable.__init__): The default value of the id_column
2869            parameter is now None it still means "gid" effectively, though.
2870            (PostGISTable.IDColumn): New introspection method to return a
2871            column object for the id column
2872            (PostGISShapeStore.GeometryColumn): New introspection method to
2873            return a column object for the geometry column
2874    
2875            * test/test_postgis_db.py
2876            (TestPostGISConnection.test_gis_tables_non_empty):
2877            Removed. Subsumed by the new:
2878            (TestPostGISConnection.test_gis_tables_with_views_and_tables):
2879            New. Tes the GeometryTables and table_columns methods with actual
2880            tables and views.
2881            (PointTests.test_id_column, PointTests.test_geometry_column):
2882            New. tests for the new methods.
2883            (TestPostGISShapestorePoint.setUp)
2884            (TestPostGISShapestorePointSRID.setUp)
2885            (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
2886            instance variables needed by the new tests
2887    
2888    2004-03-11  Bernhard Herzog  <[email protected]>
2889    
2890            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
2891            numbers given to ReadValue are ordinals.
2892    
2893    2004-03-11  Bernhard Herzog  <[email protected]>
2894    
2895            Elimiate the requirement for PostGIS tables to have a column
2896            called "gid".
2897    
2898            * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
2899            id_column to specify which column to use to identify rows.  Also
2900            new instance variables id_column and quoted_id_column
2901            (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
2902            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
2903            (PostGISTable.SimpleQuery): Use the id column name provided to the
2904            constructor instead of "gid"
2905            (PostGISShapeStore.__init__): New parameter id_column analogously
2906            to PostGISTable.__init__.  This parameter is simply passed through
2907            to the base class constructor
2908            (PostGISShapeStore._create_col_from_description): Fix typo in
2909            doc-string
2910            (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
2911            (PostGISShapeStore.ShapesInRegion): Use the id column name
2912            provided to the constructor instead of "gid"
2913    
2914            * test/postgissupport.py
2915            (PostgreSQLServer.get_default_static_data_db): New static table
2916            landmarks_point_id with an id column != "gid.  Update the comments
2917            a bit.
2918            (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
2919            doc-
2920            (upload_shapefile): New parameter gid_column to use a name other
2921            than "gid" for the column to store the shape ids
2922    
2923            * test/test_postgis_db.py (TableTests): New.  Mixin-class
2924            containing all tests previously in TestPostGISTable.  The actual
2925            tests are the same but the code is a bit more configurable to
2926            allow for different id columns etc.
2927            (TestPostGISTable): Derive from TableTests now for the actual
2928            tests.
2929            (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2930            except that it the landmarks_point_id table to test the id_column
2931            parameter
2932            (PointTests): Extend the doc-string
2933            (TestPostGISShapestorePointExplicitGIDColumn)
2934            (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2935            from PointTests to test the explicit id_column parameter.  One
2936            tests with the name of the column holding the shape ids, the other
2937            uses PostgreSQL's OID column.  For the latter a number of methods
2938            have to be overwritten to make them independent of the actual id
2939            values.
2940    
2941    2004-03-08  Silke Reimer  <[email protected]>
2942    
2943            Update debian directory:
2944    
2945            * debian/changelog: Added new version.
2946            * deiban/rules: Updated management of patches (with cbds)
2947            * debian/control: Added cbds to dependencies
2948            * debian/patches/*: New. Adds better support for patches of thuban in
2949                            debian
2950            * debian/menu: Syntax of menu changed slightly
2951            * debian/setup.py.patch: removed because it has been moved to
2952                            debian/patechs/setup.py.patch
2953            
2954    
2955    2004-02-26  Bernhard Herzog  <[email protected]>
2956    
2957            Create the Doc/technotes directory for text files with information
2958            for developers
2959    
2960            * Doc/technotes/README: New. README for the technotes
2961    
2962            * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2963            Thuban
2964    
2965            * Doc/technotes/release_process.txt: New. Used to be
2966            HOWTO-Release.  Now slightly adapted to technote formatting style.
2967    
2968            * HOWTO-Release: Removed.  It's contents are now in
2969            Doc/technotes/release_process.txt
2970    
2971    2004-02-25  Bernhard Herzog  <[email protected]>
2972    
2973            * libraries/thuban/wxproj.cpp (get_wx_version): New.  Return the
2974            version of wxWindows the module was compiled with so we can check
2975            that against the wxPython version.
2976    
2977            * Thuban/version.py (thuban_branch, thuban_release): New variables
2978            controlling which and how Thuban versions are shown.  See the
2979            comments for details.
2980            (verify_versions): Also check that the wx version that wxproj is
2981            compiled against matches that of the wxPython we use at runtime
2982    
2983    2004-02-20  Bernhard Herzog  <[email protected]>
2984    
2985            * Extensions/wms/wms.py (epsg_code_to_projection): Use
2986            get_system_proj_file to read the epsg projections.  The old way
2987            depended on the current directory being the top Thuban directory.
2988    
2989    2004-02-20  Bernhard Herzog  <[email protected]>
2990    
2991            * Extensions/svgexport/test/test_svgmapwriter.py
2992            (TestVirtualDC.test_clippath): Remove a debug print
2993    
2994    2004-02-20  Bernhard Herzog  <[email protected]>
2995    
2996            * Extensions/svgexport/__init__.py: New.  Turn
2997            Extensions/svgexport into a package.
2998    
2999            * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3000            doc-string a bit.  The doc-string must come first, otherwise it's
3001            not a doc-string.  The __future__ import must be the first thing
3002            after the doc-string.  Use only double quotes in doc-strings.
3003            Single quotes trip up emacs syntax highlighting if the text
3004            contains apostrophes.
3005    
3006    2004-02-20  Bernhard Herzog  <[email protected]>
3007    
3008            * Extensions/svgexport/test/__init__.py,
3009            Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3010            suite for svgexport
3011    
3012            * test/runtests.py (find_test_modules): New. Function with the
3013            module finding code from main.
3014            (main): Use find_test_modules to figure out the default test
3015            modules and take modules from Extensions.svgexport.test too.
3016    
3017    2004-02-19  Bernhard Herzog  <[email protected]>
3018    
3019            * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3020            the mainwindow has a reference to the map of the initial session.
3021            This fixes a bug introduced with the fix for RT#2245
3022    
3023    2004-02-19  Bernhard Herzog  <[email protected]>
3024    
3025            * Extensions/svgexport/svgsaver.py,
3026            Extensions/svgexport/svgmapwriter.py,
3027            Extensions/svgexport/maplegend.py: Added again.  This time in the
3028            correct place.
3029    
3030    2004-02-17  Bernhard Herzog  <[email protected]>
3031    
3032            Fix for RT#2245
3033    
3034            * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3035            instance variables before trying to create any windows.  Creating
3036            windows can start an event loop if e.g. message boxes are popped
3037            up for some reason, and event handlers, especially EVT_UPDATE_UI
3038            may want to access things from the application.
3039            (ThubanApplication.maps_changed): The mainwindow may not have been
3040            created yet, so check whether it has been created before calling
3041            its methods
3042    
3043            * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3044            have a map
3045    
3046    2004-02-17  Bernhard Herzog  <[email protected]>
3047    
3048            * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3049            Extensions/svgmapwriter.py, Extensions/maplegend.py,
3050            extensions/svgexport/svgsaver.py,
3051            extensions/svgexport/svgmapwriter.py,
3052            extensions/svgexport/maplegend.py: Removed.  These files were in
3053            the wrong places or didn't work at all.
3054    
3055    2004-02-16  Bernhard Herzog  <[email protected]>
3056    
3057            * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3058            line
3059    
3060    2004-02-16  Bernhard Herzog  <[email protected]>
3061    
3062            * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3063    
3064    2004-02-15  Markus Rechtien  <[email protected]>
3065            
3066            * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3067            to write a session to a file in SVG format.
3068            * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3069            to write a SVG map of a session.
3070            * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3071            in SVG format for the current session.
3072    
3073    2004-02-13  Bernhard Herzog  <[email protected]>
3074    
3075            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3076            can't be created, return immediately after displaying the error
3077            message.
3078    
3079    2004-02-11  Bernhard Herzog  <[email protected]>
3080    
3081            Handle postgis tables with more than one geometry column.
3082    
3083            * Thuban/Model/postgisdb.py
3084            (PostGISTable._fetch_table_information): Delegate the creation of
3085            column objects to a different method so that we can extend that in
3086            derived classes
3087            (PostGISTable._create_col_from_description): New. Column object
3088            creation part of _fetch_table_information
3089            (PostGISShapeStore._create_col_from_description): New. Extend
3090            inherited method to handle geometry columns
3091            (PostGISShapeStore.__init__): New parameter geometry_column to
3092            specify which geometry column to use.  Optional but mandatory for
3093            tables with more than one geometry column
3094            (PostGISShapeStore._fetch_table_information): Also use the name of
3095            the geometry column when looking for the srid
3096            (PostGISShapeStore.ShapeType): Also use the name of the geometry
3097            column when looking for the shape type
3098    
3099            * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3100            NonConnectionStore to changes in the PostGISShapeStore
3101    
3102            * test/test_postgis_db.py
3103            (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3104            PostGISShapeStore with tables having two geometry columns.
3105    
3106    2004-02-10  Bernhard Herzog  <[email protected]>
3107    
3108            Fix some postgis problems.  What remains to be done is real
3109            handling of SRIDs as they affect how reprojection is done
3110    
3111            * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3112            doc-string
3113            (PostGISShapeStore._fetch_table_information): New. Extend
3114            inherited method to retrieve srid
3115            (PostGISShapeStore.BoundingBox): Handle tables without data.
3116            extent yields NULL for those
3117            (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3118    
3119            * test/test_postgis_db.py
3120            (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3121            for the special case of a table without any data
3122            (TestPostGISShapestorePointSRID): New class with tests for a table
3123            that uses srids
3124            (PolygonTests): Fix a doc-string typo
3125    
3126            * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3127            reference_systems with a specification of spacial reference
3128            systems to create in the new db.
3129            (PostgreSQLServer.new_postgis_db)
3130            (PostgreSQLServer.get_static_data_db): New parameter
3131            reference_systems to be passed through ultimately to
3132            PostGISDatabase.  In new_postgis_db also check whether an existing
3133            db already has the right srids
3134            (PostgreSQLServer.get_default_static_data_db): Add srids and a
3135            table that uses srids
3136            (PostGISDatabase.initdb): Create the entries for the reference
3137            systems
3138            (PostGISDatabase.has_data): Add reference_systems parameter to
3139            check for those too
3140            (upload_shapefile): New parameter srid to create tables with a
3141            specific srid
3142    
3143    2004-02-06  Frank Koormann  <[email protected]>
3144    
3145            * po/pt_BR.po: Fixed charset
3146    
3147    2004-02-05  Frank Koormann  <[email protected]>
3148    
3149            * po/pt_BR.po: Fixed format string for error message, missing %s
3150            added (Thuban/UI/application.py:273)
3151    
3152    2004-02-03  Frank Koormann  <[email protected]>
3153            
3154            First version of Portuguese (Brazilian) translation
3155    
3156            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3157            Brazilian Portuguese by Eduardo Patto Kanegae.
3158    
3159            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3160            translators.
3161    
3162    
3163    2004-01-22  Frank Koormann  <[email protected]>
3164    
3165            * Doc/manual/thuban-manual.xml: Added section on installation of
3166            Thuban under Win32 systems. Fixed image path references in the postgis
3167            section. Some minor source formattings.
3168    
3169    2004-01-21  Frank Koormann  <[email protected]>
3170    
3171            Make Thuban remember path selections (at least for one application run).
3172    
3173            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3174            attribute of application object. Path is a dictionary of
3175            strings, currently with the items "data" and "projection".  
3176            (Application.SetPath): New, stores path for the specified item.
3177            (Application.Path): New, return path for the specified item.
3178    
3179            * Thuban/UI/mainwindow.py
3180            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3181            MainWindow.AddLayer, MainWindow.AddRasterLayer,
3182            MainWindow.TableOpen): Access "data" path information of the
3183            application.
3184            
3185            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3186            Access "projection" path information of the application.
3187    
3188    2004-01-05  Bernhard Herzog  <[email protected]>
3189    
3190            * po/ru.po: Updated translations from Alex Shevlakov
3191    
3192    2004-01-05  Bernhard Herzog  <[email protected]>
3193    
3194            * po/Makefile, po/README: Move the description of how to generate
3195            the translation statistics to the README.
3196    
3197    2003-12-23  Bernhard Herzog  <[email protected]>
3198    
3199            * NEWS: Update for 1.0.0
3200    
3201            * po/it.po: Another update from Maurizio Napolitano
3202    
3203    2003-12-23  Bernhard Herzog  <[email protected]>
3204    
3205            * po/it.po: Updated translation from Maurizio Napolitano
3206    
3207    2003-12-23  Bernhard Herzog  <[email protected]>
3208    
3209            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3210            for translation
3211    
3212            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3213            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3214            strings for translation
3215    
3216            * po/de.po: Update with the newly marked strings.
3217    
3218    2003-12-22  Bernhard Herzog  <[email protected]>
3219    
3220            * HOWTO-Release: Fix the places where version numbers have to be
3221            updated
3222    
3223    2003-12-22  Bernhard Herzog  <[email protected]>
3224    
3225            * setup.py (setup call): 1.0.0, yeah!
3226    
3227            * Thuban/version.py (longversion): 1.0.0, yeah!
3228    
3229            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3230            1.0.0 namespace too
3231    
3232            * Thuban/Model/save.py (SessionSaver.write_session): Save with
3233            1.0.0 namespace
3234    
3235            * test/test_load.py (LoadSessionTest.dtd)
3236            (TestSingleLayer.file_contents)
3237            (TestNonAsciiColumnName.file_contents)
3238            (TestLayerVisibility.file_contents)
3239            (TestClassification.file_contents, TestLabels.file_contents)
3240            (TestLayerProjection.file_contents)
3241            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3242            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3243            (TestPostGISLayerPassword.file_contents)
3244            (TestLoadError.file_contents, TestLoadError.test): Update for
3245            1.0.0 namespace
3246    
3247            * test/test_save.py (SaveSessionTest.dtd)
3248            (SaveSessionTest.testEmptySession)
3249            (SaveSessionTest.testSingleLayer)
3250            (SaveSessionTest.testLayerProjection)
3251            (SaveSessionTest.testRasterLayer)
3252            (SaveSessionTest.testClassifiedLayer)
3253            (SaveSessionTest.test_dbf_table)
3254            (SaveSessionTest.test_joined_table)
3255            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3256    
3257    2003-12-22  Bernhard Herzog  <[email protected]>
3258    
3259            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3260            alignment flags are byte strings not unicode and that they have
3261            valid values
3262    
3263            * test/test_load.py (TestLabelLayer): New. Test loading (and
3264            indirectly saving) of maps with labels.
3265    
3266    2003-12-22  Bernhard Herzog  <[email protected]>
3267    
3268            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3269            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3270            unsubscribe all subscribers.
3271            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3272            self.grid since it may already have been destroyed.
3273            Fixes RT #2256
3274    
3275    2003-12-19  Bernhard Herzog  <[email protected]>
3276    
3277            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3278    
3279    2003-12-16  Bernhard Herzog  <[email protected]>
3280            
3281            * debian/bitmappath.patch, debian/setup.py.patch:
3282                    added to ensure compliance with FHS for debian
3283            * debian/rules, debian/changelog:
3284                added patches in rules to ensure compliance with FHS for debian
3285    
3286    2003-12-16  Bernhard Herzog  <[email protected]>
3287    
3288            * po/Makefile (mo): Make the output a bit nicer so that it prints
3289            statistics about the translations. Add a comment how produce even
3290            nicer statistics with sed.
3291    
3292    2003-12-09  Frank Koormann   <[email protected]>
3293    
3294            * Resources/Projections/defaults.proj:
3295            French projection sample with correct accents (UNICODE).
3296    
3297    2003-12-05  Bernhard Herzog  <[email protected]>
3298    
3299            * MANIFEST.in: Add the devtools directory
3300    
3301            * setup.py (setup call): Use license instead of licence. This
3302            silences a deprecation warning on Python 2.3
3303    
3304    2003-12-05  Frank Koormann   <[email protected]>
3305    
3306            Documentation synced with 1.0rc1
3307    
3308            * Doc/manual/thuban-manual.xml:
3309            Minor formatting changes and references to database layers .
3310            Introduction.Internationalization: New section on i18n.
3311            MapManagement.AddingandRemovingLayers: Added item on database layers.  
3312            MapManagement.TheLegend: Added section and screenshot on popup menu.
3313            ProjectionManagement: Updated screenshot and sentence on EPSG.
3314            Appendix.SupportedDataSources: Added PostGIS.
3315            Appendix.WorkingwithPostGIS: New section.
3316    
3317            * Doc/manual/images/6_projection.png: Updated screenshot including
3318            EPSG checkboxes.
3319    
3320            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3321    
3322            * Doc/manual/images/app_postgis_add_layer.png,
3323            Doc/manual/images/app_postgis_db_add.png,
3324            Doc/manual/images/app_postgis_db_management.png:
3325            New screenshots focussing on database layers
3326    
3327    2003-12-05  Frank Koormann   <[email protected]>
3328    
3329            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3330            write warning to stderr instead of rising a warning dialog
3331    
3332    2003-12-03  Bernhard Herzog  <[email protected]>
3333    
3334            Fix for RT #2243
3335    
3336            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3337            New. Like has_selected_layer but for shape layers only
3338            (_has_selected_shape_layer): New. Like _has_selected_layer but for
3339            shape layers only
3340            (layer_show_table command, layer_jointable command): Use these
3341            commands should only be available for shape layers
3342    
3343    2003-12-03  Bernhard Herzog  <[email protected]>
3344    
3345            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3346            publishers that are wx objects and may have been destroyed by wx
3347            already. Fixes RT #2242.
3348    
3349    2003-12-03  Bernhard Herzog  <[email protected]>
3350    
3351            * po/ru.po: Updates from Alex Shevlakov
3352    
3353    2003-12-03  Silke Reimer <silkeintevation.de>
3354    
3355            * debian/control, debian/changelog: Added gdal-support to
3356                    debian package, updated to new thuban version
3357    
3358    
3359    2003-12-03  Bernhard Herzog  <[email protected]>
3360    
3361            * Thuban/Lib/version.py: New. Module for version number
3362            manipulations. The version of make_tuple here also deals better
3363            with more unusual version number strings, such as e.g.
3364            "1.2+cvs20031111"
3365    
3366            * Thuban/version.py (make_tuple): Removed. It's now in
3367            Thuban.Lib.version. Use that implementation instead.
3368    
3369            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3370    
3371    2003-12-02  Bernhard Herzog  <[email protected]>
3372    
3373            * MANIFEST.in: Add debian files
3374    
3375            * setup.py (setup call): Add packages for the Extensions so that
3376            they're installed too
3377            (data_files): Add READMEs and sample data from some Extensions
3378    
3379            * NEWS: Add note about the extensions in binary packages
3380    
3381    2003-12-02  Bernhard Herzog  <[email protected]>
3382    
3383            * Thuban/Model/save.py (SessionSaver.write_session): Save files
3384            with the thuban-1.0rc1
3385    
3386            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3387            thuban-1.0rc1 namespace too
3388    
3389            * test/test_save.py (SaveSessionTest.dtd)
3390            (SaveSessionTest.testEmptySession)
3391            (SaveSessionTest.testSingleLayer)
3392            (SaveSessionTest.testLayerProjection)
3393            (SaveSessionTest.testRasterLayer)
3394            (SaveSessionTest.testClassifiedLayer)
3395            (SaveSessionTest.test_dbf_table)
3396            (SaveSessionTest.test_joined_table)
3397            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3398            namespace
3399    
3400            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3401            namespace
3402            (TestSingleLayer.file_contents)
3403            (TestNonAsciiColumnName.file_contents)
3404            (TestLayerVisibility.file_contents)
3405            (TestClassification.file_contents, TestLabels.file_contents)
3406            (TestLayerProjection.file_contents)
3407            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3408            (TestPostGISLayer.file_contents)
3409            (TestPostGISLayerPassword.file_contents)
3410            (TestLoadError.file_contents, TestLoadError.test): Update to
3411            thuban-1.0rc1 namespace
3412    
3413    2003-12-01  Bernhard Herzog  <[email protected]>
3414    
3415            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3416            nt to better match Intevation's current w32 setup
3417    
3418            * HOWTO-Release: Add note about updating MANIFEST.in
3419    
3420            * MANIFEST.in: Add the Extensions
3421    
3422            * NEWS: Update for 1.0rc1
3423    
3424    2003-12-01  Bernhard Herzog  <[email protected]>
3425    
3426            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3427            cards for the dialog so that shapefiles ending in all uppercase
3428            SHP are listed too
3429    
3430    2003-11-28  Bernhard Herzog  <[email protected]>
3431    
3432            * Thuban/version.py (longversion): Update to 1.0rc1
3433    
3434            * setup.py (setup call): Update version to 1.0rc1. Use the
3435            [email protected] email address as author email instead of my
3436            personal one.
3437    
3438    2003-11-28  Bernhard Herzog  <[email protected]>
3439    
3440            * po/de.po: Update german translation.
3441    
3442    2003-11-28  Bernhard Herzog  <[email protected]>
3443    
3444            Unify the filenames stored in .thuban files so that the .thuban
3445            files are more platform independend
3446    
3447            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3448            that they can be used on both windows and unix
3449            (SessionSaver.prepare_filename): New. Handle all filename
3450            transformations for filenames stored in the thuban file
3451            (SessionSaver.write_data_containers, SessionSaver.write_layer):
3452            Use prepare_filename
3453    
3454            * test/test_save.py (SaveSessionTest.testSingleLayer)
3455            (SaveSessionTest.testLayerProjection)
3456            (SaveSessionTest.testRasterLayer)
3457            (SaveSessionTest.testClassifiedLayer)
3458            (SaveSessionTest.test_dbf_table)
3459            (SaveSessionTest.test_joined_table): Filenames are always stored
3460            with slashes on all currently supported platforms so adapt all
3461            tests to this
3462    
3463            * test/test_load.py (LoadSessionTest.filenames): With the new
3464            filename scheme the filenames in the tests should be
3465            understandable on all currently supported platforms so we turn
3466            this into an empty list because we don't have to normalize them
3467            anymore
3468    
3469    2003-11-28  Bernhard Herzog  <[email protected]>
3470    
3471            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3472            Add the ellipsoid to the projection since some Proj versions
3473            complain if it's missing.
3474    
3475    2003-11-27  Bernhard Herzog  <[email protected]>
3476    
3477            Corect some bounding box projection problems
3478    
3479            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3480            version of ForwardBBox
3481            (Projection._transform_bbox): New. common implementation of
3482            ForwardBBox and InverseBBox
3483            (Projection.ForwardBBox): Use _transform_bbox.
3484    
3485            * test/test_proj.py (TestProjection.test): Add test for
3486            InverseBBox
3487    
3488            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3489            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3490            new InverseBBox method to determine the unprojected bounding box
3491            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3492            bbox.
3493    
3494            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3495            Removed.
3496            (TestLayer.test_arc_layer_with_projection): New. This test is
3497            better able to test whether bounding boxes are projected correctly
3498            than test_point_layer_with_projection
3499    
3500            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3501            InverseBBox to unproject bboxes
3502    
3503    2003-11-25  Bernhard Herzog  <[email protected]>
3504    
3505            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3506            source code.
3507    
3508    2003-11-25  Bernhard Herzog  <[email protected]>
3509    
3510            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3511            there for backwards compatibility and all code relying on that
3512            should have been updated by now.
3513    
3514    2003-11-25  Bernhard Herzog  <[email protected]>
3515    
3516            * test/test_load.py (TestClassification.test): Add the missing
3517            round trip test.
3518            (TestClassification.file_contents): Update to the newest file
3519            format
3520    
3521    2003-11-25  Bernhard Herzog  <[email protected]>
3522    
3523            Add very experimental (and possibly dangerous) extension to draw
3524            polygons:
3525    
3526            * Extensions/drawshape/README: New. Brief installation
3527            instructions
3528    
3529            * Extensions/drawshape/drawshape.py: New. Implementation of the
3530            drawshape extensions
3531    
3532            * Extensions/drawshape/patch.diff: Patch to apply before the
3533            extension can be used.
3534    
3535    2003-11-24  Bernhard Herzog  <[email protected]>
3536    
3537            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3538            (ShapefileStore.__init__): Factor opening the shapefile into a
3539            separate method (the new _open_shapefile). This makes the code a
3540            bit more readable but the real reason is that it makes some evil
3541            hacks easier. :-)
3542    
3543    2003-11-24  Bernhard Herzog  <[email protected]>
3544    
3545            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3546            converter is specified for an attribute assume it's a string
3547            containing only Latin1 characters. Update doc-string accordingly.
3548            This change should fix many places where unicode objects might
3549            accidentally enter Thuban.
3550    
3551            * test/test_load.py (TestNonAsciiColumnName): New test to check
3552            what happens with column names in DBF files that contain non-ascii
3553            characters
3554    
3555    2003-11-21  Bernhard Herzog  <[email protected]>
3556    
3557            Enable the experimental attribute editing again and introduce a
3558            command line switch to actually activate it
3559    
3560            * Thuban/UI/main.py (options): New. Container for options set on
3561            the commmand line
3562            (main): Add the --enable-attribute-editing flag.
3563    
3564            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3565            editing is enabled use the grid ctrl which allows editing of the
3566            values
3567    
3568            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3569            New. Just delegate this to the underlying table.
3570    
3571    2003-11-20  Bernhard Herzog  <[email protected]>
3572    
3573            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3574            Skip this test if run under non-posix systems since it only works
3575            there
3576    
3577    2003-11-19  Bernhard Herzog  <[email protected]>
3578    
3579            * Thuban/Model/resource.py: Rework the way gdal support is
3580            determined so that we can give a reason in the about why gdal is
3581            not supported.
3582            (gdal_support_status): New. Variable holding a string with the
3583            reason for no gdal support
3584    
3585            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3586            not supported to the message
3587    
3588    2003-11-19  Bernhard Herzog  <[email protected]>
3589    
3590            Remove the old table interface and its test cases
3591    
3592            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3593            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3594            anymore
3595    
3596            * Thuban/Model/transientdb.py (TransientTableBase)
3597            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3598            anymore
3599    
3600            * test/test_table.py: Removed since the old interface it tests is
3601            gone.
3602    
3603            * test/runtests.py (main): The old table interface is gone and
3604            with it the deprecation warnings so remove the code that turns
3605            these warnings into errors
3606    
3607    2003-11-19  Bernhard Herzog  <[email protected]>
3608    
3609            * test/test_table.py: Revert to revision 1.5 again. Changing the
3610            tests to use the new table interface is completely wrong since the
3611            whole purpose of the tests in this module is to test the old
3612            interface.
3613    
3614    2003-11-18  Bernhard Herzog  <[email protected]>
3615    
3616            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3617            New. Test whether the connection matches a set of connection
3618            parameters
3619    
3620            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3621            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3622            for existing connections with the same parameters and break out of
3623            the loop correctly.
3624    
3625            * test/test_postgis_db.py (TestBriefDescription)
3626            (TestPostGISSimple.test_brief_description): Rename
3627            TestBriefDescription to TestPostGISSimple and the test method to
3628            test_brief_description so that we can add more test methods.
3629            (TestPostGISSimple.test_matches_parameters): New. Test the new
3630            MatchesParameters method
3631    
3632    2003-11-18  Bernhard Herzog  <[email protected]>
3633    
3634            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3635            _was_destroyed, to indicate whether an publisher instance has
3636            already been destroyed.
3637            (Publisher.Unsubscribe): Only disconnect if the publisher has not
3638            been destroyed yet.
3639            (Publisher.Destroy): Set the _was_destroyed flag to true.
3640    
3641            * test/test_connector.py
3642            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3643            calling Unsubscribe after Destroy doesn't raise an exception
3644    
3645    2003-11-14  Bernhard Herzog  <[email protected]>
3646    
3647            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3648            typo in doc-string
3649    
3650    2003-11-13  Bernhard Herzog  <[email protected]>
3651    
3652            Quote table and column names properly for postgis.
3653    
3654            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3655            quote an identifier for use in an sql statement
3656            (PostGISColumn.__init__): Add the quoted_name attribute
3657            (PostGISTable.__init__): New instance variable quoted_tablename
3658            (PostGISTable._fetch_table_information): Use the quoted table
3659            name. New isntance variable quoted_geo_col with a quoted version
3660            of geometry_column
3661            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3662            (PostGISTable.RowOrdinalToId): Use the quoted table name
3663            (PostGISTable.ReadValue, PostGISTable.ValueRange)
3664            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3665            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3666            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3667            Use quoted table and column names
3668    
3669            * test/test_postgis_db.py (TestPostGISSpecialCases)
3670            (TestPostGISIgnoredColumns): Rename the class to
3671            TestPostGISSpecialCases because that better describes the new
3672            cases
3673            (TestPostGISSpecialCases.test_unsupported_types)
3674            (TestPostGISSpecialCases.test): Rename the method to
3675            test_unsupported_types because we need a more descriptive name now
3676            that there are more methods
3677            (TestPostGISSpecialCases.test_table_name_quoting)
3678            (TestPostGISSpecialCases.test_column_name_quoting)
3679            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3680            cases to test quoting of table and column names in PostGISTable
3681            and PostGISShapeStore
3682    
3683            * test/postgissupport.py
3684            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3685            AddGeometryColumn desn't support table or column names with sapces
3686            or double quotes
3687    
3688    2003-11-12  Jan-Oliver Wagner <[email protected]>
3689    
3690            * Extensions/wms/__init__.py: New: Init to make this
3691            directory a package.
3692    
3693            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3694    
3695    2003-11-11  Bernhard Herzog  <[email protected]>
3696    
3697            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3698            Constant for the file woth deprecated epsg projections
3699            (get_system_proj_file): Update doc-string
3700    
3701            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3702            above the EPS widgets, introduce a check box for the deprecated
3703            eps projections and a label for the epsg widgets
3704            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3705            too
3706    
3707    2003-11-11  Bernhard Herzog  <[email protected]>
3708    
3709            Avoid warnings when run under Python 2.3
3710    
3711            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3712            (BaseRenderer.draw_label_layer): Coordinates must be ints.
3713    
3714            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3715            real method so that we can convert to int.
3716            (MapRenderer.label_font): The font size mist be an int.
3717    
3718            * Thuban/UI/common.py (Color2wxColour): The color values must be
3719            ints. Also, remove the unnecessary asserts.
3720    
3721            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3722            (TestUnicodeStrings.test): Python source code should not contain
3723            non-ascii characters unless an encoding is specified in the file.
3724            Therefore use \x escapes in the string literals for non-ascii
3725            characters.
3726    
3727    2003-11-11  Bernhard Herzog  <[email protected]>
3728    
3729            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3730            parameter so that this function can be used for all proj files in
3731            Resource/Projections
3732            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3733            get_system_proj_file
3734    
3735            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3736            ProjFile self.__sysProjFile use a dictionary of system ProjFile
3737            objects self._sys_proj_files
3738            (ProjFrame.build_dialog): Adapt to the new changes in the
3739            ProjectionList constructor. Add a check button to toggle whether
3740            EPSG projections are shown
3741            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3742            events.
3743            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3744            the busy cursor if the files have not yet been loaded by the
3745            dialog.
3746            (ProjFrame.load_system_proj): Add a parameter for the name of the
3747            proj file. Maintain the dictionary of system projections
3748            self._sys_proj_files
3749    
3750            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3751            user_projs parameters into one parameter proj_files which is a
3752            list of proj files.
3753            (ProjectionList._subscribe_proj_files)
3754            (ProjectionList._unsubscribe_proj_files): New. Move
3755            subscription/unsubscription of projfile messages to separate
3756            methods
3757            (ProjectionList.Destroy): The unsubscribe is now done in
3758            _unsubscribe_proj_files
3759            (ProjectionList.update_projections): We now have a list of proj
3760            file objects
3761            (ProjectionList.SetProjFiles): New method to set a new list of
3762            proj file objects
3763    
3764            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3765            Specify explicitly which system proj file to load.
3766    
3767    2003-11-11  Bernhard Herzog  <[email protected]>
3768    
3769            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3770            instance variables to cut cyclic references. The GC would have
3771            collected the loader eventually but it can happen that it doesn't
3772            run at all until thuban is closed (2.3 but not 2.2 tries a bit
3773            harder and forces a collection when the interpreter terminates)
3774            (load_session): Call the handler's Destroy method to make sure
3775            that it gets garbage collected early. Otherwise it will be
3776            collected very late if at all and it holds some references to e.g.
3777            shapestores and the session which can lead to leaks (of e.g. the
3778            temporary files)
3779    
3780            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3781            resource leak in load_session
3782    
3783    2003-11-10  Bernhard Herzog  <[email protected]>
3784    
3785            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3786            extensions are to be rendered.
3787            (_renderer_extensions): New. List with renderer for layers in
3788            extensions
3789            (add_renderer_extension): New. Add a renderer extension
3790            (init_renderer_extensions): New. Init the renderer extensions
3791            (BaseRenderer.render_map_incrementally): Search
3792            _renderer_extensions for how to draw unknown layer types
3793            (BaseRenderer.draw_raster_data): Add format parameter so that
3794            formats other than BMP can be drawn
3795            (BaseRenderer.draw_raster_layer): Pass an explicit format to
3796            draw_raster_data
3797    
3798            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3799            strings of the format parameter of draw_raster_data method to wx
3800            constants
3801            (MapRenderer.draw_raster_data): Add the format parameter and use
3802            raster_format_map to map it to the right wxwindows constant for
3803            wxImageFromStream
3804    
3805            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3806            the format parameter and record it
3807            (TestBaseRenderer.test_raster_no_projection): check the format
3808            paramter of the draw_raster_data method
3809            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3810            extension facility
3811    
3812    2003-11-07  Bernhard Herzog  <[email protected]>
3813    
3814            Tweak the usage of the sqlite database to make common use cases
3815            more responsive. In most cases copying the data to the sqlite
3816            database takes so long that using sqlite doesn't have enough
3817            advantages.
3818    
3819            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3820            comments about performance and query the min and max in separate
3821            statements because only that way will indexes be used.
3822            (TransientTableBase.UniqueValues): Add some comments about
3823            performance.
3824            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3825            Do not copy the data to the transient DB but use the transient
3826            copy if it exists. See the new comments for the performance trade
3827            offs
3828    
3829            * test/test_transientdb.py
3830            (TestTransientTable.test_auto_transient_table): Make sure that the
3831            data is copied to the transient database at some point.
3832    
3833    2003-11-03  Bernhard Herzog  <[email protected]>
3834    
3835            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
3836            globals to locals so that it's a bit faster
3837    
3838    2003-11-03  Bernhard Herzog  <[email protected]>
3839    
3840            * Thuban/UI/baserenderer.py
3841            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
3842            method. ReadValue is faster than ReadRowAsDict since it only reads
3843            one cell especially now that the dbf file objects actually
3844            implement it.
3845    
3846            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
3847            read_attribute method of the dbf objects
3848    
3849    2003-11-03  Bernhard Herzog  <[email protected]>
3850    
3851            * Extensions/profiling/profiling.py (popup_dialog_box): New config
3852            variable to indicate whether the result should be shown in a
3853            dialog box
3854            (profile_screen_renderer, time_screen_renderer): Only show a
3855            dialog box if popup_dialog_box is true.
3856            (profile_screen_renderer): Flush stdout after the printing the
3857            first part of the "profiling..." message
3858    
3859            * Thuban/UI/baserenderer.py
3860            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
3861            brushes for the groups so that they're not created over and over
3862            again
3863    
3864            * Thuban/Model/classification.py (Classification.__getattr__)
3865            (Classification._compile_classification)
3866            (Classification._clear_compiled_classification): New. Methods to
3867            manage a 'compiled' representation of the classification groups
3868            which is created on demand
3869            (Classification.InsertGroup, Classification.RemoveGroup)
3870            (Classification.ReplaceGroup): reset the compiled representation
3871            (Classification.FindGroup): Use the compiled representation to
3872            find the matching group
3873            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
3874    
3875    2003-10-31  Bernhard Herzog  <[email protected]>
3876    
3877            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
3878            Send a CLASS_CHANGED message
3879            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
3880            not return the removed group since it wasn't used.
3881    
3882            * test/test_classification.py
3883            (TestClassification.test_set_default_group): New. Test the
3884            SetDefaultGroup method
3885            (TestClassification.test_insert_group): New. Test the InsertGroup
3886            method
3887            (TestClassification.test_remove_group): New. Test the RemoveGroup
3888            method
3889            (TestClassification.test_replace_group): New. Test the
3890            ReplaceGroup method
3891    
3892    2003-10-31  Bernhard Herzog  <[email protected]>
3893    
3894            * test/test_classification.py (TestClassification.setUp):
3895            Subscribe to the CLASS_CHANGED messages
3896            (TestClassification.tearDown): New. Destroy the classification
3897            properly
3898            (TestClassification.test_defaults): Add tests for the default line
3899            width and whether no messages were sent yet
3900            (TestClassification.test_set_default_properties): Add tests for
3901            messages and setting the default line width
3902            (TestClassification.test_add_singleton)
3903            (TestClassification.test_add_range)
3904            (TestClassification.test_multiple_groups): Add tests for messages
3905    
3906    2003-10-31  Bernhard Herzog  <[email protected]>
3907    
3908            Some more refactoring in preparation for new tests:
3909    
3910            * test/test_classification.py (TestClassification.setUp): New.
3911            Instantiate the classification here. Update the test methods
3912            accordingly.
3913            (TestClassification.test_multiple_groups): Make sure that the two
3914            singletons matching 1 are considered different.
3915    
3916    2003-10-31  Bernhard Herzog  <[email protected]>
3917    
3918            * test/test_classification.py (red, green, blue): New. These
3919            constants were used in several cases. Update the relevant methods.
3920            (TestClassification.test_defaults)
3921            (TestClassification.test_set_default_properties)
3922            (TestClassification.test_add_singleton)
3923            (TestClassification.test_add_range)
3924            (TestClassification.test_multiple_groups)
3925            (TestClassification.test_deepcopy): New. These were formerly all
3926            part of the single method test.
3927            (TestClassification.test_deepcopy): Removed.
3928            (TestClassIterator): Removed. The test case is now a method of
3929            TestClassification since it tests part of the public interface of
3930            Classification
3931            (TestClassification.test_iterator): New. Used to be
3932            TestClassIterator effectively
3933    
3934    2003-10-31  Jan-Oliver Wagner <[email protected]>
3935    
3936            GUIfied the functions of the profiling extension.
3937    
3938            * /Extensions/profiling/__init__.py: New: Init to make this
3939            directory a package.
3940    
3941            * Extensions/profiling/profiling.py: Moved menu entries to
3942            the Extensions menu. Applied _() for strings.
3943            (profile_screen_renderer): Catch the detailed printout and present
3944            it in a dialog.
3945            (time_screen_renderer): Raise a dialog to present the result instead
3946            of printing it to stdout.
3947    
3948    2003-10-31  Bernhard Herzog  <[email protected]>
3949    
3950            * test/test_classification.py (TestClassGroupProperties)
3951            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3952            (TestClassGroupSingleton, TestClassIterator, TestClassification):
3953            Split TestClassification into several classes, one for each class
3954            being tested. TestClassification itself now only tests
3955            Classification. This split makes changes to the tests a bit easier
3956    
3957    2003-10-31  Bernhard Herzog  <[email protected]>
3958    
3959            * Extensions/profiling/profiling.py: New. Extension to measure
3960            Thuban performance
3961    
3962    2003-10-31  Frank Koormann <[email protected]>
3963    
3964            Added two items to legend popup menu: Remove Layer and Show Layer Table
3965    
3966            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3967            LegendPanel._OnShowTable): New event handlers, call the corresponding
3968            mainwindow methods.
3969            (LegendTree._OnRightClick): Added items to popup menu.
3970    
3971    2003-10-30  Bernhard Herzog  <[email protected]>
3972    
3973            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3974            EVT_WINDOW_DESTROY
3975            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3976            nothing but is convenient for the derived classes.
3977    
3978            * Thuban/UI/tableview.py
3979            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3980            Unsubscribe the messages here not in OnClose because that might
3981            get called multiple times. Fixes RT #2196
3982            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3983            anymore.
3984    
3985            * README: Update the minimum requirement for wxPython. Since we
3986            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3987            the version in which that was introduced for all platforms
3988    
3989    2003-10-30  Frank Koormann <[email protected]>
3990    
3991            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3992            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3993            frame.
3994    
3995    2003-10-30  Jan-Oliver Wagner <[email protected]>
3996    
3997            Improved APR import extension, added further EPSG definitions
3998            and some cleanup regarding string class.
3999    
4000            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4001            Added test for alias 'longlat'.
4002    
4003            * Resources/Projections/epsg-deprecated.proj: New. Contains
4004            deprecated EPSG definitions.
4005    
4006            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4007            the variable names for objects.
4008    
4009            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4010            Copied from importAPR and provided with documentation.
4011    
4012            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4013            Moved to apr.py.
4014            (APR_View): Added object ref 'ITheme'.
4015    
4016            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4017            split function by corresponding use of the string class method.
4018    
4019            * Thuban/Model/xmlwriter.py: Replaced string replace function by
4020            corresponding string method.
4021    
4022    2003-10-29  Bernhard Herzog  <[email protected]>
4023    
4024            * Thuban/UI/baserenderer.py
4025            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4026            special case of a classification that only has the default group
4027    
4028    2003-10-27  Bernhard Herzog  <[email protected]>
4029    
4030            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4031    
4032            * po/de.po: Update.
4033    
4034            * Thuban/UI/application.py
4035            (ThubanApplication.ShowExceptionDialog): Handle translation of the
4036            dialog message properly
4037    
4038    2003-10-27  Bernhard Herzog  <[email protected]>
4039    
4040            Rework how localization works so that we use wx's translation
4041            functions when running Thuban as a normal application but not when
4042            we don't need any UI, such as in the test suite. See the comment
4043            in Thuban/__init__.py for details
4044    
4045            * Thuban/__init__.py (_): Add one level of indirection to make the
4046            translation handling more flexible and to make it possible to use
4047            either wx's translation services or not.
4048            (gettext_identity, translation_function_installed)
4049            (install_translation_function): New function to help with this
4050    
4051            * Thuban/UI/__init__.py: Install the wx specific translation
4052            function if it's OK to do that
4053    
4054            * test/support.py (initthuban): Install a dummy translation
4055            function so that importing Thuban.UI doesn't install a wx specific
4056            one for which would need to import wxPython
4057    
4058    2003-10-27  Bernhard Herzog  <[email protected]>
4059    
4060            * HOWTO-Release: Source archives should be created first and the
4061            binary packages should be created from the source archives.
4062            There's an official debian package now so there's no need to test
4063            the rpm on debian anymore
4064    
4065    2003-10-27  Bernhard Herzog  <[email protected]>
4066    
4067            Several rendering changes:
4068    
4069             - Render the selection into a separate bitmap so that only that
4070               bitmap needs to be redrawn when the selection changes
4071    
4072             - Render incrementally showing previews and allowing interaction
4073               before rendering is complete
4074    
4075             - Update the renderer interface a bit. Most parameters of
4076               RenderMap are now parameters of the constructor
4077    
4078            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4079            and the update region as parameters. Update the doc-string
4080            (BaseRenderer.render_map_incrementally): New. Generator function
4081            to renders the map incrementally
4082            (BaseRenderer.render_map): Remove the map argument (it's now in
4083            the constructor) and simply iterate over the
4084            render_map_incrementally generator to draw the map.
4085            (BaseRenderer.draw_shape_layer_incrementally)
4086            (BaseRenderer.draw_shape_layer): Renamed to
4087            draw_shape_layer_incrementally and changed into a generator that
4088            yields True every 500 shapes. Used by render_map_incrementally to
4089            render shape layers incrementally
4090    
4091            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4092            map and region parameters which are now in the constructor
4093            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4094            the inherited render_map_incrementally.
4095            (BaseRenderer.draw_shape_layer): Removed.
4096            (ScreenRenderer.draw_selection_incrementally): New. The selection
4097            drawing part of the removed draw_shape_layer as a generator
4098            (ScreenRenderer.layer_shapes): Update because of the region
4099            parameter change
4100            (ExportRenderer.__init__): New. Extend the inherited constructor
4101            with the destination region for the drawing
4102            (ExportRenderer.RenderMap): Removed the map and region parameters
4103            which are now in the constructor
4104    
4105            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4106            bitmap suitable for a preview in a tool
4107            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4108            bitmap
4109            (MapPrintout.draw_on_dc): Adapt to new renderer interface
4110            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4111            exists
4112            (MapCanvas.OnIdle): Update the logic to deal with incremental
4113            rendering and the selection bitmap
4114            (MapCanvas._do_redraw): Handle the instantiation of the render
4115            iterator and the redraws during rendering
4116            (MapCanvas._render_iterator): New. Generator to incrementally
4117            redraw both bitmaps
4118            (MapCanvas.Export): Adapt to new renderer interface.
4119            (MapCanvas.full_redraw): Reset the selection bitmap and the
4120            renderer iterator too
4121            (MapCanvas.redraw_selection): New. Force a redraw of the selection
4122            bitmap
4123            (MapCanvas.shape_selected): Only redraw the selection bitmap
4124    
4125            * test/test_baserenderer.py
4126            (TestBaseRenderer.test_polygon_no_projection)
4127            (TestBaseRenderer.test_raster_no_projection)
4128            (TestBaseRenderer.test_point_map_projection)
4129            (TestBaseRenderer.test_point_layer_and_map_projection)
4130            (TestBaseRenderer.test_point_layer_projection)
4131            (TestBaseRenderer.test_point_with_classification): Adapt to new
4132            renderer interface
4133    
4134    2003-10-24  Bernhard Herzog  <[email protected]>
4135    
4136            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4137            (point_in_polygon_shape, shape_centroid): Raise an exception if
4138            the shape can't be read. Previously invalid shape ids would lead
4139            to a segfault.
4140    
4141            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4142            New. test whether an exception is raised for invalid shape ids
4143    
4144    2003-10-24  Jan-Oliver Wagner <[email protected]>
4145    
4146            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4147            as alias for 'latlong'.
4148    
4149            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4150            as alias for 'latlong'.
4151    
4152    2003-10-24  Jan-Oliver Wagner <[email protected]>
4153    
4154            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4155            the projection even for the UnknownPanel.
4156            (UnknownProjPanel.__init__): Define the text and create the textctrl
4157            widget.
4158            (UnknownProjPanel._DoLayout): Replaced static text widget by the
4159            textctrl created in __init__.
4160            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4161            including the parameters of the projection.
4162            
4163    2003-10-24  Jan-Oliver Wagner <[email protected]>
4164    
4165            * Resources/Projections/epsg.proj: New. This is a list of
4166            EPSG codes with parameters for proj. The list has been
4167            generated using devtools/create_epsg.py based on the
4168            file nad/epsg of the proj 4.4.7 package. Four projection
4169            definitions have been deleted as they are not accepted by proj:
4170            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4171            and "HD72 / EOV".
4172    
4173    2003-10-22  Bernhard Herzog  <[email protected]>
4174    
4175            Some more tweaks to the projection dialog which should fix RT
4176            #1886.
4177    
4178            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4179            the ProjFile's messages and call the base class methods correctly
4180            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4181            flag on the newly selected item too. Otherwise some other item is
4182            focused and the first time the focus is moved with the keyboard
4183            the selection moves in unexpected ways.
4184    
4185            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4186            focus on the OK button, only on the projection list. That way the
4187            list really has the focus initially
4188            (ProjFrame.OnClose): Call the projection list's Destroy method to
4189            make it unsubscribe all messages
4190    
4191    2003-10-21  Bernhard Herzog  <[email protected]>
4192    
4193            Rework the projection dialog to fix a few bugs, including RT 2166
4194            and most of 2168
4195    
4196            * Thuban/UI/projlist.py: New. The class ProjectionList is a
4197            special wxListCtrl to show a list of projections in a more MVC
4198            fashion
4199    
4200            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4201            throughout the class. The main change is to use the ProjectionList
4202            class instead of a normal wxListBox. Also, add an explicit
4203            "Unknown" projection to the projection choice control.
4204            (ProjPanel.__init__): Add an "unknown" ellipsoid
4205            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4206            instantiation of the panel's controls to make the tab-order more
4207            natural
4208    
4209    2003-10-21  Bernhard Herzog  <[email protected]>
4210    
4211            * test/test_load.py (TestSingleLayer.file_contents)
4212            (TestSingleLayer.test): Add non-ascii characters to the titles of
4213            session, map and layer. This is effectively a port of the
4214            TestUnicodeStrings test in test_load_0_8.py which for some reason
4215            was only added there.
4216    
4217            * test/test_load_0_9.py (TestSingleLayer.file_contents)
4218            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4219            characters to the titles of session, map and layer,.
4220    
4221    2003-10-21  Bernhard Herzog  <[email protected]>
4222    
4223            Add EPSG projection handling to .thuban files
4224    
4225            * test/test_save.py (SaveSessionTest.dtd)
4226            (SaveSessionTest.testEmptySession)
4227            (SaveSessionTest.testLayerProjection)
4228            (SaveSessionTest.testRasterLayer)
4229            (SaveSessionTest.testClassifiedLayer)
4230            (SaveSessionTest.test_dbf_table)
4231            (SaveSessionTest.test_joined_table)
4232            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4233            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4234            use a and epsg projection to test saving them
4235    
4236            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4237            namespace
4238            (TestLayerVisibility.file_contents, TestLabels.file_contents)
4239            (TestLayerProjection.file_contents)
4240            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4241            (TestPostGISLayer.file_contents)
4242            (TestPostGISLayerPassword.file_contents)
4243            (TestLoadError.file_contents, TestLoadError.test): Update to use
4244            1.0-dev namespace
4245            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4246            use 1.0-dev namespace and use an EPSG projection to test whether
4247            loading it works
4248    
4249            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4250            as of Thuban 0.9. These are now tests to determine whether Thuban
4251            can still read files generated by Thuban 0.9
4252    
4253            * Thuban/Model/save.py (SessionSaver.write)
4254            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4255            namespace
4256            (SessionSaver.write_projection): Write the projection's epsg
4257            attribute
4258    
4259            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4260            thuban-1.0-dev.dtd namespace
4261            (SessionLoader.check_attrs): Allow a callable object as conversion
4262            too
4263            (SessionLoader.start_projection, SessionLoader.end_projection)
4264            (SessionLoader.start_parameter): Handle the epsg attribute and
4265            rename a few instance variables to lower case
4266    
4267            * Resources/XML/thuban-1.0.dtd: New. Only difference to
4268            thuban-0.9.dtd is the epsg attribute for projections.
4269    
4270    2003-10-21  Bernhard Herzog  <[email protected]>
4271    
4272            * test/runtests.py (main): Let the user specify which tests to run
4273            on the command line
4274    
4275            * test/support.py (ThubanTestResult.getDescription): Override to
4276            give a better short description. The description can be used as a
4277            parameter to run_tests to run that particular test in isolation.
4278    
4279    2003-10-21  Frank Koormann   <[email protected]>
4280    
4281            Popup menu for legend. Scheduled for the 1.2 release this was too
4282            simple to implement: The popup menu is bound to the legend tree, while
4283            the events are hanlded by its anchestor, the legend panel. This
4284            allows reuse of all the event handlers already implemented for the
4285            legend toolbar buttons.
4286    
4287            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4288            to add handlers for the events issued by the popup menu.
4289            (LegendPanel._OnToggleVisibility): Handler for toggling layer
4290            visibility event
4291            (LegendPanel._OnProjection): Handler for layer projection event.
4292            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4293            (LegendTree._OnRightClick): Event handler for right click, select item
4294            and pop up menu.
4295            (LegendTree.ToggleVisibility): Toggle layer visibility
4296            (LegendTree.LayerProjection): Raise layer projection dialog for
4297            current layer.
4298    
4299    2003-10-21  Bernhard Herzog  <[email protected]>
4300    
4301            * Resources/Projections/defaults.proj: Use correct DOCTYPE
4302            declaration. The top-level element is projectionlist not projfile
4303    
4304    2003-10-20  Bernhard Herzog  <[email protected]>
4305    
4306            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4307            method to write a projfile and display a busy cursor and error
4308            dialogs.
4309            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4310            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4311            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4312            busy cursor while loading the user and system prj files.
4313    
4314    2003-10-16  Bernhard Herzog  <[email protected]>
4315    
4316            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4317            ProjFile objects
4318            (clear_proj_file_cache): New function to clear the cache. Mainly
4319            useful for use by the test suite
4320            (read_proj_file): Use the cache.
4321    
4322            * test/test_proj.py (TestProjFile): Clarify the doc-string
4323            (ProjFileReadTests): Update doc-string
4324            (ProjFileReadTests.test_get_system_proj_file): Check whether the
4325            system proj files is cached.
4326            (ProjFileLoadTestCase): New base class for the proj file tests
4327            derived from support.FileLoadTestCase to provide some common
4328            behavior.
4329            (TestLoadingProjFile)
4330            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4331            (TestProjFileWithInvalidParameters.file_contents): Derive from
4332            ProjFileLoadTestCase
4333            (TestLoadingProjFile.test_caching): New. Test whether the cache
4334            works
4335    
4336    2003-10-16      Silke Reimer    <[email protected]>
4337    
4338            * debian/*: New directory with configuration files for building a thuban
4339              deb-package.
4340    
4341    2003-10-14  Bernhard Herzog  <[email protected]>
4342    
4343            * test/test_proj.py: Execute support.run_tests when run as
4344            __main__ so that missing unsubscribes are detected
4345            (TestProjFile.tearDown): Destroy the proj_file properly
4346    
4347    2003-10-14  Bernhard Herzog  <[email protected]>
4348    
4349            * Thuban/Model/messages.py (PROJECTION_ADDED)
4350            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4351            the ProjFile objects
4352    
4353            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4354            easily send messages when the projections change
4355            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4356            when the change was successful
4357    
4358            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4359            proj file messages
4360            (TestProjFile.test_add_remove)
4361            (TestProjFile.test_remove_non_existing)
4362            (TestProjFile.test_replace)
4363            (TestProjFile.test_replace_non_existing): Test whether the right
4364            messages are sent
4365    
4366    2003-10-14  Bernhard Herzog  <[email protected]>
4367    
4368            * test/test_proj.py (TestProjFile.test): Refactor into several
4369            tests
4370            (TestProjFile.test_add_remove)
4371            (TestProjFile.test_remove_non_existing)
4372            (TestProjFile.test_replace)
4373            (TestProjFile.test_replace_non_existing): Some of the new
4374            individual test cases
4375            (TestProjFileSimple): New class for the rest of the test cases
4376            that came out of the refactoring
4377            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4378            derived classes don't have to
4379    
4380    2003-10-13  Bernhard Herzog  <[email protected]>
4381    
4382            Add an optional EPSG code to the projection objects and extend the
4383            .proj file format accordingly.
4384    
4385            * Resources/XML/projfile.dtd (element projection): Add epsg
4386            attribute
4387    
4388            * Thuban/Model/proj.py (Projection.__init__): New parameter and
4389            instance variable epsg. Update doc-string
4390            (Projection.EPSGCode, Projection.Label): New methods to provide
4391            access to EPSG code and a label for use in dialogs
4392    
4393            * Thuban/Model/resource.py (ProjFileReader.start_projection)
4394            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4395            Handle the epsg code attribute when reading or writing proj files
4396    
4397            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4398            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4399            (ProjFrame.__FillAvailList): Use the projection's Label method to
4400            get the string for the list box
4401    
4402            * test/test_proj.py (TestProjection.test_label)
4403            (TestProjection.test_label_epsg)
4404            (TestProjection.test_epsgcode_for_non_epsg_projection)
4405            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4406            for the label and EPSGCode methods
4407            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4408            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4409            objects in the test cases and put the expected contents into the
4410            test case methods too. Update doTestWrite accordingly
4411            (TestLoadingProjFile)
4412            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4413            read tests from TestProjFile.
4414            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4415            tests are now in the new classes.
4416            (sample_projfile, sample_projfile_data)
4417            (sample_projfile2, sample_projfile_data2): Removed. Not used
4418            anymore.
4419            (TestProjFile.test_read_unreadable_file): No need to reset the
4420            permissions at the end anymore since we use a unique filename
4421    
4422    2003-10-13  Bernhard Herzog  <[email protected]>
4423    
4424            * test/test_proj.py: Some more refactoring of the test cases
4425            (ProjFileTest): New base class for the proj file tests.
4426            (TestProjFile): Derive from ProjFileTest
4427            (TestProjFile.test_read_unreadable_file)
4428            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4429            the new filename method to get a unique filename
4430            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4431            (WriteProjFileTests): New class for proj file write tests.
4432            Contains the write test that were in TestProjFile originally.
4433    
4434    2003-10-13  Bernhard Herzog  <[email protected]>
4435    
4436            * test/test_proj.py (TestProjFile.testRead)
4437            (TestProjFile.test_read_non_existing_file)
4438            (TestProjFile.test_read_unreadable_file)
4439            (TestProjFile.test_read_empty_file): Split into several methods.
4440    
4441    2003-10-10  Bernhard Herzog  <[email protected]>
4442    
4443            * Thuban/UI/sizers.py: New file with custom sizers.
4444    
4445            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4446            all projection type specific panels and put them into a
4447            NotebookLikeSizer. This way the dialog doesn't change its size
4448            when a different projection is selected
4449            (ProjFrame.__init__): Rename projection_panels
4450            projection_panel_defs and reuse projection_panels for a list of
4451            the instantiated panels.
4452            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4453            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4454            the panels
4455            (UnknownProjPanel._DoLayout): Place the newlines in the message
4456            differently to make the panel narrower.
4457            (TMPanel._DoLayout): Layout the parameters in one column.
4458    
4459    2003-10-10  Bernhard Herzog  <[email protected]>
4460    
4461            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4462            that contains all the setup for the dialog's widgets, layout and
4463            event handling.
4464            (__): Call build_dialog to build the dialog.
4465            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4466            Their functionality is now in build_dialog
4467            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4468            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4469            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4470            different widget names and hierarchy introduced with build_dialog.
4471    
4472    2003-10-10  Bernhard Herzog  <[email protected]>
4473    
4474            * README: Fix typo.
4475    
4476    2003-10-09  Bernhard Herzog  <[email protected]>
4477    
4478            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4479            projection is already in the list. This is *a lot* faster when
4480            loading files with hundreds of projections since it saves a linear
4481            search. OTOH this will allow adding the same projection to the
4482            user.proj file multiple times in the projection dialog but we'll
4483            deal with that later
4484    
4485    2003-10-09  Jan-Oliver Wagner <[email protected]>
4486    
4487            * devtools: New. Directory for developer tools that are not intended
4488            for the regular user.
4489    
4490            * devtools/create_epsg.py: New. Convert the epsg file of proj into
4491            a python .proj file.
4492    
4493    2003-10-09  Bernhard Herzog  <[email protected]>
4494    
4495            * test/test_proj.py
4496            (TestProjection.test_get_parameter_without_equals_sign): New. Test
4497            whether GetParameter handles parameters without "=" sign correctly
4498    
4499            * Thuban/Model/proj.py (Projection.GetParameter): Handle
4500            parameters that do not contain a "=". Update the doc-string
4501    
4502    2003-10-08  Bernhard Herzog  <[email protected]>
4503    
4504            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4505            length limit on the projname text control
4506    
4507    2003-10-08  Bernhard Herzog  <[email protected]>
4508    
4509            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4510            (TestProjection.test_get_projection_units_normal): New. Tests for
4511            the Projection.GetProjectedUnits method
4512    
4513    2003-10-08  Jan-Oliver Wagner <[email protected]>
4514    
4515            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4516            Added missing 'val' parameter.
4517    
4518    2003-10-08  Bernhard Herzog  <[email protected]>
4519    
4520            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4521            projection type of the currently selected projection is not known,
4522            i.e. there's no panel for it, use the UnknownProjPanel
4523            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4524            the actual replacing of the proj panel into the new method
4525            _show_proj_panel.
4526            (UnknownProjPanel): Add doc-string.
4527            (UnknownProjPanel._DoLayout): Insert a newline into the text so
4528            that the panel is not so wide.
4529    
4530    2003-10-08  Bernhard Herzog  <[email protected]>
4531    
4532            * Thuban/Model/resource.py (read_proj_file): Return the warnings
4533            too. Update the doc-string
4534            (get_proj_files): Removed. It wasn't used anywhere
4535            (get_system_proj_files, get_system_proj_file): Rename to
4536            get_system_proj_file and return the ProjFile object and not a list
4537            of ProjFile objects. Update the callers.
4538            (get_user_proj_files, get_user_proj_file): Rename to
4539            get_user_proj_file return the ProjFile object and not a list of
4540            ProjFile objects. Update the callers.
4541            (ProjFileReader.__init__): New instance variable for the warnings.
4542            Rename the __pf ivar to projfile. Update the methods referring to
4543            __pf
4544            (ProjFileReader.end_projection): Catch any errors raised when
4545            instantiating the projection and record that as an error. The
4546            projection will not be in the final ProjFile object.
4547            (ProjFileReader.GetWarnings): New method to return the warnings.
4548    
4549            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4550            show the warnings from the projfile reader
4551            (ProjFrame._OnImport): Deal with any warnings returned by
4552            read_proj_file
4553            (ProjFrame.__FillAvailList): Deal with any warnings returned by
4554            get_system_proj_file or get_user_proj_file.
4555    
4556            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4557            (TestProjFileWithInvalidParameters.file_contents): New test cases
4558            to test whether read_proj_file handles invalid projection
4559            parameters correctly
4560            (TestProjFile.test_get_system_proj_file): New. Simple test for
4561            resource.get_system_proj_file
4562    
4563    2003-10-07  Bernhard Herzog  <[email protected]>
4564    
4565            * test/test_derivedshapestore.py
4566            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4567            properly so that the temporary directories get deleted correctly
4568    
4569    2003-10-06  Bernhard Herzog  <[email protected]>
4570    
4571            Handle the title changes in a proper MVC way.
4572    
4573            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4574            canvas' TITLE_CHANGED messages
4575            (MainWindow.update_title): New. Update the main window's title
4576            (MainWindow.__SetTitle): Removed. Use update_title instead.
4577            (MainWindow.SetMap): Use update_title instead of __SetTitle
4578            (MainWindow.RenameMap): Do change the window title explicitly
4579            here. That's handled in a proper MVC way now.
4580            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4581            messages
4582    
4583            * Thuban/Lib/connector.py (Conduit): New class to help classes
4584            that forward messages
4585    
4586            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4587            (ViewPort): Derive from Conduit instead of Publisher
4588            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4589            when calling the inherited versions
4590            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4591            methods to subscribe and unsubscribe map messages
4592            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4593            handle the map subscriptions
4594            (ViewPort.Map, ViewPort.map_projection_changed)
4595            (ViewPort.layer_projection_changed): Add or update doc-strings
4596    
4597            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4598            typo
4599            (MyConduit): Helper class for the Conduit test.
4600            (TestConduit): Test cases for Conduit
4601    
4602            * test/test_connector.py: Use support.run_tests as main.
4603    
4604            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4605            the TITLE_CHANGED messages
4606            (ViewPortTest.test_forwarding_title_changed): New test to check
4607            whether the viewport forwards the map's TITLE_CHANGED messages
4608            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4609            after the port's because the latter may require a still functional
4610            map.
4611    
4612    2003-10-06  Bernhard Herzog  <[email protected]>
4613    
4614            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4615            doc-string
4616    
4617    2003-10-06  Bernhard Herzog  <[email protected]>
4618    
4619            * test/test_viewport.py (ViewPortTest.setUp)
4620            (SimpleViewPortTest.test_init_with_size): Move the test for the
4621            initial size as a constructor parameter from ViewPortTest.setUp
4622            method to a new separate test in SimpleViewPortTest.
4623    
4624    2003-10-06  Bernhard Herzog  <[email protected]>
4625    
4626            * test/test_viewport.py (MockView): New class derived from
4627            ViewPort with a mock implementation of GetTextExtent to be used in
4628            the test cases
4629            (ViewPortTest.setUp): Use MockView instead of ViewPort
4630    
4631            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4632            into what would be a "pure virtual function" in C++: always raise
4633            NotImplementedError. Mock implementations for test cases don't
4634            belong into the real code
4635    
4636    2003-10-02  Bernhard Herzog  <[email protected]>
4637    
4638            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4639            close the dbf file we create so that it's contents have been
4640            written properly.
4641    
4642            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4643            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4644            Update to shapelib 1.2.10
4645    
4646    2003-10-01  Jan-Oliver Wagner <[email protected]>
4647    
4648            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4649            it annoys lintian which warns about these files not being
4650            executable. The #! isn't necessary here since if you absolutely
4651            must execute them you can always say "python <filename>".
4652    
4653    2003-09-26  Bernhard Herzog  <[email protected]>
4654    
4655            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4656            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4657            is ported to a newer the import will fail, so it should be noticed
4658            immediately that this function is gone.
4659            Fixes RT#1919
4660    
4661    2003-09-26  Bernhard Herzog  <[email protected]>
4662    
4663            Add a DTD for the projection files and make thuban write valid
4664            projection files
4665    
4666            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4667            files
4668    
4669            * Thuban/Model/resource.py (ProjFileSaver.write): Use
4670            'projectionlist' as the name in the document type declaration so
4671            that it matches the element type of the root element.
4672    
4673            * test/test_proj.py (sample_projfile, sample_projfile2): Use
4674            'projectionlist' as the name in the document type declaration just
4675            as it is done now in the files thuban would write
4676            (sample_projfile, sample_projfile_data): Fix spelling of
4677            "Mercator"
4678            (TestProjFile.doTestWrite): Validate the written and the expected
4679            XML data
4680            (TestProjFile): Derive from ValidationTest so that we can run xml
4681            validation tests
4682    
4683    2003-09-24  Bernhard Herzog  <[email protected]>
4684    
4685            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4686            modify the list returned by map.Layers() in place since it is the
4687            actual list of layers used by the map.
4688    
4689    2003-09-23  Jan-Oliver Wagner <[email protected]>
4690    
4691            * Doc/manual/thuban-manual.xml: Added subsection to chapter
4692            Extensions to describe the extensions coming with the Thuban
4693            standard package (gns2shp and importAPR).
4694    
4695    2003-09-23  Bernhard Herzog  <[email protected]>
4696    
4697            * libraries/thuban/wxproj.cpp (project_point): if there's an
4698            inverse but no forward projection, convert to degrees after
4699            applying the inverse projection. Fixes RT#2096
4700    
4701            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4702            implicitly tests for the fix to RT#2096
4703    
4704            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4705            Check that the sequences have the same lengths
4706    
4707            * Resources/Projections/defaults.proj (Geographic projection): Use
4708            a much more precise value for the to_meter attribute.
4709    
4710    2003-09-22  Bernhard Herzog  <[email protected]>
4711    
4712            * test/support.py (initthuban): Make sure to unset the LANG env.
4713            var. so that tests that compare translated strings work. Solves RT
4714            #2094
4715    
4716    2003-09-22  Jan-Oliver Wagner <[email protected]>
4717    
4718            Small improvement of APR import.
4719    
4720            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4721            Added tests for text-ranges.
4722    
4723            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4724            returns a string object if the range is based on text.
4725    
4726            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4727            range retrieval.
4728    
4729    2003-09-22  Jan-Oliver Wagner <[email protected]>
4730    
4731            Initial version of the importAPR extension which is in
4732            experimental state.
4733    
4734            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4735            /Extensions/importAPR/test/: New directories.
4736    
4737            * /Extensions/importAPR/samples/README: New: Howto load the samples.
4738    
4739            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4740            file which refers to the Thuban Iceland demo data.
4741    
4742            * /Extensions/importAPR/test/README: New: Howto execute the tests.
4743    
4744            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4745    
4746            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4747            as in '.apr'-files.
4748    
4749            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4750            ODB Objects as in '.apr', '.avl' and other files.
4751    
4752            * /Extensions/importAPR/__init__.py: New: Init to make this
4753            directory a package.
4754    
4755            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4756            project file (.apr) and convert it to Thuban.
4757    
4758    2003-09-22  Jan-Oliver Wagner <[email protected]>
4759    
4760            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4761    
4762    2003-09-19  Jan-Oliver Wagner <[email protected]>
4763    
4764            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4765            with description on RPM installation and RPM binary package
4766            creation.
4767    
4768    2003-09-18  Bernhard Herzog  <[email protected]>
4769    
4770            * setup.py (data_files): Only add the mo files if the Locales
4771            directory actually exists, so that setup.py works with a fresh CVS
4772            checkout
4773    
4774    2003-09-12  Jan-Oliver Wagner <[email protected]>
4775    
4776            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4777            in viewport, not anymore in view
4778    
4779    2003-09-04  Jan-Oliver Wagner <[email protected]>
4780    
4781            Introducing first Extension (gns2shp).
4782    
4783            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4784    
4785            * Extensions/__init__.py: New. init to make this dir a package.
4786    
4787            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4788    
4789            * Extensions/gns2shp/test/README: New. some info on this test directory.
4790    
4791            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4792    
4793            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4794            of Shapefile from GNS text file format
4795    
4796    2003-09-03  Jan-Oliver Wagner <[email protected]>
4797    
4798            Fix/workaround for bug #2019:
4799            https://intevation.de/rt/webrt?serial_num=2019
4800    
4801            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4802            (IdentifyView.__init__): Added another button that allows to
4803            stop the identify mode.
4804            (IdentifyView.OnStop): New. Stops the identify mode.
4805    
4806    2003-09-03  Jan-Oliver Wagner <[email protected]>
4807    
4808            Introducing a new exception dialog that allows to exit the
4809            application immediately.
4810            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4811    
4812            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4813    
4814            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4815            Made strings available to translations. Exchanged the simple
4816            ScrolledMessageDialog by the new ExceptionDialog.
4817    
4818    2003-09-01  Bernhard Herzog  <[email protected]>
4819    
4820            * NEWS: New. Summary of changes and release notes.
4821    
4822            * MANIFEST.in: Add NEWS
4823    
4824    2003-09-01  Bernhard Herzog  <[email protected]>
4825    
4826            * MANIFEST.in: Correct the include statement for the mo-files and
4827            include the documentation too.
4828    
4829            * setup.py (data_files): Add the .mo files
4830            (setup call): Up to version 0.9.0
4831    
4832    2003-09-01  Bernhard Herzog  <[email protected]>
4833    
4834            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4835            parameter list to just parent and session
4836            (ChooseDBTableDialog.__set_properties): Removed. Setting the
4837            selection of empty list boxes is not allowed (and produces C++
4838            assertion errors) and the rest of the setup is better done in
4839            __init__ anyway.
4840            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
4841            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
4842            builtins True/False for booleans to avoid warnings from wxPython
4843    
4844            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
4845            ChooseDBTableDialog constructor parameters.
4846    
4847    2003-09-01  Bernhard Herzog  <[email protected]>
4848    
4849            * Thuban/Model/postgisdb.py
4850            (PostGISTable): Extend doc-string
4851            (PostGISTable._fetch_table_information): Set the column index
4852            correctly, pretending ignored columns don't exist.
4853    
4854            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
4855            for postgis tables with data types not yet supported by thuban.
4856    
4857    2003-08-29  Bernhard Herzog  <[email protected]>
4858    
4859            * HOWTO-Release: Tweak item about running the tests.
4860    
4861    2003-08-29  Jan-Oliver Wagner <[email protected]>
4862    
4863            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
4864    
4865    2003-08-29  Bernhard Herzog  <[email protected]>
4866    
4867            Add some missing parameters to projections. Proj complains about
4868            them on windows but for some reason not on Linux.
4869    
4870            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
4871            missing required projection parameters
4872    
4873            * test/test_proj.py (TestProjFile.test): Add missing required
4874            projection parameters
4875    
4876            * test/test_load_0_8.py (TestLayerProjection.file_contents)
4877            (TestLayerProjection.test): Add missing required projection
4878            parameters and tests for them
4879    
4880            * test/test_load.py (TestLayerProjection.file_contents)
4881            (TestLayerProjection.test): Add missing required projection
4882            parameters and tests for them
4883    
4884            * test/test_layer.py (TestLayer.test_base_layer): Add missing
4885            required projection parameters
4886    
4887    2003-08-29  Bernhard Herzog  <[email protected]>
4888    
4889            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
4890            access the pj_errno because directly accessing pj_errno doesn't
4891            work on windows if the proj library is in a DLL
4892    
4893            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
4894    
4895    2003-08-28  Bernhard Herzog  <[email protected]>
4896    
4897            * test/test_proj.py: Import things from Thuban after calling
4898            initthuban
4899    
4900            * test/test_load.py (LoadSessionTest.filenames): New class
4901            variable with the filename attributes to normalize
4902            (LoadSessionTest.check_format): Pass self.filenames to
4903            sax_eventlist to normalize the filename attributes
4904    
4905            * test/xmlsupport.py: Add cvs keywords
4906            (SaxEventLister.__init__): New parameter filenames which indicates
4907            attributes that contain filenames
4908            (SaxEventLister.startElementNS): Normalize the filename attributes
4909            with os.path.normpath
4910            (sax_eventlist): New parameter filenames to pass through to
4911            SaxEventLister
4912    
4913            * test/test_derivedshapestore.py: Make this file callable as a
4914            program to execute the tests
4915            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
4916            the session to self.session so that it gets destroyed properly
4917    
4918            * test/test_layer.py (TestLayer.tearDown): Call the session's
4919            Destroy method
4920    
4921            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
4922            too if it exists
4923            (TestMapAddLayer.test_add_layer): Bind the session to self.session
4924            so that it gets destroyed properly
4925    
4926            * test/postgissupport.py (reason_for_not_running_tests): Add a
4927            test for the existence of popen2.Popen4.
4928    
4929            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4930            reliable way to destroy the sessions created in the test cases
4931            (SaveSessionTest.test_dbf_table): Bind the session to self.session
4932            so that it gets destroyed properly
4933            (SaveSessionTest.testLayerProjection): Bind the session to
4934            self.session so that it gets destroyed properly
4935    
4936            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4937            sure that the session is destroyed properly
4938    
4939            * test/test_shapefilestore.py: Make this callable as a program to
4940            execute the tests
4941    
4942            * test/test_scalebar.py: Remove unnecessary import of _ from
4943            Thuban
4944    
4945            * test/support.py (print_garbage_information): Call initthuban
4946            here because it may be called indirectly from test cases that test
4947            test support modules which do not use anything from thuban itself
4948            (ThubanTestProgram.runTests): Remove unnecessary debug print
4949    
4950    2003-08-28  Bernhard Herzog  <[email protected]>
4951    
4952            * Thuban/version.py (longversion): Update to 0.9
4953    
4954            * Thuban/UI/mainwindow.py: Remove some unused imports
4955    
4956            * README: Add section about required additional software. Add date
4957            and revision CVS keywords
4958    
4959            * HOWTO-Release: Add item about the translations. Add date and
4960            revision CVs keywords and change formatting to match README a bit
4961            better
4962    
4963            * po/de.po: Update for 0.9
4964    
4965            * test/README: Tweak the wording a little because many tests are
4966            not really unittest.
4967    
4968    2003-08-27  Bernhard Herzog  <[email protected]>
4969    
4970            As preparation for the 0.9 release, switch thuban files to a
4971            non-dev namespace
4972    
4973            * Thuban/Model/save.py (SessionSaver.write_session): Write files
4974            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4975            namespace
4976    
4977            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4978            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4979    
4980            * test/test_save.py (SaveSessionTest.dtd)
4981            (SaveSessionTest.testEmptySession)
4982            (SaveSessionTest.testSingleLayer)
4983            (SaveSessionTest.testLayerProjection)
4984            (SaveSessionTest.testRasterLayer)
4985            (SaveSessionTest.testClassifiedLayer)
4986            (SaveSessionTest.test_dbf_table)
4987            (SaveSessionTest.test_joined_table)
4988            (SaveSessionTest.test_save_postgis): Update for new namespace
4989    
4990            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4991            (TestLayerVisibility.file_contents, TestLabels.file_contents)
4992            (TestLayerProjection.file_contents)
4993            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4994            (TestPostGISLayer.file_contents)
4995            (TestPostGISLayerPassword.file_contents)
4996            (TestLoadError.file_contents, TestLoadError.test): Update for new
4997            namespace
4998    
4999    2003-08-27  Bernhard Herzog  <[email protected]>
5000    
5001            Make the table interface distinguish between row ids (an integer
5002            that uniquely identifies a row) and row ordinals (a simple row
5003            count from 0 to NumRows() - 1)
5004    
5005            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5006            (PostGISTable.RowOrdinalToId): New methods to conver between row
5007            ids and row ordinals
5008            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5009            parameter row_is_ordinal to indicate whether the row parameter is
5010            the row id or the ordinal
5011    
5012            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5013            (TransientTableBase.RowOrdinalToId)
5014            (AutoTransientTable.RowIdToOrdinal)
5015            (AutoTransientTable.RowOrdinalToId): Same new methods as in
5016            PostGISTable.
5017            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5018            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5019            Same new parameter as in PostGISTable.
5020    
5021            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5022            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5023            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5024            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5025            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5026            parameter as in PostGISTable.
5027    
5028            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5029            (DataTable.RowOrdinalToId): New methods to convert between row ids
5030            and row ordinals.
5031            (TableGrid.SelectRowById): New method to select a row based on its
5032            ID as opposed to its ordinal
5033            (DataTable.GetValue, TableGrid.OnRangeSelect)
5034            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5035            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5036            (LayerTableFrame.__init__): Convert between row ids and row
5037            ordinals as appropriate
5038    
5039            * test/postgissupport.py (PostGISDatabase.__init__): Add
5040            doc-string.
5041            (PostGISDatabase.initdb): The optional third item in a tuple in
5042            tables is now a (key, value) list with additional arguments to
5043            pass to upload_shapefile
5044            (upload_shapefile): New parameter gid_offset to allow gids that
5045            are not the same as the shapeids in the shapefile
5046            (PostgreSQLServer.get_default_static_data_db): Use the new
5047            gid_offset to make the gids in landmarks 1000 higher than the
5048            shapeids in the shapefile
5049    
5050            * test/test_viewport.py
5051            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5052            new shapeids in the landmarks table
5053    
5054            * test/test_transientdb.py
5055            (TestTransientTable.run_iceland_political_tests)
5056            (TestTransientTable.test_transient_joined_table): Add tests for
5057            the new table methods and new keywords arguments.
5058    
5059            * test/test_postgis_db.py
5060            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5061            (TestPostGISTable.test_read_value_row_count_mode)
5062            (TestPostGISTable.test_row_id_to_ordinal)
5063            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5064            table methods and the new arguments
5065            (TestPostGISShapestorePoint.test_shapes_in_region)
5066            (TestPostGISShapestorePoint.test_shape_raw_data)
5067            (TestPostGISShapestorePoint.test_shape_points)
5068            (TestPostGISShapestorePoint.test_shape_shapeid)
5069            (TestPostGISShapestorePoint.test_all_shapes)
5070            (TestPostGISTable.test_simple_query)
5071            (TestPostGISTable.test_simple_query)
5072            (TestPostGISTable.test_simple_query)
5073            (TestPostGISTable.test_read_value)
5074            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5075            shapeids in the landmarks table
5076    
5077            * test/test_memory_table.py
5078            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5079            (TestMemoryTable.test_read_value_row_count_mode)
5080            (TestMemoryTable.test_row_id_to_ordinal)
5081            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5082            table methods and the new arguments
5083    
5084            * test/test_dbf_table.py
5085            (TestDBFTable.test_read_row_as_dict_row_count_mode)
5086            (TestDBFTable.test_read_value_row_count_mode)
5087            (TestDBFTable.test_row_id_to_ordinal)
5088            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5089            methods and the new arguments
5090    
5091    2003-08-26  Bernhard Herzog  <[email protected]>
5092    
5093            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5094            more postgis specific but much faster method to get the bounding
5095            box
5096    
5097    2003-08-26  Bernhard Herzog  <[email protected]>
5098    
5099            * Thuban/Model/postgisdb.py (PostGISTable.Title)
5100            (PostGISShapeStore.AllShapes): Add these missing methods.
5101            (PostGISShapeStore.ShapesInRegion): No need to raise
5102            StopIteration. We can simply return
5103    
5104            * test/test_postgis_db.py (TestPostGISTable.test_title)
5105            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5106            new methods
5107    
5108    2003-08-25  Bernhard Herzog  <[email protected]>
5109    
5110            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5111    
5112            * test/test_postgis_db.py (PolygonTests): New class containing
5113            those tests from TestPostGISShapestorePolygon that can also be
5114            used to test MUTLIPOLYGON tables
5115            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5116            so derive from that
5117            (TestPostGISShapestoreMultiPolygon): New class with tests for
5118            MUTLIPOLYGON tables
5119    
5120            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5121            tables argument to have tuples with three items to override the
5122            WKT type used.
5123            (PostgreSQLServer.get_default_static_data_db): Use the above to
5124            create a polygon table with MUTLIPOLYGONs
5125            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5126            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5127            coords_to*
5128            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5129            (wkt_converter): New. Map WKT types to converters
5130            (upload_shapefile): New parameter force_wkt_type to use a
5131            different WKT type than the default
5132    
5133    2003-08-25  Bernhard Herzog  <[email protected]>
5134    
5135            * Thuban/UI/application.py
5136            (ThubanApplication.run_db_param_dialog): New. Suitable as a
5137            db_connection_callback. Main difference is that the dialog run
5138            from this method doesn't have a parent so it can be used even when
5139            there is no main window
5140            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5141            no db_connection_callback was given. This way the dialog pops up
5142            even when the .thuban file was given as a command line parameter.
5143    
5144    2003-08-25  Bernhard Herzog  <[email protected]>
5145    
5146            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5147            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5148            which leads to an effectively frozen X session because the user
5149            can only interact with the dialog but the mouse is still grabbed
5150            by the canvas.
5151            Also, call the tool's Hide method before MouseLeftUp because
5152            MouseLeftUp may change the tool's coordinates.
5153    
5154    2003-08-25  Bernhard Herzog  <[email protected]>
5155    
5156            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5157            LoadCancelled exceptions and handle them by returning immediately.
5158    
5159    2003-08-25  Bernhard Herzog  <[email protected]>
5160    
5161            GUI part of loading sessions with postgis connections which may
5162            require user interaction to get passwords or updated parameters
5163    
5164            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5165            bit nucer and be more generic.
5166            (DBFrame.OnAdd): Adapt to new DBDialog interface
5167    
5168            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5169            optional parameter db_connection_callback which is passed to
5170            load_session.
5171    
5172            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5173            Suitable as a db_connection_callback
5174            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5175            db_connection_callback of the application's OpenSession method
5176    
5177    
5178    2003-08-25  Bernhard Herzog  <[email protected]>
5179    
5180            Basic loading of sessions containing postgis connections:
5181    
5182            * Thuban/Model/load.py (LoadError): Add doc-string
5183            (LoadCancelled): New exception class to indicate a cancelled load
5184            (SessionLoader.__init__): Add the db_connection_callback parameter
5185            which will be used by the loader to get updated parameters and a
5186            password for a database connection
5187            (SessionLoader.__init__): Add the new XML elements to the
5188            dispatchers dictionary
5189            (SessionLoader.check_attrs): Two new conversions, ascii to convert
5190            to a byte-string object and idref as a generic id reference
5191            (SessionLoader.start_dbconnection)
5192            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5193            elements
5194            (load_session): Add the db_connection_callback to pass through the
5195            SessionLoader
5196    
5197            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5198            New classes to test loading of sessions with postgis database
5199            connections.
5200    
5201    2003-08-25  Bernhard Herzog  <[email protected]>
5202    
5203            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5204            replace it and the comment with __BuildDate__ by the Source: and
5205            Id: cvs keywords as used in the other files.
5206    
5207    2003-08-25  Bernhard Herzog  <[email protected]>
5208    
5209            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5210            LoadError when a required attribute is missing. The code used to
5211            be commented out for some reason, but probably should have been
5212            active.
5213    
5214            * test/test_load.py (TestLoadError.test): Test the message in the
5215            LoadError too to make sure it really is about the missing
5216            attribute
5217    
5218    2003-08-22  Bernhard Herzog  <[email protected]>
5219    
5220            * test/test_save.py (SaveSessionTest.test_dbf_table)
5221            (SaveSessionTest.test_joined_table): Add XML validation tests.
5222    
5223    2003-08-22  Bernhard Herzog  <[email protected]>
5224    
5225            Implement saving a session with a postgis connection
5226    
5227            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5228            elements for database connections and shapestores using db
5229            connections
5230            (session): Add the dbconnections to the content model
5231    
5232            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5233            Write the db connections
5234            (SessionSaver.write_session): Call write_db_connections to write
5235            the connection before the data sources
5236            (SessionSaver.write_data_containers): Handle postgis shapestores
5237    
5238            * test/test_save.py (SaveSessionTest.thubanids)
5239            (SaveSessionTest.thubanidrefs): Update for new DTD
5240            (SaveSessionTest.test_save_postgis): New. Test saving a session
5241            with postgis connections
5242    
5243            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5244            (PostGISTable.TableName): New accessor methods for the connection
5245            and table name
5246    
5247            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5248            (TestPostGISTable.test_dbname): New methods to test the new
5249            PostGISConnection methods
5250    
5251    2003-08-22  Bernhard Herzog  <[email protected]>
5252    
5253            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5254            for exceptions occurring when establishing a Database connection
5255            (PostGISConnection.connect): Catch psycopg.OperationalError during
5256            connects and raise ConnectionError.
5257    
5258            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5259            tests for database exceptions
5260    
5261    2003-08-22  Bernhard Herzog  <[email protected]>
5262    
5263            Prepare the test suite for tests with required authentication
5264    
5265            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5266            variables with two predefined users/passwords, one for the admin
5267            and one for a non-privileged user.
5268            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5269            the non-privileged user to the database and set the admin password
5270            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5271            Better error reporting
5272            (PostgreSQLServer.connection_params)
5273            (PostgreSQLServer.connection_string): New methods to return
5274            information about how to connect to the server
5275            (PostgreSQLServer.execute_sql): New. Convenience method to execute
5276            SQL statements
5277            (PostgreSQLServer.require_authentication): Toggle whether the
5278            server requires authentication
5279            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5280            Add or alter users
5281            (PostGISDatabase.initdb): Pass the admin name one the
5282            subprocesses' command lines. Grant select rights on
5283            geometry_columns to everybody.
5284            (upload_shapefile): Use the admin name and password when
5285            connecting. Grant select rights on the new table to everybody.
5286    
5287            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5288            server's new methods to get the connection parameters.
5289    
5290            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5291            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5292            server's new methods to get the connection parameters.
5293    
5294            * test/test_postgis_db.py
5295            (TestPostGISConnection.test_gis_tables_empty)
5296            (TestPostGISConnection.test_gis_tables_non_empty)
5297            (PostGISStaticTests.setUp): Use the server's new methods to get
5298            the connection parameters.
5299    
5300    2003-08-22  Bernhard Herzog  <[email protected]>
5301    
5302            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5303    
5304            * Thuban/version.py: Add psycopg version
5305    
5306            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5307            version of the psycopg module
5308    
5309    2003-08-22  Bernhard Herzog  <[email protected]>
5310    
5311            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5312            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5313            at the moment. The functionality should probably be implemented
5314            some time, though.
5315            (DBFrame.OnRemove): Display a message if the connection can't be
5316            removed because it's still in use.
5317    
5318    2003-08-22  Jan-Oliver Wagner <[email protected]>
5319    
5320            * Thuban/UI/about.py (About.__init__): split up the huge about
5321            text into elements/lists for easier translation. This fixes bug
5322            https://intevation.de/rt/webrt?serial_num=2058
5323            Also, made some forgotten string available for the i18n.
5324    
5325    2003-08-21  Bernhard Herzog  <[email protected]>
5326    
5327            Make postgis support really optional including insensitive menu
5328            items.
5329    
5330            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5331            whether the postgis is supported.
5332    
5333            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5334            to make postgis support optional
5335    
5336            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5337            version of Thuban.Model.postgisdb.has_postgis_support
5338            (database_management command): Make it only sensitive if postgis
5339            is supported.
5340    
5341    2003-08-21  Jan-Oliver Wagner <[email protected]>
5342    
5343            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5344            (section Adding and Removing Layers): Added text and described
5345            multi-selection.
5346            (chapter Extensions): New.
5347    
5348    2003-08-21  Jan-Oliver Wagner <[email protected]>
5349    
5350            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5351            settings to allow multiple files to load into the map.
5352            Also reduced selection to *.shp as a default.
5353    
5354    2003-08-20  Bernhard Herzog  <[email protected]>
5355    
5356            Add dialogs and commands to open database connections and add
5357            database layers.
5358    
5359            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5360            method to open the database connection management dialog
5361            (MainWindow.AddDBLayer): New method to add a layer from a database
5362            (_has_dbconnections): New helper function to use for sensitivity
5363            (database_management command, layer_add_db command): New commands
5364            that call the above new methods.
5365            (main_menu): Add the new commands to the menu.
5366    
5367            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5368            (PostGISConnection.connect): Establish the actual connection in a
5369            separate method and call it in __init__. This makes it easier to
5370            override the behavior in test cases
5371            (PostGISConnection.BriefDescription): New method to return a brief
5372            description for use in dialogs.
5373    
5374            * test/test_postgis_db.py (NonConnection): DB connection that
5375            doesn't actually connect
5376            (TestBriefDescription): New class with tests for the new
5377            BriefDescription method
5378    
5379    2003-08-19  Jan-Oliver Wagner <[email protected]>
5380    
5381            Moved anything from extensions to libraries.
5382    
5383            * libraries: New.
5384    
5385            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5386    
5387            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5388            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5389            been moved here from thuban/extensions/pyprojection/
5390            See there in the Attic for the older history.
5391    
5392            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5393            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5394            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5395            have been moved here from thuban/extensions/pyshapelib/
5396            See there in the Attic for the older history.
5397    
5398            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5399            files have been moved here from thuban/extensions/shapelib/
5400            See there in the Attic for the older history.
5401    
5402            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5403            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5404            thuban/extensions/thuban/
5405            See there in the Attic for the older history.
5406    
5407            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5408    
5409            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5410            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5411    
5412            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5413            Moved to libraries/shapelib.
5414    
5415            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5416            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5417            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5418            Moved to libraries/pyshapelib.
5419    
5420            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5421            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5422            Moved to libraries/pyprojection.
5423    
5424            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5425    
5426            * extensions: Removed.
5427    
5428    2003-08-19  Bernhard Herzog  <[email protected]>
5429    
5430            * test/test_viewport.py (ViewPortTest): We don't use the
5431            facilities of FileTestMixin so don't derive from it.
5432            (TestViewportWithPostGIS): New class with tests for using a
5433            viewport on a map with postgis layers.
5434    
5435    2003-08-19  Bernhard Herzog  <[email protected]>
5436    
5437            Add the db connection management to the session.
5438    
5439            * Thuban/Model/session.py (Session.__init__): New instance
5440            variable db_connections
5441            (Session.AddDBConnection, Session.DBConnections)
5442            (Session.HasDBConnections, Session.CanRemoveDBConnection)
5443            (Session.RemoveDBConnection): New methods to manage and query the
5444            db connections managed by the session
5445            (Session.OpenDBShapeStore): New method to open a shapestore from a
5446            db connection
5447    
5448            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5449            messages for the db connection handling in the session
5450    
5451            * test/test_postgis_session.py: New. test cases for the session's
5452            db connection handling with postgis connections
5453    
5454    2003-08-19  Bernhard Herzog  <[email protected]>
5455    
5456            Add very basic postgis database support and the corresponding test
5457            cases. The test cases require a PostgreSQL + postgis installation
5458            but no existing database. The database will be created
5459            automatically by the test cases
5460    
5461            * test/README: Add note about skipped tests and the requirements
5462            of the postgis tests.
5463    
5464            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5465    
5466            * test/test_postgis_db.py: New. Test cases for the postgis
5467            support.
5468    
5469            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5470            format
5471    
5472            * test/test_wellknowntext.py: New. Test cases for the
5473            wellknowntext parser
5474    
5475            * test/postgissupport.py: New. Support module for tests involving
5476            a postgis database.
5477    
5478            * test/support.py (execute_as_testsuite): Shut down the postmaster
5479            if it's still running after the tests
5480    
5481            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5482            well known text format
5483    
5484    2003-08-19  Jan-Oliver Wagner <[email protected]>
5485    
5486            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5487            message dialog.
5488    
5489    2003-08-18  Bernhard Herzog  <[email protected]>
5490    
5491            * test/support.py (ThubanTestResult.printErrors): Indent the
5492            reason for the skips in the output to make it a bit more readable.
5493            (execute_as_testsuite): New helper function to run a test suite
5494            and print some more information.
5495            (run_tests): Use execute_as_testsuite to run the tests
5496    
5497            * test/runtests.py (main): Use execute_as_testsuite to run the
5498            tests
5499    
5500    2003-08-18  Bernhard Herzog  <[email protected]>
5501    
5502            Fix some bugs in Thuban and the test suite that were uncovered by
5503            changes introduced in Python 2.3:
5504    
5505            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5506            filename is an absolute name
5507    
5508            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5509            filename is an absolute name
5510    
5511            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5512            unique filename to save to and use the correct relative filename
5513            in the expected output.
5514            (SaveSessionTest.test_dbf_table): Use the correct relative
5515            filename in the expected output.
5516    
5517            * test/test_layer.py (TestLayer.test_raster_layer): Update the
5518            test to check whether the filename is absolute.
5519    
5520    2003-08-18  Jan-Oliver Wagner <[email protected]>
5521    
5522            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5523    
5524    2003-08-15  Bernhard Herzog  <[email protected]>
5525    
5526            Change the way shapes are returned by a shape store. The
5527            ShapesInRegion method returns an iterator over actual shape
5528            objects instead of a list of shape ids.
5529    
5530            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5531            id.
5532            (ShapefileStore.ShapesInRegion): Return an iterator over the
5533            shapes which yields shape objects instead of returning a list of
5534            shape ids
5535            (ShapefileStore.AllShapes): New. Return an iterator over all
5536            shapes in the shape store
5537            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5538    
5539            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5540            doc-string.
5541    
5542            * Thuban/UI/baserenderer.py
5543            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5544            layer_shapes and make it return an iterator containg shapes
5545            instead of a list of ids.
5546            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5547            layer_shapes() change
5548    
5549            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5550            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5551    
5552            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5553            changes in the ShapesInRegion return value.
5554            (ViewPort._get_hit_tester): Remove commented out code
5555    
5556            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5557            new return value.
5558            (SimpleShapeStore.AllShapes): New. Implement this method too.
5559    
5560            * test/test_layer.py (TestLayer.test_arc_layer)
5561            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5562            (TestLayer.test_point_layer_with_projection)
5563            (TestLayer.test_derived_store): Adapt to changes in the
5564            ShapesInRegion return value.
5565    
5566            * test/test_shapefilestore.py
5567            (TestShapefileStoreArc.test_shapes_in_region)
5568            (TestShapefileStorePolygon.test_shapes_in_region)
5569            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5570            in the ShapesInRegion return value.
5571            (TestShapefileStorePoint.test_all_shapes)
5572            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5573            methods
5574    
5575            * test/test_derivedshapestore.py
5576            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5577            the ShapesInRegion return value.
5578            (TestDerivedShapeStore.test_all_shapes)
5579            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5580            methods
5581    
5582    2003-08-15  Bernhard Herzog  <[email protected]>
5583    
5584            Make the renderers deal correctly with raw vs. python level
5585            representation of shape geometries
5586    
5587            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5588            Return a flag useraw in addition to the callable and the parameter
5589            to indicate whether the callable can deal with the raw shape data
5590            or uses the higher level python lists of coordinates. The callable
5591            now should accept either the raw data or the return value of the
5592            shape's Points() method.
5593            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5594            change
5595            (BaseRenderer.projected_points): Instead of the shape id use the
5596            points list as parameter.
5597            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5598            (BaseRenderer.draw_point_shape): Adapt to projected_points()
5599            change and accept the points list as parameter instead of the
5600            shape id.
5601    
5602            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5603            the useraw flag as required by the BaseRenderer
5604            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5605            changes.
5606    
5607            * test/test_baserenderer.py
5608            (TestBaseRenderer.test_point_with_classification): New test for
5609            rendering a map with classifications.
5610    
5611    2003-08-15  Bernhard Herzog  <[email protected]>
5612    
5613            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5614            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5615            (ViewPort._get_hit_tester, ViewPort.projected_points)
5616            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5617            (ViewPort._find_label_at): Split the find_shape_at method into
5618            several new methods and use the functions in the hit-test module.
5619    
5620            * Thuban/UI/hittest.py: New module with Python-level hit-testing
5621            functions
5622    
5623            * test/test_hittest.py: New. Test for the new hittest module
5624    
5625    2003-08-15  Bernhard Herzog  <[email protected]>
5626    
5627            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5628            projection to all corners of the bounding box to get a better
5629            approximation of the projected bounding box
5630    
5631            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5632            New. Test coordinate handling of a layer with a projection.
5633            Catches the bug fixed in Layer.ShapesInRegion
5634    
5635    2003-08-15  Bernhard Herzog  <[email protected]>
5636    
5637            Move some of the mock objects in test_baserenderer into their own
5638            module so they can easily be used from other tests
5639    
5640            * test/mockgeo.py: New test helper module with some mock objects
5641            for geometry related things like shapes, shapestores and
5642            projections.
5643    
5644            * test/test_mockgeo.py: New. Tests for the new helper module
5645    
5646            * test/test_baserenderer.py: Some of the mock-objects are in
5647            mockgeo now.
5648    
5649    2003-08-12  Jan-Oliver Wagner <[email protected]>
5650    
5651            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
5652    
5653    2003-08-12  Bernhard Herzog  <[email protected]>
5654    
5655            * po/de.po: New. German translations by Bjoern Broscheit
5656    
5657    2003-08-12  Bernhard Herzog  <[email protected]>
5658    
5659            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5660            strings have to be one string literal.
5661    
5662    2003-08-11  Bernhard Herzog  <[email protected]>
5663    
5664            * test/support.py (FloatComparisonMixin.assertPointListEquals):
5665            New. This method was used in various derived classes, but it's
5666            better to have it here.
5667    
5668            * test/test_shapefilestore.py
5669            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5670            FloatComparisonMixin
5671    
5672            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5673            It's now in FloatComparisonMixin
5674    
5675            * test/test_derivedshapestore.py
5676            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5677            in FloatComparisonMixin
5678    
5679    2003-08-11  Bernhard Herzog  <[email protected]>
5680    
5681            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5682            error message
5683    
5684    2003-08-08  Jan-Oliver Wagner <[email protected]>
5685    
5686            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5687            with version number.
5688            Changed title to reflect version number of Thuban.
5689    
5690    2003-08-08  Jan-Oliver Wagner <[email protected]>
5691    
5692            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5693            the list corresponds to the "About" web page.
5694    
5695    2003-08-08  Bernhard Herzog  <[email protected]>
5696    
5697            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5698            Make sure translated strings are recognized as one string literal.
5699    
5700            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5701            Make sure translated strings are recognized as one string literal.
5702    
5703            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5704            translated strings are recognized as one string literal.
5705    
5706            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5707            sure translated strings are recognized as one string literal.
5708    
5709    2003-08-07  Bernhard Herzog  <[email protected]>
5710    
5711            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5712            Simply delegates to the original shapestore.
5713    
5714            * test/test_derivedshapestore.py
5715            (TestDerivedShapeStore.test_raw_format): New. Test case for
5716            DerivedShapeStore.RawShapeFormat
5717    
5718    2003-08-07  Bernhard Herzog  <[email protected]>
5719    
5720            Add raw data interface to shape objects.
5721    
5722            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5723            class to ShapefileShape which now holds shapefile specific
5724            information.
5725            (ShapefileShape.compute_bbox): Simplified to not cache any
5726            information. The way this method is used that shouldn't matter
5727            performance wise.
5728            (ShapefileShape.RawData): New. Return the shapeid which is the raw
5729            data format for shapes from shapefiles.
5730            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5731            in the shape objects returned by a shapestore. For a
5732            ShapefileStore this is always RAW_SHAPEFILE.
5733            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5734            method.
5735    
5736            * test/test_shapefilestore.py
5737            (TestShapefileStore.test_raw_format): New test to test the raw
5738            format feature of shapes.
5739    
5740            * Thuban/Model/layer.py: Remove the unused import of Shape from
5741            data. It was only there for interface compatibility but it's not
5742            used inside of Thuban and the generic Shape class has gone away.
5743    
5744            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5745            the raw data format and only use an optimized version of its a
5746            shapefile.
5747    
5748    2003-08-07  Bernhard Herzog  <[email protected]>
5749    
5750            * test/test_baserenderer.py (SimpleShape): Shape class for the
5751            tests.
5752            (SimpleShapeStore.Shape): Use SimpleShape instead of
5753            Thuban.Model.data.Shape to make the tests independed of the coming
5754            changes.
5755    
5756    2003-08-07  Bernhard Herzog  <[email protected]>
5757    
5758            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5759            (ThubanTestProgram): New classes that extend the respective
5760            classes from unittest. These new version support skipping tests
5761            under certain expected conditions. In the Thuban test suite we
5762            uses this for tests that require the optional gdal support.
5763            (run_tests): Use ThubanTestProgram instead of the unittest.main()
5764    
5765            * test/runtests.py (main): Use the new ThubanTestRunner instead of
5766            the normal one from unittest
5767    
5768            * test/test_layer.py (TestLayer.test_raster_layer): If this test
5769            is not run because gdal support isn't available report this to the
5770            runner.
5771    
5772            * test/test_baserenderer.py
5773            (TestBaseRenderer.test_raster_no_projection): Do not run this test
5774            if gdal support isn't available and report this to the runner.
5775    
5776    2003-08-06  Bernhard Herzog  <[email protected]>
5777    
5778            Rearrange the renderers a bit, partly in preparation for changes
5779            required for the postgis merge, partly to make it more testable.
5780            Also make the representation of coordinates in Shapes more
5781            consistent.
5782    
5783            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5784            this class is now in BaseRenderer. This class is now practically
5785            only a specialization of BaseRenderer for rendering to an actual
5786            wx DC.
5787            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5788            to get the shapetype specific rendering functions.
5789    
5790            * Thuban/UI/baserenderer.py: New file with the basic rendering
5791            logic. The code in this file is completely independend of wx.
5792            (BaseRenderer): Class with the basic rendering logic
5793    
5794            * test/test_baserenderer.py: New. Test cases for BaseRenderer
5795    
5796            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5797            error_on_redraw to guard agains endless loops and stack overflows
5798            when there's a bug in the rendering code that raises exceptions.
5799            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5800            rendering into a separate method _do_redraw so that error handling
5801            is a bit easier. When an exception occurs, set error_on_redraw to
5802            true. When it's true on entry to OnIdle do nothing and return
5803            immediately.
5804    
5805            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5806            Shape object will always have the coordinates as a list of list of
5807            coordinate pairs (tuples).
5808            (Shape.compute_bbox): Adapt to new representation.
5809    
5810            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5811            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5812            Shape objects.
5813    
5814            * test/test_shapefilestore.py
5815            (ShapefileStoreTests.assertFloatTuplesEqual)
5816            (ShapefileStoreTests.assertPointListEquals): Rename to
5817            assertPointListEquals and change purpose to checking equality of
5818            the lists returned by Shape.Points().
5819            (TestShapefileStoreArc.test_shape)
5820            (TestShapefileStorePolygon.test_shape)
5821            (TestShapefileStorePoint.test_shape): Use the new
5822            assertPointListEquals instead of assertFloatTuplesEqual
5823    
5824            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5825            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5826            and change purpose to checking equality of the lists returned by
5827            Shape.Points().
5828            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5829            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5830            (TestLayer.test_derived_store): Use the new assertPointListEquals
5831            instead of assertFloatTuplesEqual
5832    
5833            * test/test_derivedshapestore.py
5834            (TestDerivedShapeStore.assertFloatTuplesEqual)
5835            (TestDerivedShapeStore.assertPointListEquals): Rename to
5836            assertPointListEquals and change purpose to checking equality of
5837            the lists returned by Shape.Points().
5838            (TestDerivedShapeStore.test_shape): Use the new
5839            assertPointListEquals instead of assertFloatTuplesEqual
5840    
5841    2003-08-06  Jan-Oliver Wagner <[email protected]>
5842    
5843            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
5844            a bounding box. A dialog is raised in case, no bounding box
5845            is found. This fixes bug #2043:
5846            https://intevation.de/rt/webrt?serial_num=2043
5847    
5848    2003-08-05  Bernhard Herzog  <[email protected]>
5849    
5850            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
5851            object look like a Color instantiation. Formerly it looked like a
5852            tuple.
5853    
5854            * test/test_color.py (TestColor.test_repr)
5855            (TestColor.test_equality, TestColor.test_inequality): New. test
5856            some more apects of the Color class
5857            (TestTransparent.test_repr, TestTransparent.test_hex)
5858            (TestTransparent.test_equality): New. Test cases for the
5859            Transparent object.
5860    
5861    2003-08-04  Jan-Oliver Wagner <[email protected]>
5862    
5863            * Doc/manual/thuban-manual.xml: a number of small improvements.
5864            The resulting file is the version submitted for GREAT-ER II.
5865    
5866    2003-08-01  Bernhard Herzog  <[email protected]>
5867    
5868            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
5869            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
5870            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
5871    
5872            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
5873            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
5874            (ThubanEndBusyCursor): Add doc-strings
5875    
5876    2003-08-01  Bernhard Herzog  <[email protected]>
5877    
5878            First step towards PostGIS integration. More abstraction by movin
5879            more code from the layer to the shapestore. More methods of the
5880            layer are now simply delegated to the equivalent method of the
5881            shapestore. The SHAPETYPE_* constants are now in data not in
5882            layer.
5883    
5884            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5885            (SHAPETYPE_POINT, Shape): Move these constants and classes from
5886            layer.py to data.py
5887            (ShapefileStore.__init__): More Initialization for the new methods
5888            and functionality.
5889            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
5890            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
5891            (ShapefileStore.Shape): New methods that were formerly implemented
5892            in the layer.
5893            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
5894            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
5895            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
5896            equivalents of the new shape methods. These versions are simply
5897            delegated to the original shapstore.
5898    
5899            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5900            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
5901            (Layer.SetShapeStore): Removed the initializatin of instance
5902            variables that were needed for the stuff that's now in
5903            ShapefileStore
5904            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
5905            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
5906            shapestore.
5907    
5908            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
5909            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
5910            instead of layer.
5911    
5912            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
5913    
5914            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
5915    
5916            * test/test_layer.py: Import the SHAPETYPE_* constants from data
5917            instead of layer.
5918            (TestLayer.test_derived_store): Remove the test for the exception
5919            when instantiating the DerivedShapeStore with an incompatible
5920            table which is now in test_derivedshapestore.py. Add some more
5921            tests of the layer methods to determine whether they work for a
5922            DerivedShapeStore as well.
5923    
5924    2003-07-31  Jonathan Coles   <[email protected]>
5925    
5926            * Doc/manual/thuban-manual.xml: Fix the list of required packages
5927            by just listing the name and where they can be found.
5928    
5929    2003-07-31  Frank Koormann   <[email protected]>
5930    
5931            * Doc/manual/thuban-manual.xml:
5932            Changed the screenshot elements to figure.
5933            Changed some variablelist elements to itemizedlist.
5934            Added section on GDAL formats.
5935    
5936    2003-07-31  Jonathan Coles   <[email protected]>
5937    
5938            * Doc/manual/thuban-manual.xml: Added a few sentences about
5939            the Fix Border Color option when generating classes.
5940    
5941    2003-07-30  Jonathan Coles   <[email protected]>
5942    
5943            * Thuban/Model/classgen.py: Add docstrings. Rename specific
5944            Ramp instances to use lower_case_style.
5945    
5946            * Thuban/UI/classgen.py: Use renamed Ramp instances.
5947            
5948            * Thuban/UI/classifier.py: Add docstrings.
5949    
5950            * Thuban/UI/dock.py: Add docstrings.
5951    
5952            * test/test_classgen.py: Use renamed Ramp instances.
5953    
5954    2003-07-30  Bernhard Herzog  <[email protected]>
5955    
5956            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5957            was never used in Thuban.
5958    
5959    2003-07-30  Bernhard Herzog  <[email protected]>
5960    
5961            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5962            method directly instead of going through the transient_table
5963            method. This faster because transient_table may force the copy of
5964            a DBF file into the transient database and setting a table's title
5965            doesnm't affect the title of the associated transient table, so
5966            this fixes RT #2042
5967    
5968            * Thuban/UI/main.py (__version__): Don't import the already
5969            removed show_exception_dialog.
5970    
5971    2003-07-29  Jonathan Coles   <[email protected]>
5972    
5973            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5974            Put back this method and remove the equivalent function since we
5975            are setting the exception hook from within this class (OnInit).
5976    
5977    2003-07-29  Jonathan Coles   <[email protected]>
5978    
5979            * Doc/manual/images/5_2_custom_ramp.png,
5980            Doc/manual/images/5_2_quantiles.png,
5981            Doc/manual/images/5_2_uniform_dist.png,
5982            Doc/manual/images/5_2_unique_values.png,
5983            Doc/manual/images/8_int_error.png: New screen shots.
5984    
5985            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5986            some points, and added more screen shots.
5987    
5988    2003-07-29  Bernhard Herzog  <[email protected]>
5989    
5990            * Thuban/Model/data.py: Remove the now unused import of warnings
5991    
5992    2003-07-29  Bernhard Herzog  <[email protected]>
5993    
5994            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5995            deprecated since before the 0.8 release and isn't used in Thuban
5996            itself anymore.
5997    
5998            * Thuban/Model/transientdb.py: Remove some unnecessary imports
5999    
6000    2003-07-29  Jonathan Coles   <[email protected]>
6001    
6002            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6003            python exception hook here so that we are sure to catch any
6004            Thuban exception that happen during initialization.
6005    
6006            * Thuban/UI/main.py (main): Don't set the exception hook here,
6007            it will get set in ThubanApplication.OnInit.
6008    
6009    2003-07-29  Jonathan Coles   <[email protected]>
6010                                                                                
6011            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6012            Removed and called it show_exception_dialog() so that the exception
6013            handler can be set before the class is created.
6014                                                                                
6015            * Thuban/UI/main.py (main): Install the exception handler before
6016            a ThubanApplication is created.
6017                                                                                    
6018    2003-07-29  Bernhard Herzog  <[email protected]>
6019    
6020            * po/it.po: New. Italian translation by Maurizio Napolitano
6021    
6022            * po/ru.po: New. Russian translation by Alex Shevlakov
6023    
6024    2003-07-29  Frank Koormann   <[email protected]>
6025    
6026            * Doc/manual/thuban-manual.xml: Extended section on supported
6027            projections.
6028            
6029    2003-07-29  Frank Koormann   <[email protected]>
6030    
6031            * Doc/manual/thuban-manual.xml: gaspell-checked.
6032    
6033    2003-07-29  Jonathan Coles   <[email protected]>
6034    
6035            * Doc/manual/images/3_5_legend.png: Added border to improve look
6036            on white background.
6037    
6038    2003-07-29  Jonathan Coles   <[email protected]>
6039    
6040            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6041            descriptions for the legend toolbar.
6042    
6043            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6044            cursor from dialog box.
6045    
6046    2003-07-28  Jonathan Coles   <[email protected]>
6047    
6048            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6049    
6050            * Doc/manual/images/2_4_session_tree.png,
6051            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6052            Doc/manual/images/4_2_layer_properties.png,
6053            Doc/manual/images/4_2_raster_layer_properties.png,
6054            Doc/manual/images/5_3_genclass.png,
6055            Doc/manual/images/5_classification.png,
6056            Doc/manual/images/6_projection.png,
6057            Doc/manual/images/7_1_table_view.png,
6058            Doc/manual/images/7_2_5_join.png: New screenshots.
6059    
6060    2003-07-24  Jonathan Coles   <[email protected]>
6061    
6062            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6063    
6064    2003-07-24  Jonathan Coles   <[email protected]>
6065    
6066            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6067            chapter on Layer Management.
6068    
6069            * Doc/manual/Makefile: New. Makefile to generate all formats for the
6070            manual and images.
6071    
6072    2003-07-24  Bernhard Herzog  <[email protected]>
6073    
6074            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6075            it annoys lintian which warns about these files not being
6076            executable. The #! isn't necessary here since if you absolutely
6077            must execute them you can always say "python <filename>".
6078    
6079            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6080            superfluous code to set brush and pen for point shapes
6081    
6082            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6083            belong in viewport anyway
6084    
6085    2003-07-24  Frank Koormann   <[email protected]>
6086    
6087            * Doc/manual/thuban-manual.xml: Added section on table management.
6088    
6089    2003-07-24  Bernhard Herzog  <[email protected]>
6090    
6091            * test/runtests.py (main): Recognize the long "verbose" option
6092            correctly.
6093    
6094    2003-07-22  Jonathan Coles   <[email protected]>
6095    
6096            * Doc/manual/thuban-manual.xml: Continue to write first revision
6097            of the manual.
6098    
6099            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6100            with Begin/EndDrawing() calls to ensure we aren't doing to
6101            many updates to the dc during rendering.
6102            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6103            a pen and brush argument so they need to be passed to the function.
6104    
6105            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6106            Calculates the minimum and maximum scale values. Factored out
6107            of set_view_transform so that it could be used to zoom all the
6108            way into a single point.
6109            (ViewPort.set_view_transform): Call calc_min_max_scales().
6110            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6111            if only a single point is selected.
6112    
6113            * Doc/manual/images/1_2_legend_close.png,
6114            Doc/manual/images/1_2_legend_dock.png,
6115            Doc/manual/images/1_2_mainwindow.png,
6116            Doc/manual/images/1_2_mainwindow.ps,
6117            Doc/manual/images/1_2_mainwindow.sk,
6118            Doc/manual/images/3_2_fullextent.png,
6119            Doc/manual/images/3_2_fulllayerextent.png,
6120            Doc/manual/images/3_2_fullshapeextent.png,
6121            Doc/manual/images/3_2_pan.png,
6122            Doc/manual/images/3_2_zoomin.png,
6123            Doc/manual/images/3_2_zoomout.png,
6124            Doc/manual/images/3_3_identify.png,
6125            Doc/manual/images/3_3_label.png,
6126            Doc/manual/images/3_5_invisible.png,
6127            Doc/manual/images/3_5_movedown.png,
6128            Doc/manual/images/3_5_moveup.png,
6129            Doc/manual/images/3_5_props.png,
6130            Doc/manual/images/3_5_tobottom.png,
6131            Doc/manual/images/3_5_totop.png,
6132            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6133    
6134    2003-07-18  Bernhard Herzog  <[email protected]>
6135    
6136            * Thuban/UI/messages.py (MAP_REPLACED): New message.
6137    
6138            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6139            after the new map has been assigned
6140    
6141            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6142            Delegate MAP_REPLACED to the canvas too
6143            (MainWindow.prepare_new_session): Removed. Thanks to the new
6144            MAP_REPLACED message it's no longer needed
6145            (MainWindow.OpenSession, MainWindow.NewSession):
6146            prepare_new_session has been removed.
6147    
6148            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6149            MAP_REPLACED so that we can close the dialog if a new map is set.
6150            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6151            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6152            dialog
6153    
6154            * test/test_viewport.py (SimpleViewPortTest)
6155            (SimpleViewPortTest.test_default_size): Add doc-strings
6156            (ViewPortTest.setUp): Bind map to self.map so we can use it in
6157            tests. Subscribe to MAP_REPLACED messages too.
6158            (ViewPortTest.tearDown): No need to explicitly unsubscribe
6159            (ViewPortTest.test_set_map): New test for the SetMap method.
6160    
6161    2003-07-18  Bernhard Herzog  <[email protected]>
6162    
6163            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6164            Move this test from ViewPortTest.setUp to this new separate test
6165            case. setUp is not the place for the actual tests.
6166            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6167            more of the test from setUp to the new test test_inital_settings.
6168            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6169            (ViewPortTest.test_proj_conv): Split test_proj_conv into
6170            test_win_to_proj and test_proj_to_win and make the tests easier to
6171            understand
6172            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6173            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6174            (ViewPortTest.test_unprojected_rect_around_point)
6175            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6176            Reformat to increase readability.
6177    
6178    2003-07-18  Bernhard Herzog  <[email protected]>
6179    
6180            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6181    
6182    2003-07-18  Bernhard Herzog  <[email protected]>
6183    
6184            * test/runtests.py: The test suite can now be run without an X
6185            connection. To make sure this remains true, remove the DISPLAY
6186            environment variable so that an error occurs if the wxGTK is
6187            imported accidentally
6188    
6189    2003-07-18  Bernhard Herzog  <[email protected]>
6190    
6191            * Thuban/UI/viewport.py: Remove unused imports
6192    
6193            * Thuban/UI/view.py: Remove unused imports
6194    
6195    2003-07-18  Bernhard Herzog  <[email protected]>
6196    
6197            * test/test_export.py Remove unused imports. The OutputTransform
6198            function is now in viewport.py and is called output_transform
6199            (TestScalebar.test_output_transform)
6200            (TestScalebar.test_OutputTransform): Renamed to
6201            test_output_transform and updated to use output_transform instead
6202            of OutputTransform
6203    
6204            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6205            renamed.
6206            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6207            renamed to output_transform
6208    
6209            * Thuban/UI/viewport.py (OutputTransform, output_transform):
6210            Rename to output_transform
6211    
6212    2003-07-18  Bernhard Herzog  <[email protected]>
6213    
6214            * Thuban/Model/layer.py (Layer.__init__): Rename
6215            classificationField to classificatin_column and init it here so
6216            that it can be used in SetClassificationColumn
6217            (Layer.GetClassificationColumn, Layer.GetClassificationField):
6218            Rename to GetClassificationColumn.
6219            (Layer.SetClassificationColumn, Layer.SetClassificationField):
6220            Rename to SetClassificationColumn and issue a LAYER_CHANGED
6221            message if the column changes.
6222            (Layer._classification_changed, Layer.ClassChanged): Rename to
6223            _classification_changed. Update the callers.
6224            (Layer.SetShapeStore): Further field->column renames.
6225    
6226            * Thuban/Model/load.py (SessionLoader.start_classification)
6227            (SessionLoader.start_clpoint): Updates because of
6228            field->column method name changes in the Layer class
6229    
6230            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6231            because of field->column method name changes in the Layer class
6232    
6233            * Thuban/UI/classifier.py (Classifier.__init__)
6234            (Classifier._OnTry, Classifier._OnRevert): Updates because of
6235            field->column method name changes in the Layer class
6236    
6237            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6238            because of field->column method name changes in the Layer class
6239    
6240            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6241            of field->column method name changes in the Layer class
6242    
6243            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6244            (SaveSessionTest.testClassifiedLayer): Update because of
6245            field->column method name changes in the Layer class
6246    
6247            * test/test_layer.py (SetShapeStoreTests.setUp)
6248            (SetShapeStoreTests.test_sanity): Update because of field->column
6249            method name changes in the Layer class
6250            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6251            (TestLayerModification.test_sanity)
6252            (TestLayerModification.test_initial_settings): remove unsued code
6253            and rename to test_sanity.
6254            (TestLayerModification.test_set_classification): New test for
6255            SetClassification and SetClassificationField.
6256    
6257    2003-07-18  Bernhard Herzog  <[email protected]>
6258    
6259            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6260            the non-fixed values as well. The old test would have accepted a
6261            fixed ramp that only returnes the fixed properties
6262    
6263    2003-07-17  Jonathan Coles   <[email protected]>
6264    
6265            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6266            shots for the manual. The XCF file is the source image and
6267            has additional layers to support changes.
6268    
6269            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6270    
6271            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6272            Return both the new class and the field name.
6273    
6274            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6275            fit the map to the window as this changes any zoom level that
6276            the user may have set.
6277    
6278    2003-07-16  Jonathan Coles   <[email protected]>
6279    
6280            * Thuban/Model/classgen.py (generate_singletons,
6281            generate_uniform_distribution, generate_quantiles): Remove
6282            fixes parameter, but maintain the same functionality by having
6283            the calling function pass a FixedRamp object for the ramp.
6284            (FixedRamp): New. Adapts a ramp to have fixed property values.
6285    
6286            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6287            (Classification): Inherit from Publisher.
6288            (Classification.__init__): Remove the layer parameter.
6289            Classifications no longer need to have a parent layer.
6290            (Classification.GetField, Classification.GetFieldType,
6291            Classification.SetFieldInfo): Removed. The field name is stored
6292            in the layer, and the type can be retreived by calling
6293            Layer.GetFieldType().
6294            (Classification._set_layer, Classification.GetLayer): Removed.
6295            Classifications no longer have a parent layer.
6296    
6297            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6298            classification.
6299            (Layer.SetShapeStore): Reset the classification first while
6300            we still have the old shape store to work with.
6301            (Layer.GetClassificationField, Layer.SetClassificationField):
6302            New. Method for getting/setting the field to classify on.
6303            (Layer.SetClassification): Simplified now that the layer
6304            simply has to hold a reference to the classification and not
6305            tell the classification who owns it.
6306            Fixes RTbug #2023.
6307    
6308            * Thuban/Model/load.py (SessionLoader.start_classification):
6309            Set the field name on the layer, not the classification.
6310    
6311            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6312            classification is modified.
6313    
6314            * Thuban/Model/save.py (SessionSaver.write_classification):
6315            Get the field name and type from the layer.
6316    
6317            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6318            parameter records to rows and add docstring. Fixes RTbug #1997.
6319    
6320            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6321            ramp when we need to fix certain values of a ramp rather than
6322            using the old fixes parameter. Fixes RTbug #2024.
6323    
6324            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6325            parameter.
6326            (ClassTable.Reset): Add fieldType parameter and use it, rather
6327            than asking the classification.
6328            (Classifier.__init__): Remember the original class's field
6329            and ask the layer for the field type, rather than the classification.
6330            (Classifier.__SetGridTable): Retrieve the field and field type
6331            for the table because they are not in the classification.
6332            (Classifier._OnTry, Classifier._OnRevert): Set the classification
6333            field on the layer in addition to the classification itself.
6334    
6335            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6336            classification field from layer.
6337    
6338            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6339            classification field from layer. Split up tests and remove
6340            *-imports. Fixes RTbug #1992.
6341    
6342            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6343    
6344            * test/test_classification.py
6345            (TestClassification.test_classification): Remove tests for methods
6346            that no longer exist.
6347    
6348            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6349            __init__ no longer has a field parameter, use SetClassificationField.
6350            (SetShapeStoreTests.test_sanity): Use layer object to get class
6351            field info.
6352    
6353            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6354            SetClassificationField on layer to set class field info.
6355    
6356            * test/test_viewport.py: Renamed from test/test_view.py.
6357    
6358    2003-07-16  Jan-Oliver Wagner <[email protected]>
6359    
6360            * Doc/manual/thuban-manual.xml: Added authors and an initial
6361            coarse structure.
6362    
6363    2003-07-15  Bernhard Herzog  <[email protected]>
6364    
6365            * test/support.py (FloatComparisonMixin): This is a mix-in class
6366            and therefore should not be derived from any other class.
6367    
6368            * test/test_range.py (RangeTest): FloatComparisonMixin is a
6369            mix-in, so derive from TestCase as well.
6370    
6371    2003-07-15  Bernhard Herzog  <[email protected]>
6372    
6373            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6374            draw_func handling a bit to remove one layer of indirection. This
6375            makes the renderer about 10% faster in the non-classifying case
6376            and the code a bit cleaner
6377            (MapRenderer.draw_point_shape): Add the pen and brush parameters
6378            and set them in the dc. Now the draw_point_shape method and
6379            wxproj's draw_polygon_shape function have basically the same
6380            signature so that both can be directly used as draw_func
6381    
6382    2003-07-15  Bernhard Herzog  <[email protected]>
6383    
6384            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6385            string values (in addition to the labels) as UTF 8
6386    
6387            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6388            values if the field type is string
6389    
6390            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6391            saving a session with non-ascii string classification values.
6392    
6393            * test/test_load.py (TestClassification.file_contents)
6394            (TestClassification.test): Check for non-ascii values in string
6395            classifications
6396    
6397    2003-07-14  Jonathan Coles   <[email protected]>
6398    
6399            * test/test_view.py: New. Tests for ViewPort.
6400    
6401    2003-07-14  Frank Koormann   <[email protected]>
6402    
6403            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6404            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
6405    
6406            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6407            unicode strings from session file: session title, map title and
6408            projection name.
6409            
6410    2003-07-10  Jonathan Coles   <[email protected]>
6411    
6412            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6413            drag_stop, not drag_move when the mouse is released.
6414    
6415    2003-07-10  Jonathan Coles   <[email protected]>
6416    
6417            The most important part of this is the seperation of view.py into
6418            two pieces. viewport.py now has a class called ViewPort which
6419            contains all the non-wx parts of view.py and can therefore be
6420            tested. view.py contains only the wx-specific parts and is fairly
6421            simple.
6422    
6423            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6424            RTTbug #1992.
6425            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6426            RTTbug #1992.
6427    
6428            * Thuban/Model/classgen.py (generate_singletons,
6429            generate_uniform_distribution, generate_quantiles):
6430            Added 'fixes' parameter so that property attributes can
6431            be held constant over the generated classification groups.
6432            (CustomRamp.GetProperties): Remove unused variables.
6433    
6434            * Thuban/Model/map.py (Map.SetProjection): Send the old
6435            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6436            event.
6437    
6438            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6439            parameter which is a list of records that restricts which
6440            records are saved. Fixes RTbug #1997.
6441    
6442            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6443            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6444    
6445            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6446            to allow the user to fix line color/width on generated groups.
6447            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6448            functions to optionally fix group properties.
6449    
6450            * Thuban/UI/main.py (main): Set exception hook to the
6451            ShowExceptionDialog. Fixes RTbug #1993.
6452    
6453            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6454            the table window when it is selectd to be shown.
6455    
6456            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6457            Export Selection button and move the export buttons underneath
6458            the table.
6459            (QueryTableFrame.UpdateStatusText): Added event argument so
6460            that it can respond to grid selection events. The status text
6461            is now updated even when the table is not associated with a
6462            layer as was previously assumed.
6463            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6464            UpdateStatusText responds to these events.
6465            (QueryTableFrame.OnSaveAs): Renamed to doExport.
6466            (QueryTableFrame.doExport): Helper function that saves the
6467            entire table, or selected rows, to a file.
6468            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6469            Respond to export button events and call doExport.
6470    
6471            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6472            the function doesn't return NULL without first setting a Python
6473            Error.
6474    
6475            * test/runtests.py (main): Only print "Unknown option" for
6476            unsupported options.
6477    
6478            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6479            optional epsilon argument to specify floating point accuracy.
6480            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6481            for each item test.
6482    
6483            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6484            tests for saving selected records.
6485    
6486            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6487            tests for saving selected records.
6488    
6489            * test/test_map.py (TestMapWithContents.test_set_projection):
6490            MAP_PROJECTION_CHANGED events send the old projection.
6491    
6492            * test/test_session.py
6493            (TestSessionWithContent.test_forward_map_projection):
6494            MAP_PROJECTION_CHANGED events send the old projection.
6495    
6496            * test/test_table.py (TableTest): Update tests to use non-deprecated
6497            functions.
6498    
6499    2003-07-08  Bernhard Herzog  <[email protected]>
6500    
6501            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6502            constants in the column objects are the standard ones defined in
6503            the table module.
6504    
6505            * test/test_transientdb.py
6506            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6507            exporting transient tables as DBF works. This should catch the bug
6508            just fixed in TransientTableBase.Width.
6509    
6510    2003-07-08  Bernhard Herzog  <[email protected]>
6511    
6512            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6513            interpolated colors correctly.
6514    
6515            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6516            New. Test case for the fix in classgen.py
6517    
6518    2003-07-08  Bernhard Herzog  <[email protected]>
6519    
6520            * test/runtests.py (main): Make the default output less verbose
6521            and add a verbosity option (-v) to get the old output
6522    
6523    2003-07-08  Bernhard Herzog  <[email protected]>
6524    
6525            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6526            0.9.
6527    
6528            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6529            New. Return the join type
6530    
6531            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6532            DTD
6533            (SessionSaver.write_data_containers): Save the join type for
6534            joined tables
6535    
6536            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6537            namespace
6538            (SessionLoader.start_jointable): Handle the jointype attribute
6539    
6540            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6541            as of Thuban 0.8. These are now tests to determine whether Thuban
6542            can still read files generated by Thuban 0.8
6543    
6544            * test/test_load.py (LoadSessionTest.dtd)
6545            (TestSingleLayer.file_contents)
6546            (TestLayerVisibility.file_contents, TestLabels.file_contents)
6547            (TestLayerProjection.file_contents)
6548            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6549            (TestJoinedTable.file_contents)
6550            (TestLoadError.file_contents): Update for new DTD
6551            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6552            for new join type attribute
6553    
6554            * test/test_save.py (SaveSessionTest.dtd)
6555            (SaveSessionTest.testEmptySession)
6556            (SaveSessionTest.testSingleLayer)
6557            (SaveSessionTest.testLayerProjection)
6558            (SaveSessionTest.testRasterLayer)
6559            (SaveSessionTest.testClassifiedLayer)
6560            (SaveSessionTest.test_dbf_table)
6561            (SaveSessionTest.test_joined_table): Update for new DTD
6562            (SaveSessionTest.test_joined_table): Add test for new join type
6563            attribute
6564    
6565    2003-07-04  Bernhard Herzog  <[email protected]>
6566    
6567            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6568            function for table_to_dbf
6569            (table_to_dbf): Deal with names longer than the 10 character limit
6570    
6571            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6572            doc-string
6573            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6574            long column names
6575    
6576    2003-07-03  Bernhard Herzog  <[email protected]>
6577    
6578            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6579    
6580    2003-07-03  Bernhard Herzog  <[email protected]>
6581    
6582            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6583            for the Thuban manual and README with some basic information about
6584            the manual
6585    
6586    2003-07-03  Bernhard Herzog  <[email protected]>
6587    
6588            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6589            Update doc-string
6590            (TransientJoinedTable.create): Do not modify the column objects of
6591            the input tables in place and copy all columns of the input tables
6592            into the joined table after all.
6593    
6594            * test/test_transientdb.py
6595            (TestTransientTable.test_transient_joined_table_same_column_name):
6596            Update to reflect the new behavior
6597            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6598            Update to reflect the new behavior
6599            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6600            New test case for a bug which modified the column objects in place
6601    
6602    2003-07-02  Jonathan Coles   <[email protected]>
6603    
6604            * Thuban/Model/classgen.py (generate_singletons,
6605            generate_uniform_distribution, generate_quantiles,
6606            GenQuantiles0): Make sure maxValue isn't less than
6607            one, otherwise we could divide by zero.
6608    
6609            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6610            ClassGenTest.doClassSingleTest): Call doBoundsTest to
6611            check the end classification groups against the
6612            proper property values.
6613            (ClassGenTest.doBoundsTest): New. Checks the first and
6614            last classification groups to make sure their properties
6615            are the correct upper and lower bounds for a color ramp.
6616    
6617    2003-07-02  Jonathan Coles   <[email protected]>
6618    
6619            * Thuban/Model/classgen.py (generate_singletons,
6620            generate_uniform_distribution, generate_quantiles,
6621            GenQuantiles0): The denominator was one to high when
6622            calculating the index for the ramp causing the index
6623            to never to reach one.
6624    
6625    2003-07-02  Jonathan Coles   <[email protected]>
6626    
6627            Changed the singature of ClassGroupRange.__init__ and
6628            ClassGroupRange.SetRange() so that the min/max values are
6629            passed as a tuple. This makes a better calling scheme for
6630            when a Range object is passed instead.
6631    
6632            * Thuban/Model/classgen.py: Fixed parameters to
6633            ClassGroupRange constructor.
6634    
6635            * Thuban/Model/classification.py (ClassGroupRange.__init__):
6636            Consolidate the min/max parameters into a single _range which
6637            can either be a tuple or a Range object.
6638            (ClassGroupRange.SetRange): Consolidate the min/max parameters
6639            into a single _range which can either be a tuple or a Range object.
6640    
6641            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6642            call to ClassGroupRange constructor to use a tuple.
6643    
6644            * Thuban/Model/layer.py (Layer.SetClassification): Switch
6645            the classification instance variable to the new class
6646            before calling _set_layer otherwise subscribers to a
6647            LAYER_CHANGED event will not see any difference.
6648    
6649            * test/test_classification.py: Fix tests of ClassGroupRange
6650            so that they use the new signature.
6651    
6652            * test/test_load.py: Fix use of ClassGroupRange so that it
6653            uses the new signature.
6654    
6655            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6656            uses the new signature.
6657    
6658            * test/test_save.py: Fix use of ClassGroupRange so that it
6659            uses the new signature.
6660    
6661    
6662    2003-07-01  Jonathan Coles   <[email protected]>
6663    
6664            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6665            Import used objects/class from color.
6666            (generate_singletons): We don't
6667            need the numGroups parameter anymore because we are using
6668            the new ramps with GetProperties().
6669            (generate_uniform_distribution): Use new ramp method
6670            GetProperties().
6671            (generate_quantiles, GenQuantiles0): Use new ramp method
6672            GetProperties().
6673            (CustomRamp.SetNumGroups): Removed. The ramps now map
6674            a value from 0 to 1 to class properties so the number
6675            of groups is not needed ahead of time.
6676            (CustomRamp.next): Removed. CustomRamp does not support
6677            interation anymore.
6678            (CustomRamp.GetProperties): Returns a ClassGroupProperties
6679            object based on the index value from 0 to 1 that is
6680            passed to it.
6681            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6682            Made into instances of Monochromatic class instread of
6683            deriving from it.
6684            (HotToCold.SetNumGroups): Removed. See CustomRamp.
6685            (HotToCold.next): Removed. See CustomRamp.
6686    
6687            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6688            (Classification.SetField, Classification.SetFieldType):
6689            Replaced with SetFieldInfo.
6690            (Classification.SetFieldInfo): New. Does a better job of
6691            what SetField and SetFieldType used to do by combining
6692            their function since they should really always be done
6693            at the same time.
6694            (Classification.SetLayer): Renamed to _set_layer.
6695            (Classification._set_layer): Should only be called from
6696            Layer's SetClassification. This does not cause a recursive
6697            call as SetLayer did because we know that Layer knows about
6698            the classification.
6699    
6700            * Thuban/Model/color.py: Fixes RTbug #1971.
6701            (_Transparent): Renamed from Transparent so it doesn't
6702            conflict with the module variable.
6703            (Transparent, Black): Renamed from Color.Transparent,
6704            Color.Black so they are not class variables.
6705    
6706            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6707            (Layer.Destroy): We don't need to call SetClassification
6708            anymore to clear out the back reference in the classifcation
6709            to the layer. It's better to set it to None using _set_layer,
6710            and we won't be creating another clas object too.
6711            (Layer.SetClassification): Classification._set_layer is not
6712            recursive so remove all the locking variables. Also clean
6713            up the code so that it remains unchanged if something fails.
6714    
6715            * Thuban/Model/load.py: Fixes RTbug #1971.
6716            (SessionLoader.start_classification): Call
6717            Classification.SetFieldInfo().
6718    
6719            * Thuban/Model/save.py: Removed import of Color which wasn't
6720            being used.
6721    
6722            * Thuban/UI/classgen.py: Fixes RTbug #1972.
6723            (ClassGenDialog.__init__): Color ramps are now instances
6724            already so we don't need to create any new objects.
6725            (ClassGenDialog.OnOK): Check for numGroups is no longer
6726            necessary because we never use it.
6727    
6728            * Thuban/UI/classifier.py: Fixes RTbug #1971.
6729            (Classifier.__BuildClassification, Classifier.__SetGridTable):
6730            Call Classification.SetFieldInfo() instead of SetFieldType.
6731    
6732            * Thuban/UI/renderer.py: Fixes RTbug #1971.
6733    
6734            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6735            (MapCanvas.__init__): Subscribe to the idle time event. Set
6736            background color to white.
6737            (MapCanvas.OnPaint): Set a flag indicating that we should
6738            render the map during idle time. If we already have a bitmap
6739            just draw it now.
6740            (MapCanvas.OnIdle): New. Render the map only during idle time.
6741            This also fixes a problem with the busy cursor under gtk.
6742    
6743            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6744            Fix calls to generate_singletons because the signature changed.
6745    
6746            * test/test_classification.py: Fix color references and
6747            change calls to Classification.[SetField|SetFieldType] to
6748            SetFieldInfo.
6749    
6750            * test/test_load.py: Fix color references.
6751    
6752            * test/test_load_0_2.py: Fix color references.
6753    
6754            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6755            Change calls to Classification.[SetField|SetFieldType] to
6756            SetFieldInfo.
6757    
6758    2003-07-01  Frank Koormann   <[email protected]>
6759    
6760            MERGE from the greater-ms3 branch.
6761    
6762            * test/test_transientdb.py
6763            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6764            New. Test join of two tables with partly equal column names.
6765    
6766            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6767            If duplicates in left and right tables column names are found,
6768            append '_' (underscores) to the name until it is unique.
6769            Create always new internal names for the resulting table and reference
6770            columns in the join statement with <table>.<column>
6771    
6772    2003-07-01  Bernhard Herzog  <[email protected]>
6773    
6774            * test/test_transientdb.py
6775            (TestTransientTable.test_transient_joined_table_same_column_name):
6776            New. Test whether joining on columns with the same names in both
6777            tables works.
6778            
6779            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6780            sure to use the right internal names even when joining on field
6781            with the same names in both tables. Also, detect duplicate names
6782            in the joined table correctly.
6783    
6784    2003-07-01  Frank Koormann   <[email protected]>
6785    
6786            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6787            Reverse List of layers to render in same order as in desktop legend.
6788    
6789    2003-06-30  Jonathan Coles   <[email protected]>
6790    
6791            * Thuban/version.py (make_tuple): Takes a version string
6792            and splits it into a tuple of at most three integers.
6793            Used make_tuple() to make tuple versions of the version
6794            numbers.
6795    
6796            * Thuban/UI/about.py: Add Thuban email addresses.
6797    
6798    2003-06-30  Jonathan Coles   <[email protected]>
6799    
6800            * Thuban/version.py: SQLite/PySQLite version dependencies
6801            were too high.
6802    
6803    2003-06-30  Jonathan Coles   <[email protected]>
6804    
6805            * Thuban/version.py: Update version to 0.8.1
6806            
6807            * MANIFEST.in: Added Projections so that default.proj is
6808            included.
6809    
6810    2003-06-26  Jonathan Coles   <[email protected]>
6811    
6812            New About box with lots more information including library
6813            versions and credits. More/better version checking before
6814            Thuban starts.
6815    
6816            * Thuban/UI/about.py: New. New About box that displays
6817            library version information and credits.
6818    
6819            * Thuban/version.py: Added new 'versions' dictionary which
6820            contains the verions of various libraries which are checked
6821            when the module loads.
6822            (verify_versions): Check all version numbers and returns
6823            a list of errors.
6824    
6825            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6826            Reset the status of the buttons as the situation warrants,
6827            but in a better more reliable way by not relying on the
6828            current status to determine what needs to change.
6829    
6830            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6831            (verify_versions): Remove most of the code since it is
6832            now in Thuban.version.verify_versions.o
6833    
6834            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6835            About box in Thuban.UI.about.
6836    
6837            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
6838            Returns the version of gdal library being used as a string.
6839    
6840            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6841            Removed.
6842            (get_proj_version): Return the version of PROJ that the file
6843            was compiled with.
6844            (get_gtk_version): Return th version of GTK that the file
6845            was compiled with.
6846    
6847    2003-06-25  Jonathan Coles   <[email protected]>
6848    
6849            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
6850            of the SelectPropertiesDialog should be self so the window
6851            appears on top.
6852            (ClassGroupPropertiesCtrl.DoEdit): The parent
6853            of the SelectPropertiesDialog should be self so the window
6854            appears on top.
6855    
6856            * Thuban/UI/resource.py: Cleaned up how we determine file
6857            extensions.
6858            (GetImageResource): Return an wxImage from our Resources.
6859    
6860    2003-06-24  Jonathan Coles   <[email protected]>
6861    
6862            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6863            Check that a layer has a classification before trying
6864            to get it. Raster layers don't have classifications.
6865    
6866    2003-06-23  Jonathan Coles   <[email protected]>
6867            
6868            * setup.py: Add Resources/XML to resource list.
6869        
6870    2003-06-23  Jonathan Coles   <[email protected]>
6871    
6872            * setup.cfg: Fix copyright dates
6873        
6874    2003-06-23  Jonathan Coles   <[email protected]>
6875    
6876            * MANIFEST.in: Update with Resources/XML
6877    
6878            * setup.py: Don't include Locale resources yet as we don't
6879            have any and it causes problems building the distribution
6880            for Windows. Update version to 0.8.0.
6881    
6882            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
6883    
6884            * Thuban/UI/mainwindow.py: Add blank line at the end because
6885            file was not being read correctly building the Windows
6886            distribution.
6887    
6888    2003-06-23  Jonathan Coles   <[email protected]>
6889    
6890            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
6891    
6892            * Thuban/version.py: Temporarily update longversion for
6893            the 0.8 release so that it doesn't have the cvs revision.
6894    
6895    2003-06-23  Jonathan Coles   <[email protected]>
6896    
6897            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
6898            to make sure that we don't create reentrant possibilities with
6899            wxYield.
6900    
6901            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
6902            directly to avoid the wxSafeYield() call which generates an
6903            OnPaint event causing infinite recursion. Don't try to catch
6904            exception anymore. This was for before there were limits on map
6905            scaling.
6906    
6907    2003-06-23  Bernhard Herzog  <[email protected]>
6908    
6909            Bug fix for RT #1961:
6910    
6911            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
6912            Register DerivedShapestores with the session
6913    
6914            * Thuban/Model/session.py (Session.Tables): Make sure each table
6915            is only listed once.
6916    
6917            * test/test_load.py (TestJoinedTable.test): Add check_format call.
6918            Update file contents to match the one written out.
6919    
6920    2003-06-20  Bernhard Herzog  <[email protected]>
6921    
6922            * test/xmlsupport.py (SaxEventLister.startElementNS)
6923            (SaxEventLister.endElementNS): Do not include the qname. Python
6924            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6925            is (presumably incorrectly) None, whereas it's a string with the
6926            element name in the later versions.
6927    
6928            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6929            (TestEventList.test_even_list_namespace): Update tests to reflect
6930            the new behaviour
6931            (TestEventList.test_even_list_id_normalization): Fix doc-string
6932    
6933    2003-06-20  Jonathan Coles   <[email protected]>
6934    
6935            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6936            by deriving classes to determine if that layer supports shapes.
6937            (Layer): Override HasShapes and return true.
6938    
6939            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6940            instead of a direct call to wx[Begin|End]CusyCursor().
6941            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6942            table data.
6943    
6944            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6945            New. Wrappers around the wxWindows functions that allow us to
6946            make additional calls such as wxYield which gives the native
6947            system a chance to update the cursor correctly.
6948    
6949            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6950            instead of a direct call to wx[Begin|End]CusyCursor().
6951    
6952            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6953            instead of a direct call to wx[Begin|End]CusyCursor().
6954            (MapCanvas.find_shape_at): Check if the current search layer
6955            support shapes, otherwise go on to the next layer.
6956    
6957            * test/test_layer.py: Add tests in each type of layer for
6958            HasClassification() and HasShapes()
6959    
6960    2003-06-20  Jonathan Coles   <[email protected]>
6961    
6962            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6963            turning on the busy cursor to allow the system to change the
6964            cursor before we begin painting. This fixes a problem that
6965            was occuring only under GTK. Fixes RTbug #1840.
6966    
6967    2003-06-20  Bernhard Herzog  <[email protected]>
6968    
6969            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6970            version.
6971    
6972            * Thuban/Model/save.py (sort_data_stores): New. Make topological
6973            sort of the data sources so they can be written with sources that
6974            data sources that depend on other data sources come after the
6975            sources they depend on.
6976            (SessionSaver.__init__): Add idmap instance variable to map from
6977            objects to the ids used in the file.
6978            (SessionSaver.get_id, SessionSaver.define_id)
6979            (SessionSaver.has_id): New. Methods to manage the idmap
6980            (SessionSaver.write): Use thuban-0.8.dtd
6981            (SessionSaver.write_session): Add a namespace on the session and
6982            write out the data sources before the maps.
6983            (SessionSaver.write_data_containers): New. Write the data
6984            containers.
6985            (SessionSaver.write_layer): Layer elements now refer to a
6986            shapestore and don't contain filenames anymore.
6987    
6988            * Thuban/Model/load.py (LoadError): Exception class to raise when
6989            errors in the files are discovered
6990            (SessionLoader.__init__): Define dispatchers for elements with a
6991            thuban-0.8 namespace too.
6992            (SessionLoader.check_attrs): New helper method to check and
6993            convert attributes
6994            (AttrDesc): New. Helper class for SessionLoader.check_attrs
6995            (SessionLoader.start_fileshapesource)
6996            (SessionLoader.start_derivedshapesource)
6997            (SessionLoader.start_filetable, SessionLoader.start_jointable):
6998            Handlers for the new elements in the new fileformat
6999            (SessionLoader.start_layer): Handle the shapestore attribute in
7000            addition to filename.
7001            (SessionLoader.start_table, SessionLoader.end_table): Removed.
7002            They were never used in the old formats and aren't needed for the
7003            new.
7004    
7005            * Thuban/Model/session.py (Session.DataContainers): New method to
7006            return all "data containers", i.e. shapestores and tables
7007    
7008            * test/xmlsupport.py (SaxEventLister.__init__)
7009            (SaxEventLister.startElementNS, sax_eventlist): Add support to
7010            normalize IDs.
7011    
7012            * test/test_xmlsupport.py
7013            (TestEventList.test_even_list_id_normalization): New test case for
7014            id normalization
7015    
7016            * test/test_load.py (LoadSessionTest.check_format): Use ID
7017            normalization
7018            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7019            class atrributes used for ID normalization
7020            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7021            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7022            file format
7023            (TestJoinedTable): New test for loading sessions with joined
7024            tables.
7025            (TestLoadError): New. Test whether missing required attributes
7026            cause a LoadError.
7027    
7028            * test/test_save.py (SaveSessionTest.thubanids)
7029            (SaveSessionTest.thubanidrefs): New class attributes for ID
7030            normalization in .thuban files.
7031            (SaveSessionTest.compare_xml): Use id-normalization.
7032            (SaveSessionTest.testEmptySession)
7033            (SaveSessionTest.testLayerProjection)
7034            (SaveSessionTest.testRasterLayer)
7035            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7036            (SaveSessionTest.testLayerProjection): The filename used was the
7037            same as for testSingleLayer. Use a different one.
7038            (SaveSessionTest.test_dbf_table)
7039            (SaveSessionTest.test_joined_table): New test cases for saving the
7040            new data sources structures.
7041            (TestStoreSort, MockDataStore): Classes to test the sorting of the
7042            data stores for writing.
7043    
7044            * test/runtests.py: Add CVS keywords
7045    
7046    2003-06-20  Jonathan Coles   <[email protected]>
7047    
7048            * test/test_session.py
7049            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7050            Use the cultural_landmark-point.dbf file for the store so that
7051            the table rows and shape count match.
7052    
7053    2003-06-20  Jonathan Coles   <[email protected]>
7054    
7055            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7056            an exception if the number of shapes is different from the
7057            number of rows in the table. Address RTbug #1933.
7058    
7059            * test/test_layer.py (TestLayer.test_derived_store): Add
7060            a test for the new exception in DerivedShapeStore.__init__.
7061    
7062            * test/support.py (FloatTestCase): Removed since there is
7063            already FloatComparisonMixin. Fixes RTbug #1954.
7064            (FloatComparisonMixin.assertFloatEqual): Include test for
7065            infinity that was part of FloatTestCase.
7066    
7067            * test/test_range.py (RangeTest): Inherit from
7068            support.FloatComparisonMixin now that we don't have
7069            support.FloatTestCase.
7070    
7071    2003-06-20  Bernhard Herzog  <[email protected]>
7072    
7073            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7074            the implementation in xmlsupport instead.
7075            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7076    
7077            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7078            of test_save
7079    
7080    2003-06-20  Bernhard Herzog  <[email protected]>
7081    
7082            * test/test_load.py (LoadSessionTest.check_format): New helper
7083            method to make sure the test files we load might have been written
7084            by the current thuban version.
7085            (ClassificationTest.TestLayers, TestSingleLayer.test)
7086            (TestLayerVisibility.test, TestClassification.test)
7087            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7088            Add check_format() calls and fix the thuban data to match the data
7089            that would be written by saving the session loaded from it.
7090    
7091            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7092            the same class and function in test_save.
7093    
7094            * test/test_xmlsupport.py (TestEventList): New. test cases for
7095            sax_eventlist
7096    
7097    2003-06-20  Bernhard Herzog  <[email protected]>
7098    
7099            * Resources/XML/thuban.dtd: Add comment about which versions of
7100            Thuban are covered by this DTD
7101            (map): Fix content model for layers and raster layers. There can
7102            be any number or layers and raster layers in any order.
7103    
7104    2003-06-20  Jonathan Coles   <[email protected]>
7105    
7106            This is mainly about fixing RTbug #1949.
7107    
7108            * Thuban/Model/classification.py: Remove "from __future__"
7109            import statement since python 2.2 is the earliest supported
7110            version.
7111    
7112            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7113            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7114            depending on the units this projection *forwards* into.
7115    
7116            * Thuban/Model/save.py (SessionSaver.write_classification):
7117            Remove unnecessary use of lambdas and nested functions.
7118    
7119            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7120            adjustment here if the map projection uses degrees.
7121    
7122            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7123            scale adjust code since it is now done before calling
7124            this method. Don't do anything if the map projection
7125            is None.
7126    
7127    2003-06-19  Bernhard Herzog  <[email protected]>
7128    
7129            Move version specific load tests to their own file.
7130    
7131            * test/test_load.py: Expand the doc-string to explain a bit how to
7132            handle file format changes.
7133            (TestClassification.test): Update the docstring as this test is
7134            not about Thuban 0.2 anymore.
7135    
7136            * test/test_load_0_2.py: New file with the load tests for thuban
7137            files created with Thuban 0.2 and earlier.
7138    
7139    2003-06-19  Bernhard Herzog  <[email protected]>
7140    
7141            Add XML validation to some of the tests. Validation will only be
7142            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7143            To make the DTD available to the test cases it's moved into
7144            Resources/XML
7145    
7146            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7147            for versions up to and including 0.2. Two slight changes: added an
7148            encoding specification and fixed the comment which refered to
7149            GRASS, not Thuban
7150    
7151            * test/xmlsupport.py: New support module for tests involving XML.
7152            Currently there's a mix-in class for XML validation.
7153    
7154            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7155    
7156            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7157            so that we can validate the
7158            (SaveSessionTest.testEmptySession)
7159            (SaveSessionTest.testSingleLayer)
7160            (SaveSessionTest.testSingleLayer)
7161            (SaveSessionTest.testLayerProjection)
7162            (SaveSessionTest.testRasterLayer)
7163            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7164    
7165            * test/runtests.py (main): Call print_additional_summary instead
7166            of print_garbage_information
7167    
7168            * test/support.py (resource_dir): New function to return the
7169            "Resource" subdirectory
7170            (print_additional_summary): New function to combine several
7171            summary functions
7172            (run_tests): Use print_additional_summary instead of calling
7173            print_garbage_information directly
7174    
7175    2003-06-19  Bernhard Herzog  <[email protected]>
7176    
7177            * Doc/thuban.dtd (classification): Correct the content model of
7178            the classification element.
7179            (projection): Add the "name" attribute
7180    
7181    2003-06-19  Frank Koormann   <[email protected]>
7182    
7183            MERGE from the greater-ms3 branch.
7184    
7185            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7186            scale if projection is latlong to get better estimate.
7187    
7188            Fix problem of hidden properties dialog under windows after double
7189            click on layer tree:
7190            The tree control always gets an Expanded / Collapsed event after
7191            the ItemActivated  on double click, which raises the main window again.
7192            We add a second ItemActivated event to the queue, which simply
7193            raises the already displayed window.
7194    
7195            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7196            raiseProperties initialized to prevent endless loops
7197            (LegendTree._OnItemActivated): Depending on self.raiseProperties
7198            simply raise the properties or open the dialog and issue a second
7199            event.
7200    
7201    2003-06-18  Jonathan Coles   <[email protected]>
7202    
7203            * setup.py: Fix a few problems that occured under Windows.
7204    
7205    2003-06-18  Jonathan Coles   <[email protected]>
7206    
7207            When Thuban loaded the map was redrawn twice because the
7208            legend was being opened after the mainwindow was created
7209            and not during its creation. This meant the map was drawn
7210            initially and then had to be redrawn when the legend
7211            caused the display to change. Now the legend is opened
7212            in the mainwindow constructor which resolves this issue.
7213    
7214            Also, although we were checking for the existence of
7215            gdal and gdalwarp modules, the gdalwarp extension was
7216            still being compiled (which may fail if the system doesn't
7217            have gdal installed). the build_ext command to setup.py
7218            now accepts the flags --with-gdal and --without-gdal.
7219            If --without-gdal is specified setup.py will try to
7220            use the gdal parameters specified by gdal-config. Under
7221            windows, those parameters have to be set in setup.py
7222            as with proj4 an wxWindows.
7223    
7224            * setup.py: Use a list instead of seperate variables for
7225            extension parameters so we can create a generic function
7226            that runs an appropriate *-config script.
7227            (run_cs_script): Renamed from run_wx_script and modified
7228            to accept a second argument which is a list of lists to
7229            be filled in by the values returned from running the command.
7230            (thuban_build_ext): New. Extends the build_ext command and
7231            provides the options --with-gdal/--without-gdal which then
7232            optionally includes the gdalwarp extension.
7233    
7234            * Thuban/Model/resource.py: First check if we can import
7235            the gdalwarp Thuban extension before checking for gdal.
7236            Also added some comments.
7237            
7238            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7239            the map is None which may be the case if none has been loaded
7240            yet.
7241    
7242            * Thuban/UI/main.py (main): Remove call to ShowLegend.
7243    
7244            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7245    
7246            * Thuban/UI/renderer.py: Check for gdal support before importing
7247            gdalwarp.
7248            (MapRenderer.render_map): Only try to optimize if we have gdal
7249            support otherwise nothing will get drawn.
7250    
7251            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7252            during startup before a map has been created. Check if map is None
7253            before using it and do nothing if it is.
7254    
7255    2003-06-17  Jonathan Coles   <[email protected]>
7256    
7257            Fix the problem with raster layers under Windows that caused
7258            Thuban to crash. The view should respond to layer projection
7259            changed events to update the display. Changes to a projection
7260            should not cause the map to be set to full extent.
7261            
7262            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7263            current_map_proj to remember the current map projection so that
7264            when the projection changes we know what the previous projection
7265            was.
7266            (MapCanvas.SetMap): Unsubscribe and subscribe to
7267            LAYER_PROJECTION_CHANGED events.
7268            (MapCanvas.projection_changed): Split into two methods that respond
7269            to map and layer projection changes.
7270            (MapCanvas.map_projection_changed): New. Takes the current view and
7271            projects it using the new projection. This does not cause the
7272            map to be redrawn at full extent.
7273            (MapCanvas.layer_projection_changed): New. Cause a redraw which
7274            will draw each layer in its new projection.
7275            
7276            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7277            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7278            under Windows.
7279            
7280            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7281            to twice sizeof(void*) because there are two digits for each
7282            hex byte.
7283    
7284    2003-06-16  Bernhard Herzog  <[email protected]>
7285    
7286            Update to the layer interface: Direct access to the table,
7287            shapetable, shapefile and filename attributes is now actively
7288            deprecated by issuing deprecation warnings for all places where
7289            this happens.
7290    
7291            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7292            to the instance variables table, shapetable, shapefile and
7293            filename via __getattr__ so that we can issue a deprecation
7294            warning.
7295            (Layer.SetShapeStore): Don't set the deprecated instance variables
7296            any more
7297            (Layer.SetShapeStore): Don't use deprecated layer instance
7298            variables
7299            (Layer.Destroy): No need to explicitly remove the instance
7300            variables any more
7301            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7302            instance variables
7303    
7304            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7305            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7306            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7307            use deprecated layer instance variables
7308    
7309            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7310            deprecated layer instance variables
7311    
7312            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7313            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7314            instance variables
7315    
7316            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7317            deprecated layer instance variables
7318    
7319            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7320            deprecated layer instance variables
7321    
7322            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7323            deprecated layer instance variables
7324    
7325            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7326            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7327            variables
7328    
7329            * test/runtests.py (main): Turn Thuban's deprecation warnings into
7330            errors so that they're cought by the tests
7331    
7332            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7333            layer instance variables
7334    
7335    2003-06-16  Jonathan Coles   <[email protected]>
7336    
7337            Fix a problem under Windows whereby if the user double-clicks on a
7338            layer in the legend that tree item will expand or collapse as well
7339            as open the layer properties dialog. The state of the tree item
7340            should not be affected.
7341    
7342            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7343            preventExpandCollapse and subscribe to expanding and collapsing
7344            events.
7345            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7346            collapsing events and will veto the event if it has been triggered
7347            by the user double clicking on a layer.
7348            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7349            that an expanding/collapsing event should be vetoed.
7350    
7351    2003-06-13  Bernhard Herzog  <[email protected]>
7352    
7353            * Thuban/UI/classifier.py (Classifier.OnClose)
7354            (Classifier.map_layers_removed)
7355            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7356            in OnClose and not in map_layers_removed or
7357            layer_shapestore_replaced to make sure it always happens when the
7358            dialog is closed
7359    
7360    2003-06-13  Jonathan Coles   <[email protected]>
7361    
7362            This puts back a fix for Windows where a panel is needed so that
7363            the background of the table view appears correctly.
7364    
7365            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7366            object that can be used by derived classes to place any
7367            controls (including the grid) onto.
7368            (QueryTableFrame.__init__): Use the panel as the parent window
7369            for all the controls. Reparent the grid so that the panel is
7370            the parent. Call UpdateStatusText() to correctly initialize
7371            the status bar.
7372    
7373    2003-06-13  Jonathan Coles   <[email protected]>
7374    
7375            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7376            from wxFrame (as opposed to wxDialog like the other classes)
7377            but otherwise behaves like the other classes. This is needed
7378            for the TableView which isn't really a dialog and needs to
7379            have a status bar and control buttons.
7380    
7381            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7382            instance variable to keep track of how many rows are selected.
7383            Subscribe once to the the events we are interested in.
7384            (ThubanGrid.OnRangeSelect): Only handle event if event handling
7385            hasn't been turned off.
7386            (ThubanGrid.OnSelectCell): Only handle event if event handling
7387            hasn't been turned off.
7388            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7389            as an event listener (which changes the event handler stack)
7390            simply set an instance variable to False. This is checked in
7391            the event handlers.
7392            (ThubanGrid.GetNumberSelected): Return the number of currently
7393            selected rows.
7394            (TableFrame): Inherit from ThubanFrame so we can have a
7395            status bar and control buttons.
7396            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7397            Explicitly set which items are selected in the operator choice and
7398            action choice so there is always a valid selection. Fixes RTbug #1941.
7399            Subscribe to grid cell selection events so we can update the
7400            status bar.
7401            (QueryTableFrame.UpdateStatusText): Update the status bar with
7402            how many rows are in the grid, how many columns, and how many
7403            rows are selected.
7404            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7405            Call UpdateStatusText when cells are (de)selected.
7406            (QueryTableFrame.OnQuery): Use the string value in the value
7407            combo if either the selected item index is 0 or if the string
7408            cannot be found in the predefined list (this happens if the
7409            user changes the text). Fixes RTbug #1940.
7410            Only turn off the grid event listeners if there a query comes
7411            back with a none empty list of ids. in the case that the list
7412            is empty this causes a grid.ClearSelection() call to actually
7413            clear the grid selection which causes the selected items in
7414            the map to be deselected. Fixes RTbug #1939.
7415    
7416            * test/test_save.py (XMLWriterTest.Encode): Check return values.
7417            Fixes RTbug #1851.
7418    
7419    2003-06-13  Bernhard Herzog  <[email protected]>
7420    
7421            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7422            self.selected_shape with the current selection to make sure the
7423            contents of the dialog are up to date when it's shown for the
7424            first time.
7425            The dialog used to work without this by luck. The recent fix to
7426            the connector module 'broke' a 'feature' the identify view was
7427            relying on, i.e that subscribing to a message in response to
7428            receiving a message of that type would mean that the new
7429            subscriber would also be called for the same message.
7430            
7431    2003-06-12  Jonathan Coles   <[email protected]>
7432    
7433            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7434            the image is rendered. Fixes RTbug #1937.
7435    
7436    2003-06-12  Jonathan Coles   <[email protected]>
7437    
7438            * Thuban/Lib/fileutil.py: As is done under Windows, create the
7439            user directory if it doesn't exist on a posix system.
7440            Fixes RTbug #1815.
7441    
7442            * Thuban/Model/resource.py (get_user_proj_files): Moved the
7443            called to get_application_dir here, so that the directory
7444            will only be called if this method is invoked.
7445    
7446            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7447            the projfilepath if no projection is selected.
7448    
7449    2003-06-12  Jonathan Coles   <[email protected]>
7450    
7451            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7452            the scalebar if the current map has no projection set.
7453    
7454            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7455            projfilepath label to just the basename of the projection file
7456            rather than include the entire path.
7457    
7458            * Thuban/Model/resource.py: Fix missed proj functions that
7459            needed to be renamed.
7460    
7461    2003-06-12  Jonathan Coles   <[email protected]>
7462    
7463            * Thuban/Model/classification.py: Removed assert statements that
7464            tested if the variable was an instance of Color.
7465    
7466            * Thuban/Model/color.py (Color): Remove commented code that isn't
7467            used.
7468            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7469            Fixes RTbug #1835.
7470            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7471            Needed now that the class doesn't inherit from Color.
7472    
7473    2003-06-12  Jonathan Coles   <[email protected]>
7474    
7475            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7476            check unicode strings.
7477    
7478            * test/test_layer.py: Check for existence of gdal.
7479    
7480    2003-06-12  Jonathan Coles   <[email protected]>
7481        
7482            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7483            that was in load.py
7484    
7485            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7486            that was in save.py
7487    
7488    2003-06-12  Jonathan Coles   <[email protected]>
7489    
7490            This is largely a collection of bug fixes. We also handle the
7491            case where gdal is not on the system. The XMLReader and XMLWriter
7492            classes were moved into there own files to resolve some circular
7493            import references and because they shouldn't really be in the
7494            file that is dediciated to reading/writing session files since
7495            they are also used elsewhere.
7496    
7497            * Thuban/Model/classgen.py: Renamed functions to follow the
7498            function_names_with_underscores style. Fixes RTbug #1903.
7499            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7500    
7501            * Thuban/Model/layer.py: Import gdal only if it available.
7502            (RasterLayer): Handle the case where the gdal library is unavailable.
7503            Addresses RTbug #1877.
7504    
7505            * Thuban/Model/load.py (XMLReader): Moved into seperate file
7506            xmlreader.py.
7507    
7508    2003-06-12  Jonathan Coles   <[email protected]>
7509    
7510            This is largely a collection of bug fixes. We also handle the
7511            case where gdal is not on the system. The XMLReader and XMLWriter
7512            classes were moved into there own files to resolve some circular
7513            import references and because they shouldn't really be in the
7514            file that is dediciated to reading/writing session files since
7515            they are also used elsewhere.
7516    
7517            * Thuban/Model/classgen.py: Renamed functions to follow the
7518            function_names_with_underscores style. Fixes RTbug #1903.
7519            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7520    
7521            * Thuban/Model/layer.py: Import gdal only if it available.
7522            (RasterLayer): Handle the case where the gdal library is unavailable.
7523            Addresses RTbug #1877.
7524    
7525            * Thuban/Model/load.py (XMLReader): Moved into seperate file
7526            xmlreader.py.
7527    
7528            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7529            file xmlwriter.py.
7530    
7531            * Thuban/Model/resource.py: Renamed functions to following the
7532            function_names_with_underscores style.
7533            (has_gdal_support): New function that returns true if the gdal
7534            library is available. Addresses RTbug #1877.
7535    
7536            * Thuban/UI/application.py (ThubanApplication.OpenSession):
7537            Display a message box if the gdal library is not available, but
7538            only if there are any layers that would use it. Addresses RTbug #1877.
7539    
7540            * Thuban/UI/classgen.py: Use renamed projection resource functions.
7541            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7542            when using integers versus floats.
7543    
7544            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7545            determine if the "Add Image Layer" menu option should be
7546            greyed out or not. Addresses RTbug #1877.
7547    
7548            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7549    
7550            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7551            optimize if a raster layer is visible. Fixes RTbug #1931.
7552            Only draw the raster layer if the gdal library is available.
7553            Addresses RTbug #1877.
7554    
7555            * test/test_classgen.py: Add tests for generate_singletons,
7556            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7557            (test_calculate_quantiles): Fix some tests to catch the new
7558            ValueError that is raised.
7559    
7560            * test/test_proj.py: Use renamed projection resource functions.
7561    
7562            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7563            test for saving classified layers. Fixes RTbug #1902.
7564            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7565    
7566    2003-06-12  Jan-Oliver Wagner <[email protected]>
7567    
7568            Fix for http://intevation.de/rt/webrt?serial_num=1900.
7569    
7570            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7571    
7572            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7573            multiplechoicedialog.py rather than from the wxPython library.
7574    
7575    2003-06-11  Frank Koormann  <[email protected]>
7576    
7577            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7578            update.
7579    
7580    2003-06-11  Frank Koormann  <[email protected]>
7581    
7582            * Thuban/Lib/fileutil.py (get_application_dir): New function to
7583            determine the absolute .thuban/thuban directory under
7584            "posix" (os.expanduser) and "nt" (read AppData registry key).
7585    
7586            * Thuban/Model/resource.py: Use get_application_dir
7587    
7588            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7589            Use get_application_dir.
7590    
7591    2003-06-10  Bernhard Herzog  <[email protected]>
7592    
7593            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7594            the messages MAP_LAYERS_REMOVED messages
7595            (LayerTableFrame.OnClose): Unsubscribe from it.
7596            (LayerTableFrame.map_layers_removed): New. Receiver for
7597            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7598            dialog is showing is removed.
7599    
7600    2003-06-10  Bernhard Herzog  <[email protected]>
7601    
7602            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7603            of the receivers list so that unsubscribing in a receiver doesn't
7604            modify it while iterating over it.
7605    
7606            * test/test_connector.py
7607            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7608            unsubscribing in a receiver works correctly. See docstring for
7609            details
7610    
7611    2003-06-10  Bernhard Herzog  <[email protected]>
7612    
7613            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7614            message.
7615    
7616            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7617            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7618            LAYER_CHANGED will still be sent if the classification changes.
7619    
7620            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7621            parameter so we can subscribe to some of its messages
7622            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7623            and the layer's LAYER_SHAPESTORE_REPLACED
7624            (Classifier.unsubscribe_messages): New. Unsubscribe from message
7625            subscribed to in __init__
7626            (Classifier.map_layers_removed)
7627            (Classifier.layer_shapestore_replaced): receivers for the messages
7628            subscribed to in __init__. Unsubscribe and close the dialog
7629    
7630            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7631            the map to the Classifier dialog
7632    
7633            * test/test_layer.py (SetShapeStoreTests): Derive from
7634            SubscriberMixin as well so we can test messages
7635            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7636            messages
7637            (SetShapeStoreTests.tearDown): Clear the messages again
7638            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7639            for the modified flag too
7640            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7641            to check whether SetShapeStore sets the modified flag
7642            (SetShapeStoreTests.test_set_shape_store_different_field_name)
7643            (SetShapeStoreTests.test_set_shape_store_same_field)
7644            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7645            Add tests for the messages. This checks both the new
7646            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7647    
7648    2003-06-06  Jan-Oliver Wagner <[email protected]>
7649    
7650            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7651            the menu items.
7652    
7653    2003-06-05  Frank Koormann  <[email protected]>
7654    
7655            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7656            Layout reimplemented without panel. Make life easier to fit the list
7657            in the dialog.
7658    
7659    2003-06-05  Frank Koormann  <[email protected]>
7660    
7661            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7662            once on initialisation (Former implementation resulted in multiple
7663            entries for each projection).
7664            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7665            if set, select the projection found under the specified name. This
7666            overwrites any other selection estimate.
7667            Removed projchoice filling from this method.
7668            (ProjFrame._OnSave, ProjFrame._OnAddToList):
7669            Updated call of ProjFrame.__FillAvailList
7670            (LCCPanel._DoLayout): Moved parameter controls in more common order.
7671    
7672            * Resources/Projections/defaults.proj: Extended defaults representing
7673            various common European projections.
7674    
7675    2003-06-05  Frank Koormann  <[email protected]>
7676    
7677            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7678            Use ListCtrl instead of GridCtrl
7679    
7680            * Thuban/Model/resource.py:
7681            Guess location of .thuban directory from tempdir parent directory.
7682    
7683            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7684            Guess location of .thuban directory from tempdir parent directory.
7685    
7686    2003-06-04  Bernhard Herzog  <[email protected]>
7687    
7688            Do not cache the values returned by the tree widget's
7689            GetFirstChild and GetNextChild methods because it led to lots of
7690            segfaults. The new way requires more brute force but is more
7691            reliable.
7692    
7693            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7694            variable layer2id
7695            (LegendTree.find_layer): New method to do with brute force what
7696            layer2id tried to accomplish
7697            (LegendTree._OnMsgLayerChanged)
7698            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7699            Use find_layer instead of layer2id
7700            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7701            update layer2id anymore
7702            (LegendTree._OnMsgMapLayersRemoved)
7703            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7704    
7705    2003-06-03  Thomas Koester  <[email protected]>
7706    
7707            * Thuban/Model/classgen.py (GenQuantiles0): New function.
7708    
7709    2003-06-02  Bernhard Herzog  <[email protected]>
7710    
7711            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7712            New commands.
7713            (main_menu): Add the new commands.
7714            (MainWindow.TableRename): New. Implementation of the table_rename
7715            command.
7716            (MainWindow.RenameLayer): New. Implementation of the layer_rename
7717            command.
7718    
7719            * Thuban/Model/session.py (Session.AddTable): call self.changed to
7720            set the modified flag
7721    
7722            * test/test_session.py (TestSessionSimple.test_add_table): Test
7723            whether the modified flag is set properly
7724    
7725            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7726            instead of issue so that the modified flags get updated.
7727    
7728            * test/test_base.py (SomeTitledObject): Derive from Modifiable
7729            instead of Publisher to reflect reality better and to accomodate
7730            the fact that SetTitle now calls changed instead of issue
7731    
7732    2003-06-02  Bernhard Herzog  <[email protected]>
7733    
7734            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7735            acquisition has to happen before the try in a try-finally.
7736    
7737    2003-06-02  Bernhard Herzog  <[email protected]>
7738    
7739            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7740            possible that a layer is removed that is not currently selected in
7741            the legend so don't check for this.
7742    
7743    2003-05-30  Bernhard Herzog  <[email protected]>
7744    
7745            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7746            variables to None that have direct or indirect references to
7747            shapefiles or dbf files to make sure that they do go away and the
7748            files are closed.
7749    
7750    2003-05-30  Bernhard Herzog  <[email protected]>
7751    
7752            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7753            availImgListIndices when a new image list is created
7754            
7755    2003-05-30  Bernhard Herzog  <[email protected]>
7756    
7757            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7758            changing_selection to indicate whether the LegendTree code itself
7759            is currently changing the selection
7760            (LegendTree.normalize_selection): New method to normalize the
7761            selection by selecting the layer item even if the user clicked on
7762            the classification.
7763            (LegendTree._OnSelChanged): normalize the selection. This works
7764            around a bug in wx which doesn't keep track of the selection
7765            properly when subtrees are deleted.
7766    
7767    2003-05-30  Bernhard Herzog  <[email protected]>
7768    
7769            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7770            maximum and minimum scale factors.
7771    
7772            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7773            changes in classgen.py
7774    
7775    2003-05-30  Jonathan Coles   <[email protected]>
7776    
7777            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7778            all the methods functions. Fixes RTBug #1903.
7779    
7780            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7781            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7782            RTBug #1907.
7783    
7784            * Thuban/UI/classgen.py: Use classgen functions that were part
7785            of the ClassGenerator class. Put try/finally blocks around
7786            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7787            RTBug #1904.
7788    
7789            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7790    
7791            * Thuban/UI/legend.py: The legend was cleared and repopulated any
7792            time something changed which caused some state to be lost such
7793            as which children were expanded or collapsed. Fixes RTBug #1901.
7794            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7795            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7796            the legend but not in the map.
7797            (LegendTree.__FillTree): Move main functionality out into smaller
7798            methods that can be used by other methods.
7799            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7800            if they are available.
7801            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7802            that we override the wxTreeCtrl method. Iterate over children
7803            and call __RemoveLayer.
7804            (LegendTree.__AddLayer): New. Add a new layer to the legend.
7805            (LegendTree.__RemoveLayer): Remove a layer from the legend.
7806            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7807            Should only be called with the id of a layer branch.
7808            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7809            Returns the root item or creates one if necessary.
7810    
7811            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7812            ProjectRasterFile with tuple arguments instead of strings.
7813    
7814            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7815            with try/finally. Fixes RTBug #1904.
7816    
7817            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7818            with try/finally. Fixes RTBug #1904.
7819            (MapCanvas.FitSelectedToWindow): If a single point is selected
7820            simply center it on the display. Fixes RTBug #1849.
7821    
7822            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7823            to be compiled as a standalone app. Now the code can only be
7824            called from Python which simplifies the parameter passing.
7825            (ProjectRasterFile): Handle Python arguments. Remove code that
7826            checks for a destination dataset. Add more clean up code.
7827    
7828            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7829            TestMapWithContents.test_lower_layer_bottom):
7830            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7831            Fixes RTBug #1907.
7832    
7833            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7834            extent to the map when the legend is toggled. Fixes RTBug #1881.
7835    
7836    2003-05-29  Jan-Oliver Wagner <[email protected]>
7837    
7838            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
7839            unsubscribes all that is subcribed in __init__.
7840    
7841    2003-05-28  Bernhard Herzog  <[email protected]>
7842    
7843            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
7844            (MainWindow.CanDuplicateLayer): New methods to implement the
7845            Layer/Duplicate command.
7846            (layer_duplicate command): New.
7847            (main_menu): Add layer_duplicate to the Layer menu.
7848    
7849    2003-05-28  Bernhard Herzog  <[email protected]>
7850    
7851            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
7852            renderer so that NULL/None values get displayed differently (by a
7853            gray rectangle).
7854            (TableGrid.__init__): Override the default renderers
7855    
7856    2003-05-28  Bernhard Herzog  <[email protected]>
7857    
7858            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
7859            classification to "None" if the type of the field has changed.
7860    
7861            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
7862            test for the Layer.SetShapeStore method
7863    
7864    2003-05-28  Jan-Oliver Wagner <[email protected]>
7865    
7866            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
7867            does not necessarily have a filename).
7868    
7869    2003-05-28  Jan-Oliver Wagner <[email protected]>
7870    
7871            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
7872            sort the selection list for the dialog.
7873    
7874    2003-05-28  Frank Koormann  <[email protected]>
7875    
7876            * extensions/thuban/wxproj.cpp
7877            (project_point): Removed cast to int for projected point coordinates.
7878            (shape_centroid): Return last point if all polygon vertices fall
7879            to one point.
7880    
7881    2003-05-28  Bernhard Herzog  <[email protected]>
7882    
7883            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
7884            with layers that don't have shapestores, i.e. raster layers.
7885    
7886    2003-05-28  Bernhard Herzog  <[email protected]>
7887    
7888            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
7889            when determining the title from the filename.
7890    
7891            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
7892            reflect changes in the way the title is derived from the filename
7893    
7894    2003-05-28  Frank Koormann  <[email protected]>
7895    
7896            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
7897            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
7898    
7899    2003-05-27  Bernhard Herzog  <[email protected]>
7900    
7901            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
7902            delegate SelectedLayer.
7903            (MainWindow.LayerUnjoinTable): Implement.
7904            (_can_unjoin): New. Helper function for the sensitivity of the
7905            layer/unjoin command.
7906    
7907            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
7908            (DerivedShapeStore.OrigShapeStore): New. Return the original
7909            shapestore. Used to figure out how to unjoin.
7910            (DerivedShapeStore.Shapefile): Fix a typo.
7911    
7912    2003-05-27  Bernhard Herzog  <[email protected]>
7913    
7914            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
7915            well
7916            (JoinDialog.__init__): Use the layer parameter and only build the
7917            left choice when a layer is given
7918            (JoinDialog.OnJoin): Handle layer joins as well
7919            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
7920            that the user selects the "Select..." item. The sensitivitly
7921            updating is now in update_sensitivity
7922            (JoinDialog.y): New method to refactor the sensitivity update of
7923            the join button into its own method.
7924    
7925            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7926    
7927    2003-05-27  Bernhard Herzog  <[email protected]>
7928    
7929            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7930            iff there are unreferenced tables in the session
7931    
7932    2003-05-27  Bernhard Herzog  <[email protected]>
7933    
7934            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7935    
7936            * Thuban/Model/session.py (Session.UnreferencedTables): New method
7937            to return tables that are not referenced by other tables or shape
7938            stores and can be removed.
7939            (Session.RemoveTable): Issue a TABLE_REMOVED message after
7940            removing the table
7941    
7942            * Thuban/UI/mainwindow.py: Remove unused imports
7943            (MainWindow.TableClose): Implement.
7944    
7945            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7946            messages so that the frame will be automatically closed when a new
7947            session is opened or the table is removed.
7948            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7949            __init__
7950            (TableFrame.close_on_session_replaced)
7951            (TableFrame.close_on_table_removed): New. Subscribers that close
7952            the window
7953    
7954            * test/test_session.py (TestSessionMessages.test_remove_table)
7955            (TestSessionSimple.test_remove_table): Move the test to
7956            TestSessionSimple and add test for the TABLE_REMOVED message
7957            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7958            (TestSessionSimple.test_unreferenced_tables) New. Test for the
7959            UnreferencedTables method.
7960            (UnreferencedTablesTests): New. Class with some more sophisticated
7961            tests for UnreferencedTables.
7962    
7963    2003-05-27  Frank Koormann  <[email protected]>
7964    
7965            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7966            display has some unwanted side effects. Removed again.
7967    
7968    2003-05-27  Frank Koormann  <[email protected]>
7969    
7970            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7971    
7972            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7973    
7974    2003-05-27  Jan-Oliver Wagner <[email protected]>
7975    
7976            * test/test_menu.py (MenuTest.test): Added test for
7977            Menu.RemoveItem().
7978    
7979            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7980            the menu.
7981    
7982    2003-05-27  Frank Koormann  <[email protected]>
7983            
7984            Nonmodal dialogs without parent (i.e. they can fall behind the main
7985            window)
7986    
7987            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7988            all dialogs in the dialogs dictionary and the canvas.
7989    
7990            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7991            parent, i.e. can fall behind other windows.
7992            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7993            dictionary before removing it.
7994    
7995            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7996    
7997            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7998            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7999            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8000    
8001    2003-05-27  Bernhard Herzog  <[email protected]>
8002    
8003            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8004            tableview dialog
8005            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8006            Also, don't use the table's titles as the dialog names. The titles
8007            aren't guaranteed to be unique.
8008            (MainWindow.TableOpen): Open a table view dialog after opening the
8009            table
8010    
8011    2003-05-27  Bernhard Herzog  <[email protected]>
8012    
8013            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8014            effect can be achieved by simply closing the window showing the
8015            table.
8016            (MainWindow.TableHide): Removed.
8017            (main_menu): Removed "table_hide"
8018    
8019    2003-05-27  Frank Koormann  <[email protected]>
8020    
8021            Fix legend tree display problems under Win32
8022    
8023            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
8024            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8025            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8026    
8027            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8028    
8029    2003-05-27  Jan-Oliver Wagner <[email protected]>
8030    
8031            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8032            'after' now allows to insert separators almost anywhere in the menu.
8033    
8034    2003-05-27  Frank Koormann  <[email protected]>
8035    
8036            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8037            "S" of selection box label to hint on hot key (Alt-S). Works under
8038            Win32 but is ignored under GTK.
8039    
8040    2003-05-26  Frank Koormann  <[email protected]>
8041    
8042            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8043            Center Choices.
8044    
8045    2003-05-26  Bernhard Herzog  <[email protected]>
8046    
8047            Remove the Precision methods again. They're too DBF specific to be
8048            part of the table interface and they're only used in table_to_dbf
8049            anyway.
8050            
8051            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8052            fixed precision of 12 for doubles.
8053            (TransientTableBase.Precision): Removed
8054            (AutoTransientTable.Width): Delegate to self.table.
8055    
8056            * Thuban/Model/table.py (DBFTable.Precision)
8057            (MemoryTable.Precision): Removed.
8058            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8059            (table_to_dbf): Use a fixed precision of 12 for floats unless the
8060            column object specifies something else.
8061    
8062            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8063            test for table_to_dbf
8064    
8065    2003-05-26  Bernhard Herzog  <[email protected]>
8066    
8067            * test/test_transientdb.py
8068            (TestTransientTable.run_iceland_political_tests): Fix a comment.
8069    
8070    2003-05-26  Bernhard Herzog  <[email protected]>
8071    
8072            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8073            implementation. Mark parts of the file format strings for
8074            localization.
8075    
8076            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8077            file and add the table to the tables managed by the session
8078    
8079            * test/test_session.py (TestSessionSimple.test_open_table_file):
8080            New. test case for OpenTableFile
8081    
8082    2003-05-26  Jan-Oliver Wagner <[email protected]>
8083    
8084            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8085            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8086            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8087            Replace the true/false of wxWindows by True/False of Python 2.2.1.
8088    
8089    2003-05-26  Jan-Oliver Wagner <[email protected]>
8090    
8091            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8092            already a selection present, update the grid accordingly.
8093    
8094            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8095            resizeable and increase its initial size.
8096    
8097    2003-05-26  Frank Koormann  <[email protected]>
8098    
8099            Table export functionality
8100    
8101            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8102            Return width (in characters) for a column.
8103            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8104            (table_to_dbf): Write table to dbf file.
8105            (table_to_csv): Write table to csv file.
8106    
8107            * Thuban/Model/transientdb.py (TransientTableBase.Width,
8108            TransientTableBase.Precision): Return column width and precision.
8109    
8110            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8111            or table_to_csv depending on file selection.
8112    
8113            * test/test_dbf_table.py:
8114            Test table_to_dbf (extension of former part of test).
8115    
8116            * test/test_csv_table.py:
8117            Test table_to_csv.
8118    
8119    2003-05-23  Jan-Oliver Wagner <[email protected]>
8120    
8121            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8122            Use QueryTableFrame instead of TableFrame.
8123    
8124            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8125            table window with 'Layer Table:' instead of 'Table:'.
8126    
8127    2003-05-23  Jan-Oliver Wagner <[email protected]>
8128    
8129            Give all tables a title via mix-in TitledObject.LayerShowTable
8130    
8131            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8132            only if it exists.
8133    
8134            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8135            and call its init-method with a default title. Remove Title() method.
8136    
8137            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8138            AutoTransientTable): mix-in TitledObject and call its init-method with
8139            a default title. Remove Title() method.
8140    
8141    2003-05-23  Bernhard Herzog  <[email protected]>
8142    
8143            * Thuban/Model/session.py (Session.AddShapeStore): Define
8144            AddShapeStore analogously to AddTable.
8145    
8146            * test/test_session.py (TestSessionSimple.test_add_shapestore):
8147            New. Test for AddShapeStore
8148    
8149    2003-05-23  Jan-Oliver Wagner <[email protected]>
8150    
8151            Introducing QueryTableFrame and a very coarse ShowTable implementation.
8152    
8153            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8154            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8155            The latter implements the selection GUI without dependency on a layer.
8156            LayerTableFrame now is derived from QueryTableFrame and connects
8157            to a layer.
8158    
8159            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8160            implementation that still needs work.
8161    
8162            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8163    
8164    2003-05-22  Frank Koormann  <[email protected]>
8165    
8166            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8167            Added "outer_join = False" as optional parameter.
8168            (TransientJoinedTable.create): If outer join is true, perform a
8169            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8170            the left table. Records not matching are filled with 0 / None.
8171    
8172            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8173            (JoinDialog.OnJoin): Consider outer join check box.
8174    
8175    2003-05-22  Bernhard Herzog  <[email protected]>
8176    
8177            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8178            somewhat safer way. Storing the traceback in a local variable can
8179            lead to memory leaks
8180    
8181    2003-05-22  Bernhard Herzog  <[email protected]>
8182    
8183            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8184            the wxMessageDialog's Destroy() method.
8185    
8186    2003-05-22  Frank Koormann  <[email protected]>
8187    
8188            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8189            TransientTable.Title()
8190    
8191    2003-05-22  Frank Koormann  <[email protected]>
8192    
8193            Join Dialog, initial version.
8194    
8195            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8196    
8197            * Thuban/UI/join.py (JoinDialog): Functional implementation of
8198            former framework. Renamed Table1/Table2 to LeftTable/RightTable
8199            in all occurences.
8200    
8201            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8202            Typo fixed.
8203    
8204    2003-05-22  Bernhard Herzog  <[email protected]>
8205    
8206            Give the tables titles so that the GUI can display more meaningful
8207            names. For now the titles are fixed but depend on e.g. filenames
8208            or the titles of the joined tables.
8209    
8210            * Thuban/Model/transientdb.py (TransientTable.Title)
8211            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8212    
8213            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8214    
8215            * test/test_transientdb.py
8216            (TestTransientTable.test_auto_transient_table_title): New. Test
8217            for the Title method
8218            (TestTransientTable.test_transient_joined_table)
8219            (TestTransientTable.test_transient_table): Add test for the Title
8220            methods
8221    
8222            * test/test_memory_table.py (TestMemoryTable.test_title): New.
8223            Test for the Title method
8224    
8225            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8226            the Title method
8227    
8228    2003-05-22  Bernhard Herzog  <[email protected]>
8229    
8230            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8231            Provide a better way to destroy the layers
8232            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8233            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8234            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8235            the new way to destroy the layers.
8236            (TestLayer.test_derived_store): New. Test for using a layer with a
8237            DerivedShapeStore
8238    
8239            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8240            filename if the shape store actually has one.
8241    
8242    2003-05-22  Bernhard Herzog  <[email protected]>
8243    
8244            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8245            for the filename
8246    
8247            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8248            for the FileName method
8249            (TestDBFTableWriting.test_write): Fix spelling of filename
8250    
8251    2003-05-22  Thomas Koester  <[email protected]>
8252    
8253            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8254            from SciParam that now really is immutable.
8255    
8256    2003-05-22  Frank Koormann  <[email protected]>
8257    
8258            Layer Top/Bottom placement added to legend.
8259    
8260            * Thuban/UI/legend.py
8261            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8262            bound to tool events.
8263            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8264            New, methods binding the event methods with the map methods.
8265    
8266            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8267            layer at top/bottom of layer stack.
8268    
8269            * Resources/Bitmaps/top_layer.xpm: New button icon.
8270    
8271            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8272    
8273    2003-05-22  Bernhard Herzog  <[email protected]>
8274    
8275            * Thuban/Model/session.py (Session.RemoveTable): New method to
8276            remove tables
8277    
8278            * test/test_session.py (TestSessionSimple.test_remove_table): New.
8279            Test for RemoveTable
8280    
8281    2003-05-22  Thomas Koester  <[email protected]>
8282    
8283            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8284            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8285    
8286    2003-05-22  Bernhard Herzog  <[email protected]>
8287    
8288            Implement a way to discover dependencies between tables and
8289            shapestores.
8290    
8291            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8292            (TransientJoinedTable.Dependencies)
8293            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8294            interface
8295            (TransientJoinedTable.__init__): Keep tack of the original table
8296            objects in addition to the corresponding transient tables.
8297    
8298            * Thuban/Model/table.py (DBFTable.Dependencies)
8299            (MemoryTable.Dependencies): New. Implement the dependencies
8300            interface
8301    
8302            * Thuban/Model/data.py (ShapeTable): New. Helper class for
8303            ShapefileStore
8304            (ShapefileStore.__init__): Use ShapeTable instead of
8305            AutoTransientTable
8306            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8307            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8308            methods for filename and type
8309            (ShapefileStore.Dependencies): New. Implement the dependencies
8310            interface
8311            (DerivedShapeStore): New class to replace SimpleStore. The main
8312            difference to SimpleStore is that it depends not on a shapefile
8313            but another shapestore which expresses the dependencies a bit
8314            better
8315            (SimpleStore.__init__): Add deprecation warning.
8316    
8317            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8318            Test for the Dependencies method.
8319    
8320            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8321            New. Test for the Dependencies method.
8322    
8323            * test/test_transientdb.py
8324            (TestTransientTable.test_auto_transient_table_dependencies): New.
8325            Test for the Dependencies method.
8326            (TestTransientTable.test_transient_joined_table): Add test for the
8327            Dependencies method.
8328    
8329            * test/test_session.py (TestSessionSimple.setUp)
8330            (TestSessionSimple.tearDown): New. Implement a better way to
8331            destroy the sessions.
8332            (TestSessionSimple.test_initial_state)
8333            (TestSessionSimple.test_add_table): Bind session to self.session
8334            so that it's destroyed by tearDown
8335            (TestSessionSimple.test_open_shapefile): New. Test for
8336            OpenShapefile and the object it returns
8337    
8338    2003-05-22  Bernhard Herzog  <[email protected]>
8339    
8340            * Thuban/Model/session.py (Session.AddTable): New method to
8341            register tables with the session.
8342            (Session.Tables): Return the tables registered with AddTable too.
8343    
8344            * test/test_session.py (TestSessionSimple.test_add_table): New.
8345            Test case for the AddTable method
8346    
8347    2003-05-22  Frank Koormann  <[email protected]>
8348    
8349            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8350            lower right corner, center labels for selections, initialize controls
8351            in reasonable order for keyboard navigation.
8352    
8353            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8354            (ProjFrame.__DoOnProjAvail): Determine position of current projection
8355            using the wxListBox.FindString() method. Still a problem (#1886)
8356    
8357            * Thuban/UI/classifier.py
8358            (Classifier.__init__, SelectPropertiesDialog.__init__)
8359    
8360            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8361            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8362            different classification types from here to __init__.
8363            (GenUniquePanel.__init__): Set the column width of the first field
8364            in the Field ListCtrl to the full width.
8365    
8366            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8367            Button to 'Export'. Center Buttons in Selection Box, set Focus to
8368            Grid.
8369            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8370            changes focus to the Selection when pressing "Alt-S".
8371    
8372            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8373            the text if not visible. The italic font sometimes exceeds the
8374            rendering area.
8375    
8376    2003-05-21  Jonathan Coles   <[email protected]>
8377    
8378            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8379            to OnClose so that Thuban closes correctly.
8380    
8381            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8382            DockFrame.OnClose, not DockFrame._OnClose.
8383    
8384    2003-05-21  Jonathan Coles   <[email protected]>
8385    
8386            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8387            references to 'inf' and use new Range __init__ to pass floats
8388            directly rather than converting them to strings first.
8389            Fixes RTBug #1876.
8390    
8391            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8392            Use new Range ___init__ to pass floats.
8393    
8394            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8395            filename is a valid image file. Throw IOError otherwise.
8396    
8397            * Thuban/Model/range.py: Brought over new Range from SciParam that
8398            is immutable and has an __init__ which can accept floats.
8399    
8400            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8401            into try block. AddLayer doesn't throw any exceptions anymore.
8402            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8403            try block.
8404    
8405            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8406            the first item in choices. Fixes RTBug #1882.
8407    
8408            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8409            has gone to 0 which is a serious problem. abort.
8410            (MapRenderer.draw_raster_layer): Catch IOError seperately and
8411            print the error from GDAL.
8412    
8413            * Thuban/UI/tableview.py (TableGrid.__init__): Call
8414            ToggleEventListeners to turn on listening.
8415            (TableGrid.ToggleEventListeners): New. Turns event listening on
8416            and off so as to prevent excessive messages.
8417            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8418            to suppress excessive messages when selecting many rows.
8419            Fixes RTBug #1880.
8420    
8421            * Thuban/UI/view.py: Added checks against if scale == 0. This
8422            is a serious problem that can occur when an image without
8423            geo data is loading and causes the map projection bounds to
8424            go to infinity. Right now, the solution is to simply try
8425            to recover.
8426    
8427            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8428            to set the MFILEReceiver attributes even if the data is NULL.
8429    
8430            * extensions/thuban/gdalwarp.cpp: Improved the error handling
8431            and passed GDAL messages back up to the Python layer. Also
8432            tried to fix some memory leaks that were present in the original
8433            utility but didn't matter because the program aborted.
8434    
8435            * test/test_range.py: Copied over tests from SciParam. Removed
8436            tests against importing. Fixes RTBug #1867.
8437    
8438    2003-05-21  Bernhard Herzog  <[email protected]>
8439    
8440            * test/test_load.py: Remove unused imports and restructure the
8441            test code
8442            (LoadSessionTest): Split into one class for each test and turn
8443            LoadSessionTest itself into the base class for all such session
8444            tests.
8445            (ClassificationTest): New base class for load tests that test
8446            classifications
8447            (TestSingleLayer, TestLayerVisibility, TestClassification)
8448            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8449            for the individual tests
8450    
8451            * test/support.py (FileLoadTestCase.filename): New base class for
8452            file loading tests
8453    
8454    2003-05-21  Jan-Oliver Wagner <[email protected]>
8455    
8456            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8457            Mercator' to 'UTM Zone 32' as a more convenient example.
8458            Added 'Gauss Krueger Zone 6'.
8459    
8460            * Data/iceland_sample_raster.thuban: political polygon now
8461            filled transparent to have the raster image visible at once.
8462    
8463    2003-05-21  Frank Koormann  <[email protected]>
8464    
8465            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8466            OnClose() to keep in sync with extensions. Internally Thuban
8467            still uses "underscored" names.
8468    
8469    2003-05-20  Jonathan Coles   <[email protected]>
8470    
8471            This puts back Raster layer support. These layers support projections
8472            through the GDAL library. Currently, the CVS version is being used.
8473            There are no Debian packages available although this may change soon.
8474            A GDAL driver was extended to support writing to memory rather to
8475            files.
8476    
8477            There is still some work that needs to be done, such as some error
8478            handling when loading invalid images or when there is a problem
8479            projecting the image. This putback simply checks in the majority
8480            of the work.
8481    
8482            * setup.py: Add gdalwarp library extension.
8483    
8484            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8485            Defaults to False, but can be overridden by subclasses if they
8486            support classification.
8487            (RasterLayer): New. Defines a new layer that represents an
8488            image.
8489    
8490            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8491            tag handler.
8492            (SessionLoader.start_layer): Encode the filename.
8493            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8494            New. Supports reading a rasterlayer tag.
8495    
8496            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8497    
8498            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8499            get a string in Latin1. If we get such as string convert it to
8500            unicode first, otherwise leave if alone before encoding.
8501            (SessionSaver.write_layer): Add support for writing both Layers
8502            and RasterLayers.
8503    
8504            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8505            The right argument may not be a string, it could also be a Column.
8506    
8507            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8508            Make initial window size 600x400. Fixes RTBug #1872.
8509    
8510            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8511            the dialog is constructed so that we can support layers that
8512            do not have classifications.
8513            (Classifier._OnTry): Only build a classification if the layer
8514            supports one.
8515    
8516            * Thuban/UI/legend.py: Change all checks that a layer is an
8517            instance of Layer into checks against BaseLayer.
8518            (LegendTree.__FillTreeLayer): Only add children to a branch if
8519            the layer supports classification.
8520    
8521            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8522            MainWindow.OpenSession): Don't proceed with an action if the
8523            user chooses Cancel when they are asked to save changes.
8524            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8525            user to select an image file. Create a new RasterLayer and add
8526            it to the map.
8527    
8528            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8529            for rendering RasterLayer layers.
8530            (MapRenderer.draw_raster_layer): Actually method that calls
8531            the GDALWarp python wrapper and constructs an image from the
8532            data returned.
8533    
8534            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8535            Choices symbols to match those used in the table query method.
8536            Replace deprecated method calls on table with new method names.
8537    
8538            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8539            how small the scale can get. This still needs more testing.
8540    
8541            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8542            Provides a driver to output in .bmp format.
8543    
8544            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8545            New. Provides IO routines which write to memory, rather than a file.
8546    
8547            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8548            of the gdalwarp utility provided in GDAL. Added function calls
8549            that can be accessed from python.
8550    
8551            * Data/iceland_sample_raster.thuban: New. Sample file that uses
8552            a raster layer.
8553    
8554            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8555            layer image data.
8556    
8557            * Doc/thuban.dtd: Added rasterlayer attribute definition.
8558    
8559            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8560            tests associated with the raster layer code.
8561    
8562            * test/test_transientdb.py
8563            (TestTransientTable.test_auto_transient_table_query): Added a test
8564            for using a Column object as the "right" parameter to a query.
8565    
8566    2003-05-19  Frank Koormann  <[email protected]>
8567    
8568            * Thuban/version.py (get_changelog_date):
8569            Catch exceptions if ChangeLog does not exist.
8570    
8571            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8572    
8573    2003-05-19  Frank Koormann  <[email protected]>
8574    
8575            Extended version information for Thuban
8576    
8577            * Thuban/version.py: New, version information for Thuban: Last
8578            modification date and last ChangeLog entry date.
8579    
8580            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8581            information: Display Thuban, wxPython and Python version.
8582    
8583    2003-05-16  Bernhard Herzog  <[email protected]>
8584    
8585            * Thuban/Model/save.py: Remove some unused imports including the
8586            __future__ import for nested_scopes as Thuban relies on Python 2.2
8587            now.
8588            (XMLWriter.encode): Remove the special case for a None argument.
8589            In the saver encode is always called with a string argument.
8590    
8591    2003-05-16  Bernhard Herzog  <[email protected]>
8592    
8593            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8594            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8595            of the bug was that e.g. float("1.2") would fail. Thuban now
8596            requires 2.4.x.
8597            
8598    2003-05-16  Frank Koormann   <[email protected]>
8599    
8600            Printing enhancement and WMF export (under Win32)
8601    
8602            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8603            ScreenRenderer. Renders Map, Legend and Scalebar for export.
8604            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8605            PrintRender.
8606    
8607            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8608            to fullfil information needed for PrinterRenderer.
8609            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8610            (MapCanvas.Print): Adapted to new MapPrintout.
8611            (OutputTransform): General calculations to transform from canvas
8612            coordinates to export/printing devices.
8613    
8614            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8615            new method_command to call ExportMap, with platform dependency (only
8616            __WXMSW__)
8617      
8618            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8619            of scalebar drawing area as new parameters.
8620            
8621            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8622    
8623            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8624            Update to extended scalebar.DrawScalebar header.
8625    
8626            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8627    
8628            * test/test_scalebar.py: Made test executable as standalone.
8629    
8630    2003-05-16  Bernhard Herzog  <[email protected]>
8631    
8632            * Thuban/Model/table.py (Table): Remove this compatibility alias
8633            for DBFTable.
8634    
8635            * test/test_table.py: Import DBFTable as Table because that alias
8636            doesn't exist anymore.
8637    
8638            * Thuban/UI/classgen.py: Remove some unused imports
8639    
8640    2003-05-14  Jonathan Coles   <[email protected]>
8641    
8642            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8643            Fix docstring.
8644            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8645            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8646            values of the supplied range to determine the beginning and end
8647            bounds of the generated classes.
8648    
8649            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8650            do not have a leading 0 (.5 is now accepted as well as 0.5).
8651    
8652            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8653            call to ClassGenerator.GenUniformDistribution.
8654    
8655            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8656            layout bug with the 'Projection' label.
8657    
8658            * test/support.py (FloatTestCase): New. Needed for the Range tests.
8659    
8660            * test/test_range.py: New. Imported from SciParam.
8661    
8662    2003-05-12  Jonathan Coles   <[email protected]>
8663    
8664            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8665            to table.UniqueValues() with calls that retrieve all the values
8666            from the table. This will need to be replaced by a method on table
8667            which can simply return the list (perhaps more efficiently).
8668    
8669    2003-05-12  Jonathan Coles   <[email protected]>
8670    
8671            The return value of ClassGenerator.CalculateQuantiles has changed.
8672            Refer to the documentation for details.
8673    
8674            * test/test_classgen.py: Modified Quantile tests to use the
8675            new return values.
8676    
8677            * Thuban/Model/classgen.py
8678            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8679            use new return values from CalculateQuantiles to produce the correct
8680            range bounds in the Classification.
8681            (ClassGenerator.CalculateQuantiles): Add more comments describing
8682            the return values and parameters. Make minor adjustments to improve
8683            the legibility of the code. Fix problem with adjusted not being set
8684            in most cases.
8685    
8686    2003-05-12  Frank Koormann <[email protected]>
8687            
8688            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8689            and latin1. Fixes #1851 finally.
8690    
8691    2003-05-09  Jonathan Coles   <[email protected]>
8692    
8693            * test/test_classgen.py: New. Tests the Quantile algorithm.
8694    
8695            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8696            Clean up debugging statement, add comments, fix a small bug in the
8697            returned adjusted percentiles.
8698            
8699    2003-05-09  Jonathan Coles   <[email protected]>
8700    
8701            Introduces Range class from SciParam into the ClassGroupRange class,
8702            and such ranges can now be saved and loaded from disk.
8703    
8704            Quantiles are now available in the Classification Generator.
8705    
8706            Initial support for building Queries on a table. Doesn't do anything
8707            but run some tests.
8708    
8709            * Thuban/Model/classification.py: Explicit imports.
8710            (ClassGroupRange): Use the Range class to store the underlying
8711            range information. The interface remains the same, except for
8712            GetRange(), and you can also supply a Range object as the min
8713            parameter to SetRange or __init__.
8714    
8715            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8716            string appropriately for use in Thuban. Fixes RTbug #1851.
8717            (SessionLoader.end_projection): Handle the context of the
8718            projection tag a bit better by looking at what objects are not
8719            None. There was an assumption that a projection tag for a map
8720            could occur before any layers.
8721            (SessionLoader.start_clrange): Provide backward compatibility for
8722            reading min/max values as well as the new range parameter.
8723    
8724            * Thuban/Model/map.py: Explicit imports.
8725    
8726            * Thuban/Model/resource.py: Import _.
8727            (ProjFileSaver.write): write header using projfile.dtd.
8728    
8729            * Thuban/Model/save.py: Explicit imports.
8730            (XMLWriter.encode): New. Encode the given string from a format
8731            used by Thuban into UTF-8. Fixes RTbug #1851.
8732    
8733            * Thuban/UI/classgen.py: Explicit imports.
8734            (ClassGenDialog.__init__): Clean up the code and add support
8735            for Quantiles.
8736            (ClassGenDialog.OnOK): Add support for Quantiles.
8737            (GenQuantilesPanel): New. Input panel for Quantiles.
8738            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8739            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8740    
8741            * Thuban/Model/classgen.py: New. Contains all the classes named above.
8742    
8743            * Thuban/UI/classifier.py: Explicit imports.
8744            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8745            ClassTable.SetValueAsCustom): Reworked to use new Range class.
8746    
8747            * Thuban/UI/legend.py: Explicit imports.
8748    
8749            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8750            a Table menu and associated method calls.
8751            (MainWindow.choose_color): Removed. No longer needed.
8752    
8753            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8754            should be disabled if no projection is selected in the available
8755            list.
8756    
8757            * Thuban/UI/renderer.py: Explicit imports.
8758    
8759            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8760            with correctly selecting the rows and issuing the right events.
8761            Be sure to call Skip() to allow the grid to do some of its own
8762            handling which allows the rows to actually be selected.
8763            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8764            selecting multiple shapes.
8765            (LayerTableFrame): Support for building Queries.
8766            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8767    
8768            * Thuban/UI/tree.py: Explicit imports.
8769    
8770            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8771            table view can call it.
8772    
8773            * test/test_classification.py: Explicit imports.
8774            (TestClassification.test_ClassGroupRange): Fix test for new
8775            Range class.
8776    
8777            * Doc/thuban.dtd: Add range parameter for clrange.
8778    
8779            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8780            object in ClassGroupRange, and also uesd for inputting ranges in
8781            the classifer table and elsewhere.
8782    
8783            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8784            yet.
8785    
8786    2003-05-09  Frank Koormann <[email protected]>
8787    
8788            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8789    
8790    2003-05-08  Frank Koormann <[email protected]>
8791    
8792            Coding style updates
8793    
8794            * test/test_scalebar.py: Replaced tab indentation by spaces.
8795    
8796            * Thuban/UI/scalebar.py: Explicit imports.
8797    
8798    2003-05-08  Frank Koormann <[email protected]>
8799    
8800            * Thuban/UI/scalebar.py
8801            (ScaleBar.DrawScalebar): Format string bug fixed.
8802    
8803    2003-05-08  Frank Koormann <[email protected]>
8804    
8805            Reorganization of scalebar component (no wx in Thuban/Model)
8806    
8807            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8808            (deriveInterval):
8809            Calculate scalebar interval and unit which fits in width for scale.
8810            (roundInterval): Round float.
8811    
8812            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8813    
8814            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8815    
8816            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8817    
8818    2003-05-08  Frank Koormann <[email protected]>
8819    
8820            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8821            Initialize ScaleBar with canvas.map
8822    
8823            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8824            round intervals to display smarter lengths
8825            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8826            layer. If the maps has no projection applied grey the scalebar.
8827    
8828    2003-05-07  Frank Koormann <[email protected]>
8829            
8830            Basic Scalebar features added.
8831    
8832            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8833    
8834            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8835            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
8836            and the renderer.
8837    
8838            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
8839    
8840            * Thuban/UI/messages.py: SCALE_CHANGED added.
8841    
8842    2003-05-07  Bernhard Herzog  <[email protected]>
8843    
8844            * Thuban/Model/session.py (Session.__init__): New instance
8845            variable shapestores to hold a list of all open shapestore objects
8846            (Session.ShapeStores): New. Accessor method for the shapestores
8847            list.
8848            (Session._add_shapestore, Session._clean_weak_store_refs): New.
8849            Internal methods to maintain the shapestores list.
8850            (Session.Tables): New. Return all tables open in the session.
8851            (Session.OpenShapefile): Insert the new ShapeStore into the
8852            shapestores list.
8853    
8854            * test/test_session.py (TestSessionSimple.test_initial_state): Add
8855            tests for ShapeStores and Tables
8856            (TestSessionWithContent.test_shape_stores)
8857            (TestSessionWithContent.test_tables): New. Test cases for
8858            ShapeStores and Tables
8859    
8860    2003-05-07  Bernhard Herzog  <[email protected]>
8861    
8862            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
8863            Add comments about the optimizations used.
8864            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
8865            Implement the ReadValue table interface method.
8866    
8867            * test/test_transientdb.py
8868            (TestTransientTable.run_iceland_political_tests)
8869            (TestTransientTable.test_transient_joined_table): Add tests for
8870            ReadValue
8871    
8872    2003-05-07  Frank Koormann <[email protected]>
8873    
8874            * Resources/Bitmaps/fulllayerextent.xpm,
8875            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
8876            new icons.
8877    
8878    2003-05-06  Bernhard Herzog  <[email protected]>
8879    
8880            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8881            New. Simply delegate to the transient table's version.
8882    
8883            * test/test_transientdb.py
8884            (TestTransientTable.test_auto_transient_table_query): New. Test
8885            case for AutoTransientTable's SimpleQuery
8886    
8887    2003-05-06  Bernhard Herzog  <[email protected]>
8888    
8889            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
8890            Implement a simple query method for the query dialog
8891            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
8892            the row index or shapeid.
8893            (TransientTable.create): Insert the right value of the row index
8894            (TransientJoinedTable.create): Copy the row index of the left
8895            table to the joined result table
8896    
8897            * test/test_transientdb.py
8898            (TestTransientTable.test_transient_table_read_twice): Fix
8899            doc-string
8900            (TestTransientTable.test_transient_table_query): New. Test for the
8901            SimpleQuery method
8902    
8903    2003-05-06  Bernhard Herzog  <[email protected]>
8904    
8905            Convert all table users to use the new table interface. This only
8906            covers Thuban itself, not GREAT-ER or other applications built on
8907            Thuban yet, so the compatibility interface stays in place for the
8908            time being but it now issues DeprecationWarnings.
8909    
8910            Finally, the new Table interface has a new method, HasColumn.
8911    
8912            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
8913            issue deprecation warnings when they're. The warnings refer to the
8914            caller of the method.
8915            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
8916            for the deprecation warnings
8917    
8918            * test/test_table.py: Ignore the deprecation warnings for the old
8919            table in the tests in this module. The purpose of the tests is to
8920            test the old interface, after all.
8921    
8922            * test/test_transientdb.py
8923            (TestTransientTable.run_iceland_political_tests): Use the
8924            constants for the types. Add a test for HasColumn
8925            (TestTransientTable.test_transient_joined_table): Adapt to new
8926            table interface. Add a test for HasColumn
8927            (TestTransientTable.test_transient_table_read_twice): Adapt to new
8928            table interface
8929    
8930            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8931            Adapt to new table interface
8932    
8933            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8934            new table interface
8935    
8936            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8937            (RecordTable.SetTable): Adapt to new table interface
8938    
8939            * Thuban/UI/classifier.py (Classifier.__init__)
8940            (Classifier.__init__): Adapt to new table interface
8941    
8942            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8943            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8944            to new table interface
8945    
8946            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8947            (AutoTransientTable.HasColumn): Implement the new table interface
8948            method
8949            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8950            (AutoTransientTable.UniqueValues): Adapt to new table interface
8951    
8952            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8953            Adapt to new table interface
8954    
8955            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8956            simplify opening shapefiles a bit easier.
8957            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8958            (TestLayer.test_point_layer): Use the new helper method
8959            (TestLayer.test_get_field_type): New. Test for the GetFieldType
8960            method
8961    
8962            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8963            the new table method
8964    
8965            * test/test_memory_table.py (TestMemoryTable.test_has_column):
8966            Test for the new table method HasColumn
8967    
8968    2003-05-06  Jonathan Coles   <[email protected]>
8969    
8970            Addresses the "Selection Extent" wish of RTbug #1787.
8971    
8972            * Resources/Bitmaps/fulllayerextent.xpm,
8973            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8974            extent. These are just place holders for the real bitmaps.
8975    
8976            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8977            calculate the bounding box once (the first time compute_bbox() is
8978            called).
8979            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8980            the bounding box for the shapes in lat/long coordinates.
8981    
8982            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8983            option.
8984            (MainWindow.has_selected_shapes): New. Returns true if there are
8985            any selected shapes.
8986            (MainWindow.FullSelectionExtent): New. Calls
8987            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8988            (_has_selected_shapes): New. Returns true if there are any
8989            selected shapes.
8990    
8991            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8992            true if there are any selected shapes.
8993    
8994            * Thuban/UI/view.py (MapCanvas): Added delegated method
8995            HasSelectedShapes.
8996            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8997            shapes on the canvas using the map projection (if any).
8998    
8999            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9000            for Layer.ShapesBoundingBox().
9001    
9002    2003-05-06  Bernhard Herzog  <[email protected]>
9003    
9004            * Resources/Projections/defaults.proj: Fix spelling of Mercator
9005    
9006    2003-05-05  Jonathan Coles   <[email protected]>
9007    
9008            Addresses the "Full Layer Extent" wish of RTbug #1787.
9009    
9010            * Resources/Projections/defaults.proj: Added UK National Grid.
9011    
9012            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9013            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9014            when the user selects the menu option.
9015    
9016            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9017            scales the given layer on the canvas using the map projection.
9018    
9019    2003-05-05  Bernhard Herzog  <[email protected]>
9020    
9021            Convert the table implementations to a new table interface. All
9022            tables use a common mixin class to provide backwards compatibility
9023            until all table users have been updated.
9024    
9025            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9026            provide backwards compatibility for table classes implementing the
9027            new interface
9028            (DBFTable, MemoryTable): Implement the new table interface. Use
9029            OldTableInterfaceMixin as base for compatibility
9030            (DBFColumn, MemoryColumn): New. Column description for DBFTable
9031            and MemoryTable resp.
9032    
9033            * test/test_dbf_table.py: New. Test cases for the DBFTable with
9034            the new table interface.
9035    
9036            * test/test_memory_table.py: New. Test cases for the MemoryTable
9037            with the new table interface.
9038    
9039            * test/test_table.py: Document the all tests in this file as only
9040            for backwards compatibility. The equivalent tests for the new
9041            interface are in test_memory_table.py and test_dbf_table.py
9042            (MemoryTableTest.test_read): field_info should be returning tuples
9043            with four items
9044            (MemoryTableTest.test_write): Make doc-string a more precise.
9045    
9046            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9047            table interface. Derive from from OldTableInterfaceMixin for
9048            compatibility.
9049            (TransientTableBase.create): New intance variable column_map to
9050            map from names and indices to column objects
9051            (TransientTable.create): Use the new table interface of the input
9052            table
9053            (AutoTransientTable): Convert to new table interface. Derive from
9054            from OldTableInterfaceMixin for compatibility.
9055            (AutoTransientTable.write_record): Removed. It's not implemented
9056            yet and we still have to decide how to handle writing with the new
9057            table and data framework.
9058    
9059            * test/test_transientdb.py
9060            (TestTransientTable.run_iceland_political_tests)
9061            (TestTransientTable.test_transient_joined_table): Use the new
9062            table interface
9063    
9064    2003-05-05  Jonathan Coles   <[email protected]>
9065    
9066            This is namely a collection of UI updates to improve user interactivity.
9067            Tabbing between controls now exists and you can use ESC to close dialog
9068            boxes; ENTER will active the default button.
9069    
9070            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9071            order that the controls are created so that tabbing works correctly.
9072            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9073            wxDialog can handle the default button correctly.
9074            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9075            same reasons as for OnOK.
9076            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9077            when we ask the table for the maximum/minimum values of a field
9078            which could take a very long time.
9079    
9080            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9081            order that the controls are created so that tabbing works correctly.
9082            (SelectPropertiesDialog.__init__): Rearrange the order that the
9083            controls are created so that tabbing works correctly.
9084    
9085            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9086            to derive from a wxDialog but behave like the original implementation
9087            which was derived from a wxFrame. wxDialog provides useful key
9088            handling functionality like ESC calling OnCancel and ENTER calling
9089            OnOK which is lost with wxFrame.
9090    
9091            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9092            new dialogs.
9093    
9094            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9095            order that the controls are created so that tabbing works correctly.
9096            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9097            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9098            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9099            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9100            can provide the "UK National Grid" as a default projection.
9101            (UTMPanel.__init__): Rearrange the order that the controls are
9102            created so that tabbing works correctly.
9103    
9104    2003-05-05  Bernhard Herzog  <[email protected]>
9105    
9106            * extensions/thuban/wxproj.cpp: Fix some of the comments.
9107            (project_point): If a map projection but no layer projection is
9108            given, convert degrees to radians before applying the map
9109            projection.
9110    
9111            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9112            (TableGrid.allow_messages): New methods to make it possible to
9113            inhibit message sending.
9114            (TableGrid.issue): Only send the message if not inhibited.
9115            (LayerTableGrid.select_shape): Use the new methods to make sure
9116            that no ROW_SELECTED message is sent while we're updating the
9117            selected rows to match the selected shapes.
9118    
9119    2003-05-02  Jan-Oliver Wagner <[email protected]>
9120    
9121            Implementation of MemoryTable.
9122    
9123            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9124            implementation that operates on a list of tuples. All of the data
9125            are kept in the memory.
9126    
9127            * test/test_table.py (MemoryTableTest): New.
9128    
9129            * test/test_transientdb.py (SimpleTable): Removed.
9130            (TestTransientTable.test_transient_joined_table,
9131            (TestTransientTable.test_transient_table_read_twice): Replaced
9132            SimpleTable by MemoryTable.
9133    
9134    2003-04-30  Jonathan Coles   <[email protected]>
9135    
9136            * Data/iceland_sample.thuban: Now contains correct projections
9137            for each of the layers.
9138    
9139            * Resources/Projections/defaults.proj: Geographic projection
9140            contains unit conversion parameter.
9141    
9142    2003-04-30  Jonathan Coles   <[email protected]>
9143    
9144            The most important part of this putback is the projection changes.
9145            It should now be possible to specify the projection that a layer
9146            is in and then specify a different projection for the map. The
9147            projection dialog has an extra parameter for a geographic projection
9148            which lets the user select if the input is in degrees or radians.
9149    
9150            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9151            to say that the parameter is a tuple of unprojected
9152            points (which is what the callers to this method were assuming).
9153            Also, since the points are unprojected we need to projected them.
9154    
9155            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9156            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9157            groups are selected, move the layer up/down. Fixes RTbug #1833.
9158    
9159            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9160    
9161            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9162            parameter in call to SetClientData.
9163            (GeoPanel): Add support for selecting the units that the
9164            source data is in (Radians or Degrees).
9165    
9166            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9167            the rendering loop by reducing the number of if's, removing the
9168            unnecessary try/except block, and checking if the old group
9169            is the same as the new one (which happens a lot if there is
9170            no classification, or lots of shapes are in the same group).
9171    
9172            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9173            around the redraw routine to try to catch problems that the user
9174            may create by selecting invalid projections for the data set and
9175            map. Clears the display if there are any problems and prints the
9176            error.
9177            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9178            rectangle.
9179    
9180            * extensions/thuban/wxproj.cpp (project_point): First invert the
9181            supplied point (which should be in projected coordinates) using
9182            the layer's projection and then project the point using the
9183            map's projection.
9184            (project_points): Use project_point() to project each point.
9185    
9186    2003-04-30  Jan-Oliver Wagner <[email protected]>
9187    
9188            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9189            don't set the Classification to None if the classfication field
9190            is None (ie only a DEFAULT).
9191    
9192    2003-04-30  Bernhard Herzog  <[email protected]>
9193    
9194            * Thuban/UI/view.py: Fix some typos.
9195    
9196            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9197            not pop up the dialog if the selection becomes empty (this could
9198            happen if e.g. a new selection is opened while the identify tool
9199            is active and dialog had been closed)
9200    
9201    2003-04-30  Bernhard Herzog  <[email protected]>
9202    
9203            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9204            instance variable read_record_last_result
9205            (TransientTableBase.read_record): Make sure reading the same
9206            record twice works. The implementation uses the new instance
9207            variable read_record_last_result
9208    
9209            * test/test_transientdb.py
9210            (TestTransientTable.test_transient_table_read_twice): New test
9211            case for the above bug-fix.
9212    
9213    2003-04-29  Jonathan Coles   <[email protected]>
9214    
9215            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9216    
9217            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9218    
9219            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9220            (ClassTable.SetValueAsCustom): Rename keyword argument in
9221            ClassGroup* constructors to match argument name.
9222    
9223    2003-04-29  Bernhard Herzog  <[email protected]>
9224    
9225            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9226            transient DB if it exists to make sure it doesn't leave a journal
9227            file in the temp directory.
9228    
9229            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9230            self.conn to None after closing the connection to make sure it's
9231            not closed twice
9232    
9233    2003-04-29  Jonathan Coles   <[email protected]>
9234    
9235            Add a visible parameter in the layer XML tag. The default value is
9236            "true". If anything other than "false" is specified we also assume
9237            "true". Addresses RTbug #1025.
9238    
9239            * Doc/thuban.dtd: Add visible parameter to a layer.
9240    
9241            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9242            of visible from 1 to True.
9243            (Layer.__init__): Change default value of visible from 1 to True.
9244    
9245            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9246            parameter.
9247    
9248            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9249            parameter.
9250    
9251            * test/test_load.py: Add new test data contents_test_visible.
9252            (LoadSessionTest.setUp): save test data.
9253            (LoadSessionTest.testLayerVisibility): Test if the visible flag
9254            is loaded correctly.
9255    
9256            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9257            for saving an invisible layer.
9258    
9259    2003-04-29  Jonathan Coles   <[email protected]>
9260    
9261            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9262            legend dialog box and tell it to change its map to the one
9263            supplied to SetMap(). Fixes RTbug #1770.
9264    
9265    2003-04-29  Bernhard Herzog  <[email protected]>
9266    
9267            Next step of table implementation. Introduce a transient database
9268            using SQLite that some of the data is copied to on demand. This
9269            allows us to do joins and other operations that require an index
9270            for good performance with reasonable efficiency. Thuban now needs
9271            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9272            haven't tested that.
9273            
9274            * Thuban/Model/transientdb.py: New. Transient database
9275            implementation.
9276    
9277            * test/test_transientdb.py: New. Tests for the transient DB
9278            classes.
9279    
9280            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9281            classes to help automatically remove temporary files and
9282            directories.
9283            (Session.__init__): New instance variables temp_dir for the
9284            temporary directory and transient_db for the SQLite database
9285            (Session.temp_directory): New. Create a temporary directory if not
9286            yet done and return its name. Use AutoRemoveDir to have it
9287            automatically deleted
9288            (Session.TransientDB): Instantiate the transient database if not
9289            done yet and return it.
9290    
9291            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9292            AutoTransientTable so that data is copied to the transient DB on
9293            demand.
9294            (SimpleStore): New class that simply combines a table and a
9295            shapefile
9296    
9297            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9298            DBFTable and update its doc-string to reflect the fact that this
9299            is only the table interface to a DBF file. Table is now an alias
9300            for DBFTable for temporary backwards compatibility.
9301    
9302            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9303            the last reference to the session goes away so that the temporary
9304            files are removed properly.
9305    
9306            * test/test_load.py (LoadSessionTest.tearDown): Remove the
9307            reference to the session to make sure the temporary files are
9308            removed.
9309    
9310    2003-04-29  Bernhard Herzog  <[email protected]>
9311    
9312            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9313            the __parser instance variable into a normal local variable in
9314            read. It's only used there and read will never be called more than
9315            once. Plus it introduces a reference cycle that keeps can keep the
9316            session object alive for a long time.
9317    
9318    2003-04-29  Jonathan Coles   <[email protected]>
9319    
9320            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9321            Projection an immutable item. Fixes RTbug #1825.
9322            (Projection.__init__): Initialize instance variables here.
9323            (ProjFile.Replace): New. Replace the given projection object with
9324            the new projection object. This solves the problem of needing the
9325            mutator Projection.SetProjection() in the ProjFrame class and
9326            allows a projection to change parameters without changing its
9327            location in the file.
9328    
9329            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9330            be of type wxSAVE and should verify overwriting a file.
9331    
9332            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9333            ProjFile.Replace() method instead of the mutator
9334            Projection.SetProjection(). Also requires that we reassign the
9335            client data to the new projection.
9336    
9337            * test/test_proj.py (TestProjection.test): Test GetName() and
9338            GetAllParameters()
9339            (TestProjFile.test): Remove tests for Set*() methods. Add tests
9340            for Replace().
9341    
9342    2003-04-25  Jonathan Coles   <[email protected]>
9343    
9344            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9345            to save the name of the projection.
9346    
9347            * test/test_save.py (SaveSessionTest.testLayerProjection): New
9348            test to verify layer projections are saved correctly.
9349    
9350    2003-04-25  Jonathan Coles   <[email protected]>
9351    
9352            * Thuban/Model/proj.py (Projection.SetName): Set the name
9353            to "Unknown" if name is None.
9354            (Projection.SetAllParameters): New. Set the projection's
9355            parameter list to the one supplied.
9356            (Projection.SetProjection): New. Set the projection's
9357            properties to those of the supplied Projection.
9358    
9359            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9360            the dialog title to include the map's title.
9361            (MainWindow.LayerProjection): Set the dialog title to include
9362            the layer's title.
9363    
9364            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9365            error dialogs into a single method call.
9366            (ProjFrame.__VerifyButtons): Add more states to check.
9367            (ProjFrame.__GetProjection): Return the current state of an
9368            edited projection or None.
9369            (ProjFrame.__FillAvailList): Remove checks for states that
9370            shouldn't exist.
9371            (ProjFrame._OnNew): Clear all selected items and supply
9372            a projection panel if necessary.
9373    
9374            * test/test_proj.py (TestProjFile.test): Add tests for
9375            ProjFile.SetAllParameters, ProjFile.SetProjection,
9376            ProjFile.SetName.
9377    
9378    2003-04-25  Jonathan Coles   <[email protected]>
9379    
9380            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9381            takes an optional argument to select the current projection.
9382            This does not guarantee that the item is visible due to
9383            limited wxWindows functionality. Fixes RTBug #1821.
9384    
9385    2003-04-25  Jonathan Coles   <[email protected]>
9386    
9387            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9388            the projection name and use it when constructing the Projection
9389            object.
9390    
9391            * Thuban/Model/proj.py (Projection.__init__): Change the default
9392            value for 'name' to None and then test if name is equal to None
9393            in the body of the constructor. This way the caller doesn't have to
9394            know what the default value should be. Namely, useful in load.py
9395            where we have to pick a default value if the 'name' parameter
9396            doesn't exist in the XML file.
9397    
9398            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9399            Tests a file where a layer has a projection.
9400    
9401    2003-04-25  Jonathan Coles   <[email protected]>
9402    
9403            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9404            tree for projection information.
9405    
9406            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9407            XMLReader.GetFileName.
9408            (SessionLoader): Added support for loading projection tags that
9409            appear inside a layer.
9410    
9411            * Thuban/Model/proj.py (ProjFile): Document the class. Move
9412            back to using a list because the order of the projections in
9413            the file is important to maintain. Fixes RTbug #1817.
9414    
9415            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9416            to ProjFile.GetFilename.
9417    
9418            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9419            information.
9420    
9421            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9422            ProjFrame._OnSaveAs. Removed old dead code from previous
9423            implementation.
9424            (ProjFrame._OnExport): Add support for exporting more than one
9425            projection to a single file.
9426            (ProjFrame.__FillAvailList): use string formatting (% operator)
9427            to build strings that are (partly) translated. Fixes RTbug #1818.
9428    
9429            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9430            class.
9431    
9432    2003-04-24  Bernhard Herzog  <[email protected]>
9433    
9434            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9435    
9436            * po/fr.po: New. French translation by Daniel Calvelo Aros
9437    
9438            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9439            empty strings.
9440    
9441    2003-04-24  Jonathan Coles   <[email protected]>
9442    
9443            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9444            implement the interface that the ProjFrame dialog expects.
9445    
9446            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9447            name of the projection to be changed.
9448            (ProjFile): Use a dictionary instead of a list so that removing
9449            projections is easier and we are sure about uniqueness.
9450            (ProjFile.Remove): Remove the given projection object.
9451    
9452            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9453            Return a list with only one projection file instead of searching for
9454            any projection file. This simplifies many things if the user can
9455            only have one system file and one user file.
9456    
9457            * Thuban/UI/classgen.py: Change all references to
9458            genCombo to genChoice.
9459    
9460            * Thuban/UI/mainwindow.py: Add a Projection option under the
9461            layer menu.
9462            (MainWindow.LayerProjection): New. Open up a projection window
9463            for a layer.
9464    
9465            * Thuban/UI/projdialog.py: Large changes to how the dialog is
9466            laid out. Use three panels instead of one. One for the list of
9467            projections, one for the edit controls, and one for the buttons.
9468            Fixed resizing problems so that the dialog resizes correctly
9469            when the projection panel changes. Added import/export, save, and
9470            new buttons/functionality.
9471    
9472    2003-04-24  Bernhard Herzog  <[email protected]>
9473    
9474            First step towards table management. Introduce a simple data
9475            abstraction so that we replace the data a layer uses more easily
9476            in the next step.
9477    
9478            * Thuban/Model/data.py: New file with a simple data abstraction
9479            that bundles shapefile and dbffile into one object.
9480    
9481            * Thuban/Model/session.py (Session.OpenShapefile): New method to
9482            open shapefiles and return a shape store object
9483    
9484            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9485            object instead of a shapefile filename. This introduces a new
9486            instance variable store holding the datastore. For intermediate
9487            backwards compatibility keep the old instance variables.
9488            (open_shapefile): Removed. No longer needed with the shape store.
9489            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9490            get the shape store used by a layer.
9491            (Layer.Destroy): No need to explicitly destroy the shapefile or
9492            table anymore.
9493    
9494            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9495            (MainWindow.AddLayer): Use the session's OpenShapefile method to
9496            open shapefiles
9497    
9498            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9499            session's OpenShapefile method to open shapefiles
9500    
9501            * test/test_classification.py
9502            (TestClassification.test_classification): Use the session's
9503            OpenShapefile method to open shapefiles and build the filename in
9504            a more platform independed way
9505    
9506            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9507            Implement to have a session to use in the tests
9508            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9509            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9510            session's OpenShapefile method to open shapefiles
9511            (TestLayerLegend.setUp): Instantiate a session so that we can use
9512            it to open shapefiles.
9513            (TestLayerLegend.tearDown): Make sure that all references to
9514            layers and session are removed otherwise we may get a resource
9515            leak
9516    
9517            * test/test_map.py (TestMapAddLayer.test_add_layer)
9518            (TestMapWithContents.setUp): Instantiate a session so that we can
9519            use it to open shapefiles.
9520            (TestMapWithContents.tearDown): Make sure that all references to
9521            layers, maps and sessions are removed otherwise we may get a
9522            resource leak
9523            ("__main__"): use support.run_tests() so that more info about
9524            uncollected garbage is printed
9525    
9526            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9527            session's OpenShapefile method to open shapefiles
9528            ("__main__"): use support.run_tests() so that more info about
9529            uncollected garbage is printed
9530    
9531            * test/test_selection.py (TestSelection.tearDown): Make sure that
9532            all references to the session and the selection are removed
9533            otherwise we may get a resource leak
9534            (TestSelection.get_layer): Instantiate a session so that we can
9535            use it to open shapefiles.
9536            ("__main__"): use support.run_tests() so that more info about
9537            uncollected garbage is printed
9538    
9539            * test/test_session.py (TestSessionBase.tearDown)
9540            (TestSessionWithContent.tearDown): Make sure that all references
9541            to the session and layers are removed otherwise we may get a
9542            resource leak
9543            (TestSessionWithContent.setUp): Use the session's OpenShapefile
9544            method to open shapefiles
9545    
9546    2003-04-24  Jonathan Coles   <[email protected]>
9547    
9548            * Thuban/Model/load.py (XMLReader.read): Should have been checking
9549            if the file_or_filename object had the 'read' attribute.
9550    
9551    2003-04-23  Jonathan Coles   <[email protected]>
9552    
9553            * Thuban/Model/resource.py: Fixes RTbug #1813.
9554            (ReadProjFile): Add documentation about which exceptions are raised.
9555            Always pass the exceptions up to the caller.
9556            (GetProjFiles): If the directory can't be read return an empty list.
9557            If any of the proj files can't be read skip that file and go
9558            on to the next one.
9559    
9560            * test/test_proj.py: Added test cases to handle nonexistent files,
9561            unreadable files, and files that don't parse correctly.
9562    
9563    2003-04-23  Jonathan Coles   <[email protected]>
9564    
9565            Projection dialog. Allows the user to select from a list
9566            of projection templates and optionally edit them and save new ones.
9567    
9568            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9569            (ProjPanel): Base class for projection specific panels.
9570            (TMPanel): Projection panel for Transverse Mercartor.
9571            (UTMPanel): Projection panel for Universal Transverse Mercartor.
9572            (LCCPanel): Projection panel for Lambert Conic Conformal.
9573            (GeoPanel): Projetion panel for Geographic Projection.
9574    
9575    2003-04-23  Jonathan Coles   <[email protected]>
9576    
9577            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9578            promote symmetry. There now exists XMLReader and XMLWriter.
9579            (XMLReader.read): New. Call to read the given file descriptor or
9580            filename.
9581            (XMLReader.close): New. Make sure the file is closed.
9582            (XMLReader.GetFileName): New. Return just the file name that is being
9583            read from.
9584            (XMLReader.GetDirectory): New. Return just the directory of the file
9585            that is being read.
9586            (XMLReader.AddDispatchers): New. Take a dictionary which contains
9587            the names of functions to call as the XML tree is parsed.
9588            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9589            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9590            (SessionLoader): Removed class variables start_dispatcher and
9591            end_dispatcher since this functionality is now part of a class
9592            instance. Fixes RTbug #1808.
9593            (SessionLoader.__init__): Add dispatcher functions.
9594            (load_xmlfile): Code was moved into the XMLReader.read().
9595            (load_session): Use modified SessionLoader.
9596    
9597            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9598            map's projection.
9599    
9600            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9601            GetAllParameters.
9602            (Projection.GetParameter): Returns the value for the given parameter.
9603    
9604            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9605            (GetProjFiles): Renamed from GetProjections. Now returns a list
9606            of ProjFile objects.
9607            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9608            a list of ProjFile objects whose files are not user defined.
9609            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9610            list of ProjFile objects whose files are user defined.
9611            (ProjFileReader): Extend new XMLReader.
9612    
9613            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9614            promote symmetry.
9615    
9616            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9617            control instead of a wxComboBox. wxChoice controls do not generate
9618            events as the uses highlights possible choices which fixes problems
9619            with resizing the dialog when the use selects an option.
9620    
9621            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9622            control instead of a wxComboBox.
9623    
9624            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9625            dialog.
9626    
9627            * test/test_proj.py (TestProjection.test): New tests for GetParameter
9628            method.
9629    
9630    2003-04-22  Bernhard Herzog  <[email protected]>
9631    
9632            * Thuban/UI/mainwindow.py: Remove some unused imports and global
9633            constants
9634    
9635            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9636            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9637    
9638    2003-04-17  Bernhard Herzog  <[email protected]>
9639    
9640            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9641            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9642            anymore.
9643            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9644            (Layer.ShapeType, Layer.Shape): No need to call
9645            self.open_shapefile since it's always called in __init__
9646    
9647            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9648            In wxPython 2.4 there's no need to extend MainLoop anymore since
9649            wxPython itself makes sure OnExit is called.
9650    
9651    2003-04-16  Jonathan Coles   <[email protected]>
9652    
9653            Initial putback of projection management code. Includes new
9654            classes to read and write projection files. The current load
9655            and save classes were abstracted a bit so they could be reused.
9656            The Projection class was extended to provide new methods and
9657            have a name.
9658    
9659            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9660            general XML reading methods that were part of ProcessSession.
9661    
9662            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9663            name.
9664            (ProjFile): New. Represents a file that contains projection
9665            information.
9666    
9667            * Thuban/Model/resource.py: New. Contains general utilities
9668            for read and writing projection files.
9669    
9670            * Thuban/Model/save.py (XMLSaver): New. Contains all the
9671            general XML writing methods that were part of SessionSaver.
9672            (SessionSaver): Renamed from Saver.
9673    
9674            * test/test_proj.py: New test cases for the projection
9675            file read and write functions.
9676    
9677    2003-04-16  Jonathan Coles   <[email protected]>
9678    
9679            * Thuban/Model/classification.py: Use repr() around values
9680            in the ClassGroup*.__repr__() methods so it is clearer when
9681            a value is a string and when it is a number.
9682    
9683            * test/test_load.py: Rework the classification test to test
9684            that we can load old files.
9685            (testLabels): Test a file where the groups have labels.
9686    
9687    2003-04-16  Bernhard Herzog  <[email protected]>
9688    
9689            Safer implementation of the performance enhancements of the
9690            low-level renderer:
9691            
9692            * extensions/thuban/wxproj.cpp (extract_projection)
9693            (extract_pointer): Rename extract_projection to extract_pointer
9694            and redefine its purpose to return the pointer stored in a CObject
9695            returned by the object's cobject method. Update all callers.
9696            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9697            handling of these low-level parameters so that each s_draw_info
9698            instance is handled as a CObject at python level that also
9699            contains real references to the actual python objects which
9700            contain the values in the struct. Add free_draw_info as the
9701            destructor.
9702            (draw_polygon_shape): Add the py_draw_info parameter which must a
9703            cobject containing an s_draw_info pointer.
9704    
9705            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9706            method to instantiat the low-level render parameter
9707            (MapRenderer.draw_shape_layer): Use the new method. Remove some
9708            commented out code.
9709            (MapRenderer.draw_polygon_shape): Make the first parameter not the
9710            layer but the low-level render parameter
9711            (ScreenRenderer.draw_shape_layer): Use the low-level render
9712            parameter.
9713    
9714    2003-04-15  Jonathan Coles   <[email protected]>
9715    
9716            * Thuban/Model/classification.py: Implemented __repr__ for
9717            the ClassGroup* classes to make debugging a bit easier.
9718            (ClassGroup.SetLabel): Check that the string is an instance
9719            of StringTypes not StringType. Accounts for Unicode strings.
9720    
9721            * Thuban/Model/color.py: Implemented __repr__ to make
9722            debugging a bit easier.
9723    
9724            * Thuban/Model/save.py (Saver.write_classification): Need to
9725            save the group label.
9726    
9727            * test/test_load.py (testClassification): New. Loads the
9728            iceland_sample_test.thuban file and checks if it was loaded
9729            correctly.
9730    
9731    2003-04-15  Jonathan Coles   <[email protected]>
9732    
9733            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9734            to improve rendering performance by initializing the variables
9735            that are not change each time draw_polygon_shape() is called.
9736            The values are stored in a global struct draw_info.
9737            (draw_polygon_shape): Removed initialization code that is
9738            now in draw_polygon_init().
9739    
9740            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9741            drawing initialization call to draw_polygon_init()
9742            (MapRenderer.draw_polygon_shape): Use new signature of
9743            draw_polygon_shape.
9744    
9745            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9746            weirdness by setting the range to (1, maxint).
9747    
9748            * Thuban/Model/classification.py (ClassGroupProperties): Make
9749            instance variables private and optimize comparison operator
9750            by first checking if the color references are the same.
9751            (ClassGroupSingleton): Make instance variables private.
9752            (ClassGroupRange): Make instance variables private.
9753    
9754            * HOWTO-Release: Filled in missing steps for releasing packages.
9755    
9756    2003-04-15  Bernhard Herzog  <[email protected]>
9757    
9758            First stab at internationalized messages:
9759    
9760            * Thuban/__init__.py (_): Implement the translation function for
9761            real using the python gettext module.
9762    
9763            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9764            translate empty strings.
9765    
9766            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9767            Add a missing space to a warning message
9768    
9769            * po/README: New. Notes about the management of the translation
9770            files.
9771    
9772            * po/Makefile: New. Makefile to help manage the translation files.
9773    
9774            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9775    
9776            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9777            translations and support files in po/
9778    
9779            * setup.py (data_files): Add the *.mo files to the data_files too
9780    
9781            * README: Add note about the translations when building from CVS
9782    
9783    2003-04-14  Jonathan Coles   <[email protected]>
9784    
9785            * Thuban/UI/dock.py: Fixes some window resizing problems most
9786            noticable under windows. Always assume the button bitmaps will
9787            be there. Code clean up.
9788            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9789            images for the dock/undock button to the same images.
9790            Work around for RTbug #1801.
9791    
9792            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9793            be allowed to grow within the sizer. Fixes a bug under Windows
9794            where the toolbar wasn't being drawn.
9795    
9796    2003-04-14  Frank Koormann   <[email protected]>
9797    
9798            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9799            Updated design to try to make the button functionality more
9800            transparent.
9801    
9802    2003-04-14  Jonathan Coles   <[email protected]>
9803    
9804            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9805            finalize the intialization of the panel.
9806    
9807            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9808            creation of the panel. Should be the last thing called in the
9809            initializer of a subclass.
9810    
9811            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9812            set the current selections in the combo boxes. This is needed
9813            under Windows.
9814    
9815            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9816            level panel to the dialog so that the background colors are
9817            consistent under Windows.
9818    
9819    2003-04-11  Jonathan Coles   <[email protected]>
9820    
9821            * Thuban/UI/classgen.py: Change color ramps to start at white
9822            not black.
9823    
9824            * Thuban/UI/legend.py: Enable/disable the legend buttons when
9825            the legend changes. Fixes RTbug #1793.
9826    
9827            * test/test_classification.py: Added test for copying of
9828            classifications.
9829    
9830    2003-04-11  Jonathan Coles   <[email protected]>
9831    
9832            * Thuban/UI/resource.py: New. Centralize the loading of resources
9833            such as bitmaps.
9834    
9835            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
9836            added images to the move buttons, added 'reverse' button.
9837            (CustomRampPanel.__init__): Added images to the move buttons.
9838            (GreyRamp): New. Generates a ramp from white to black.
9839            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
9840    
9841            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
9842            ID_PROPERTY_*.
9843            (Classifier.__init__): Minor changes to the layout.
9844            (Classifier._OnTitleChanged): Listen for when the user edits the
9845            title and update the dialog's title and the layer's title.
9846    
9847            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
9848    
9849            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
9850            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
9851            if the layer's title changes.
9852    
9853            * Thuban/UI/mainwindow.py: Added new menu item and associated code
9854            to open a dialog to rename the map.
9855            (MainWindow): Use new resource class to import bitmaps.
9856    
9857    2003-04-11  Jonathan Coles   <[email protected]>
9858    
9859            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
9860            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
9861            Resources/Bitmaps/group_use_none.xpm,
9862            Resources/Bitmaps/group_use_not.xpm,
9863            Resources/Bitmaps/hide_layer.xpm,
9864            Resources/Bitmaps/layer_properties.xpm,
9865            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
9866            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
9867            New.
9868    
9869    2003-04-10  Jonathan Coles   <[email protected]>
9870    
9871            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
9872            Should pass group to ClassGroup constructor.
9873    
9874    2003-04-10  Jonathan Coles   <[email protected]>
9875    
9876            * Thuban/Model/classification.py: (ClassGroup): Move all the common
9877            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
9878            here. Implement SetVisible(), IsVisible().
9879            (ClassGroup.__init__): Add group parameter which acts as a copy
9880            constructor.
9881    
9882            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
9883            "Visible" check boxes.
9884            (Classifier): Rename the buttons and refactor the code to match
9885            the new labels.
9886    
9887            * Thuban/UI/legend.py: Classify button is now called "Properties".
9888            Refactored the code to change variable names.
9889            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
9890    
9891            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
9892            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
9893            renamed to MainWindow.LayerEditProperties.
9894            (MainWindow.ToggleLegend): Don't include map name in legend title.
9895            (MainWindow.SetMap): Added the map name to the window title.
9896            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
9897            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
9898            Functionality is found in the layer properties dialog.
9899    
9900            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9901            draw visible groups.
9902    
9903    2003-04-09  Jonathan Coles   <[email protected]>
9904    
9905            * Thuban/UI/classgen.py: Modifications to allow simple
9906            addition and selection of new color schemes.
9907            (MonochromaticRamp): New. Generates a ramp between two colors.
9908            (RedRamp): New. Generates a ramp of all red.
9909            (GreenRamp): New. Generates a ramp of all green.
9910            (BlueRamp): New. Generates a ramp of all blue.
9911    
9912    2003-04-09  Jonathan Coles   <[email protected]>
9913    
9914            * Thuban/Model/classification.py (Classification.__deepcopy__):
9915            Need to copy over field and fieldType attributes.
9916    
9917            * Thuban/Model/table.py (Table.field_range): New. Retrive the
9918            maximum and minimum values over the entire table for a given
9919            field.
9920            (Table.GetUniqueValues): New. Retrieve all the unique values
9921            in the table for a given field.
9922    
9923            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9924            (GenUniquePanel): New. Controls to allow the user to select
9925            which unique field values they would like in the classification.
9926            (CustomRampPanel): Code that was in ClassGenDialog that allows
9927            the user to select the properties for a custom ramp.
9928            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9929    
9930            * Thuban/UI/classifier.py: Removed a lot of debugging code.
9931            (Classifier._SetClassification): Callback method so that the
9932            class generator can set the classification in the grid.
9933            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9934            editing of a group properties class into a wxWindows control.
9935    
9936            * Thuban/UI/dock.py: It was decided that if the user closes
9937            a dockable window the window should simply hide itself. That
9938            way if the user wants to show the dock again it appears in the
9939            same place as it was when it was closed.
9940            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9941            (DockableWindow._OnButtonClose): Hide the window instead of
9942            destroying it.
9943            (DockableWindow._OnClose): Hide the window instead of
9944            destroying it.
9945    
9946            * Thuban/UI/legend.py (LegendTree): Use a private method to
9947            consistently set the font and style of the text. Fixes RTbug #1786.
9948    
9949            * Thuban/UI/mainwindow.py: Import just the Classifier class.
9950    
9951    2003-04-07  Bernhard Herzog  <[email protected]>
9952    
9953            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9954            to the map module
9955    
9956    2003-04-07  Bernhard Herzog  <[email protected]>
9957    
9958            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9959            favor of ToggleSessionTree
9960            (MainWindow.ToggleSessionTree): New method to toggle visibility of
9961            the session tree.
9962            (MainWindow.SessionTreeShown): New method to return whether the
9963            session tree is currently shown.
9964            (MainWindow.ToggleLegend): New method to toggle visibility of the
9965            legend
9966            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9967            LegendShown
9968            (MainWindow.LegendShown): New method to return whether the legend
9969            is currently shown.
9970            (_method_command): Add checked parameter so we can define check
9971            menu items
9972            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9973            mainwindow methods.
9974            (show_session_tree, show_legend commands): Removed.
9975            (toggle_session_tree, toggle_legend commands): New commands to
9976            toggle the visibility of the dialogs
9977    
9978    2003-04-07  Jonathan Coles   <[email protected]>
9979    
9980            * Thuban/UI/classgen.py: Fix Windows problem.
9981    
9982            * Thuban/UI/dock.py: Fix Windows problem.
9983    
9984            * Thuban/UI/mainwindow.py: Use False instead of false.
9985            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9986    
9987    2003-04-07  Jonathan Coles   <[email protected]>
9988    
9989            Since we now say that the order of the groups in a classification
9990            matters, it makes sense to be able to manipulate that order. Most
9991            of the changes to Thuban/Model/classification.py are to that end.
9992    
9993            * Thuban/Model/classification.py (Classification.AppendGroup,
9994            Classification.InsertGroup, Classification.ReplaceGroup,
9995            Classification.RemoveGroup, Classification.GetGroup): Do as the
9996            names imply.
9997            (Classification.FindGroup): This was called GetGroup, but GetGroup
9998            takes an index, while FindGroup takes a value.
9999            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10000            REFERENCE. Currently there is a cyclic reference between the layer
10001            and its classification. If the classification doesn't need to know
10002            its owning layer we can change this, since it may make sense to be
10003            able to use the same classification with different layers.
10004    
10005            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10006    
10007            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10008            not AddGroup()
10009    
10010            * Thuban/UI/classifier.py: Now that we can depend on the order in
10011            a Classification and have methods to manipulate that order we don't
10012            need to use our own data structures in the grid. We can simply make
10013            the grid/table access the information they need from a copy of
10014            the classification object.
10015            (Classifier._OnCloseBtn): Event handler for when the user clicks
10016            'Close'. This is needed so if the user applies changes and then
10017            continues to change the table the user has the option of discarding
10018            the most recent changes and keeping what they applied.
10019    
10020            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10021            into the same group.
10022    
10023            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10024            with a really old version of proj, PJ_VERSION won't even be defined.
10025            If it isn't defined then just compile so that the function always
10026            returns Py_False.
10027    
10028            * test/test_classification.py: Fix tests to use the renamed methods.
10029            Still need to write tests for the new methods.
10030    
10031    2003-04-04  Jonathan Coles   <[email protected]>
10032    
10033            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10034            call to SetSelection out of the method and before the call
10035            to __SelectField in __init__. This prevents a recursion of events
10036            when _OnFieldSelect is triggered by the user.
10037    
10038    2003-04-04  Jonathan Coles   <[email protected]>
10039    
10040            * Thuban/Model/classification.py: Rename Color.None to
10041            Color.Transparent.
10042            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10043            Don't bother copying the color, since Colors are immutable.
10044    
10045            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10046            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10047            Thuban/UI/renderer.py, Thuban/UI/view.py:
10048            Rename Color.None to Color.Transparent.
10049        
10050            * test/test_classification.py, test/test_load.py: Rename Color.None
10051            to Color.Transparent.
10052    
10053    2003-04-04  Jonathan Coles   <[email protected]>
10054    
10055            * Thuban/Model/classification.py: Fix assert calls.
10056            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10057            Copy the color parameter rather than hold onto a reference.
10058    
10059            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10060            the color object.
10061            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10062            are sure there exists only one refernce to Color.None in the system.
10063            This allows us to use 'is' rather than the comparision functions.
10064            
10065            * Thuban/Model/save.py: Fix assert calls.
10066            
10067            * Thuban/UI/classifier.py: Fix assert calls.
10068            (ClassGrid._OnCellDClick): Call up to the classifier to open the
10069            dialog to edit the groups properties.
10070            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10071            correctly if a cell is resized.
10072            (ClassTable.SetClassification): New. Changes the classification
10073            that is in the table.
10074            (ClassTable.__SetRow): Allow groups to be prepended.
10075            (Classifier): New code for opening the EditProperties and
10076            GenerateRanges dialogs.
10077            (SelectPropertiesDialog.__GetColor): Only set the color in the
10078            color dialog if the current color is not None.
10079            
10080            * Thuban/UI/dock.py: Fix assert calls.
10081            
10082            * Thuban/UI/legend.py: Fix assert calls.
10083            
10084            * Thuban/UI/renderer.py: Fix assert calls.
10085            
10086            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10087            classifications.
10088            (GenRangePanel): Panel specific to range generation.
10089            (GenSingletonPanel): Panel specific to singleton generation.
10090            (ClassGenerator): Class responsible for actually generating
10091            the classification from the data gathered in the dialog box.
10092            (PropertyRamp): Generates properties whose values range from
10093            a starting property to an ending property.
10094    
10095    2003-04-03  Bernhard Herzog  <[email protected]>
10096    
10097            * test/support.py (print_garbage_information): New function that
10098            prints information about still connected messages and memory
10099            leaks.
10100            (run_suite): Removed.
10101            (run_tests): New function for use as a replacement of
10102            unittest.main in the test_* files. This one calls
10103            print_garbage_information at the end.
10104    
10105            * test/runtests.py (main): Use support.print_garbage_information
10106    
10107            * test/test_layer.py: Use support.run_tests instead of
10108            unittest.main so we get memory leak information
10109            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10110            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10111            (TestLayerLegend.test_visibility): Call the layer's Destroy method
10112            to fix a memory leak.
10113    
10114            * test/test_classification.py: Use support.run_tests instead of
10115            unittest.main so we get memory leak information
10116            (TestClassification.test_classification): Call the layer's Destroy
10117            method to fix a memory leak.
10118    
10119    2003-04-02  Bernhard Herzog  <[email protected]>
10120    
10121            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10122            Handle the reference counts of the return value and errors in
10123            PyArg_ParseTuple correctly.
10124    
10125            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10126            sure the filename is absolute to avoid problems when saving the
10127            session again
10128    
10129            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10130    
10131    2003-04-01  Jonathan Coles   <[email protected]>
10132    
10133            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10134            that there actually are points in the returned list of points
10135            before trying to index into the list. The list may be empty if
10136            the shape is a Null Shape.
10137    
10138    2003-04-01  Bernhard Herzog  <[email protected]>
10139    
10140            * test/test_map.py: Don't use from <module> import *
10141    
10142    2003-04-01  Jonathan Coles   <[email protected]>
10143    
10144            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10145            LAYER_LEGEND_CHANGED
10146    
10147            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10148            self.Destroy() to close the window after yesterday's changes.
10149    
10150            * test/test_map.py, test/test_session.py: Fix messages that
10151            are sent from maps and layers.
10152    
10153    2003-03-31  Jonathan Coles   <[email protected]>
10154    
10155            * Thuban/UI/classifier.py: Commented out some debugging statements.
10156            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10157            RTbug #1769.
10158    
10159            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10160            position (although position doesn't work yet under GTK).
10161            (DockableWindow.Destroy): New. Called when the window must be
10162            closed. Namely needed when the DockFrame closes and must close
10163            its children.
10164            (DockFrame): Listen for EVT_CLOSE and destroy all children.
10165    
10166            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10167            when then window is told to close.
10168            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10169            comment in source for more info.
10170    
10171            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10172    
10173            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10174            symmetry with other such methods.
10175            (MainWindow.ShowLegend): Show the legend docked by default.
10176    
10177    2003-03-28  Jonathan Coles   <[email protected]>
10178    
10179            * Thuban/UI/classifier.py: Support for highlighting a specific
10180            group within the grid when the classification dialog is opened.
10181            Also contains a lot of debugging printouts which will later
10182            be removed.
10183    
10184            * Thuban/UI/dock.py: Complete rework on the dock code so that
10185            that it is fairly removed from the rest of the Thuban application.
10186            It is easy to add new docks which the rest of the program having
10187            to be aware of them.
10188    
10189            * Thuban/UI/legend.py: Modifications to support selecting a
10190            specific group in the classification dialog. Changed how layers
10191            are drawn when the layer is visible/invisible.
10192    
10193            * Thuban/UI/mainwindow.py: Removed legend specific code and
10194            replaced it with calls to the new dock code.
10195    
10196            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10197            to check if scale > 0. Trying to track down a divide by zero.
10198    
10199    2003-03-26  Jonathan Coles   <[email protected]>
10200    
10201            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10202            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10203            now part of DockableWindow.
10204            (LegendPanel.DoOnSelChanged): Select the current layer in the
10205            map.
10206            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10207            with the selected layer and/or group.
10208    
10209    2003-03-26  Jonathan Coles   <[email protected]>
10210    
10211            This putback contains the code for dockable windows. There is
10212            no support in wxWindows as of this date for windows that can
10213            attach themselves to other windows.
10214    
10215            The current model contains a DockableWindow which has a parent
10216            window for when it is detached and a dock window that it puts
10217            its contents in when it is docked. The contents of a DockableWindow
10218            must be a DockPanel. DockPanel itself derives from wxPanel.
10219    
10220            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10221            message, not a LAYER_LEGEND_CHANGED message.
10222    
10223            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10224    
10225            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10226            as one of the style properties for the fieldTypeText item to
10227            be sure that its size is correct when the text changes.
10228    
10229            * Thuban/UI/dock.py: New. Classes for the DockPanel and
10230            DockableWindow.
10231    
10232            * Thuban/UI/legend.py: Added some more buttons and made the
10233            LegendPanel a DockPanel.
10234    
10235            * Thuban/UI/mainwindow.py: Added sash windows to the main window
10236            and supporting functions for manipulating the sashes.
10237            (MainWindow.ShowLegend): Create a DockableWindow with the
10238            LegendPanel as the contents.
10239    
10240            * Thuban/UI/messages.py: Added DOCKABLE_* messages
10241    
10242            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10243            not LAYER_LEGEND_CHANGED, messages.
10244    
10245    2003-03-25  Jonathan Coles   <[email protected]>
10246    
10247            * setup.py: Added custom script bdist_rpm_build_script so that
10248            when the rpm is built the path to wx-config is correct.
10249    
10250            * setup.cfg: Added line saying to use the custom build script
10251    
10252    2003-03-20  Jonathan Coles   <[email protected]>
10253    
10254            Initial implementation of the Legend.
10255    
10256            * Thuban/UI/legend.py: New. Creates a window that shows the map's
10257            Legend information and allows the user to add/modify classifications
10258            and how the layers are drawn on the map.
10259    
10260            * setup.py: New command 'build_docs' which currently uses
10261            happydoc to generate html documentation for Thuban.
10262    
10263            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10264            Returns a string which is appropriately describes the group.
10265    
10266            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10267            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10268    
10269            * Thuban/Model/map.py (Map): Rename messages and use new, more
10270            specific, messages.
10271    
10272            * Thuban/Model/messages.py: New message to indicate that a layer's
10273            data has changed (LAYER_CHANGED). New map messages to indicate
10274            when layers have been added/removed/changed or if the stacking order
10275            of the layers has changed.
10276    
10277            * Thuban/Model/session.py: Rename and use new messages.
10278    
10279            * Thuban/UI/classifier.py: Remember if any changes have actually
10280            been applied so that if the dialog is cancelled without an application
10281            of changes we don't have to set a new classification.
10282            (ClassDataPreviewer): Pulled out the window specific code and put it
10283            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10284            symbols on any DC.
10285            
10286            * Thuban/UI/mainwindow.py: New code to open the legend.
10287    
10288            * Thuban/UI/view.py: Use new message names.
10289    
10290    2003-03-19  Jonathan Coles   <[email protected]>
10291    
10292            * Thuban/UI/main.py (verify_versions): New. Checks the versions
10293            of Python, wxPython, and some other libraries.
10294    
10295            * extensions/thuban/wxproj.cpp (check_version): Checks the given
10296            version against what wxproj was compiled with.
10297            (check_version_gtk): If wxproj was compiled with gtk then check
10298            the given version against the version of the gtk library
10299            currently being used.
10300    
10301    2003-03-14  Bernhard Herzog  <[email protected]>
10302    
10303            * test/test_command.py: Run the tests when the module is run as a
10304            script
10305    
10306    2003-03-14  Bernhard Herzog  <[email protected]>
10307    
10308            Implement selection of multiple selected shapes in the same layer:
10309    
10310            - Introduce a new class to hold the selection. This basically
10311              replaces the interactor which was nothing more than the
10312              selection anyway. A major difference is of course that the new
10313              selection class supports multiple selected shapes in one layer
10314            
10315            - Move the object that represents the selection from the
10316              application to the canvas. The canvas is a better place than the
10317              application because the selection represents which shapes and
10318              layer of the map displayed by the canvas are selected and
10319              affects how the map is drawn.
10320    
10321            - Make the selection and its messages publicly available through
10322              the mainwindow.
10323    
10324            - The non-modal dialogs do not get a reference to the interactor
10325              anymore as they can simply refer to their parent, the
10326              mainwindow, for the what the interactor had to offer.
10327    
10328            * Thuban/UI/selection.py: New module with a class to represent the
10329            selection.
10330    
10331            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10332            these unused messages
10333    
10334            * Thuban/UI/application.py (ThubanApplication.OnInit)
10335            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10336            interactor is gone now.
10337            (ThubanApplication.CreateMainWindow): There is no interactor
10338            anymore so we pass None as the interactor argument for now for
10339            compatibility.
10340    
10341            * Thuban/UI/view.py (MapCanvas.delegated_messages)
10342            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10343            Unsubscribe, delegate messages according to the delegated_messages
10344            class variable.
10345            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10346            attributes from instance variables as described with the
10347            delegated_methods class variable.
10348            (MapCanvas.__init__): New instance variable selection holding the
10349            current selection
10350            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10351            pass them on to the renderer
10352            (MapCanvas.SetMap): Clear the selection when a different map is
10353            selected.
10354            (MapCanvas.shape_selected): Simple force a complete redraw. The
10355            selection class now takes care of only issueing SHAPES_SELECTED
10356            messages when the set of selected shapes actually does change.
10357            (MapCanvas.SelectShapeAt): The selection is now managed in
10358            self.selection
10359    
10360            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10361            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10362            Unsubscribe, delegate messages according to the delegated_messages
10363            class variable.
10364            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10365            attributes from instance variables as described with the
10366            delegated_methods class variable.
10367            (MainWindow.__init__): The interactor as ivar is gone. The
10368            parameter is still there for compatibility. The selection messages
10369            now come from the canvas.
10370            (MainWindow.current_layer, MainWindow.has_selected_layer):
10371            Delegate to the the canvas.
10372            (MainWindow.LayerShowTable, MainWindow.Classify)
10373            (MainWindow.identify_view_on_demand): The dialogs don't need the
10374            interactor parameter anymore.
10375    
10376            * Thuban/UI/tableview.py (TableFrame.__init__)
10377            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10378            (LayerTableFrame.row_selected): The interactor is gone. It's job
10379            from the dialog's point of view is now done by the mainwindow,
10380            i.e. the parent. Subscribe to SHAPES_SELECTED instead
10381            of SELECTED_SHAPE
10382            
10383            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10384            is gone. It's job from the dialog's point of view is now done by
10385            the mainwindow, i.e. the parent.
10386            
10387            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10388            gone. It's job from the dialog's point of view is now done by the
10389            mainwindow, i.e. the parent.
10390    
10391            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10392            gone. It's job from the dialog's point of view is now done by the
10393            mainwindow, i.e. the parent.
10394            (SessionTreeCtrl.__init__): New parameter mainwindow which is
10395            stored as self.mainwindow. The mainwindow is need so that the tree
10396            can still subscribe to the selection messages.
10397            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10398            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10399            selection is now accessible through the mainwindow. Subscribe to
10400            SHAPES_SELECTED instead of SELECTED_SHAPE
10401    
10402            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10403            SHAPES_SELECTED message now.
10404            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10405            so deal with multiple shapes
10406            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10407            gone. It's job from the dialog's point of view is now done by the
10408            mainwindow, i.e. the parent.
10409    
10410            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10411            parameter is now a list of shape ids.
10412            (RecordTable.SetTable): The second parameter is now a list of
10413            indices.
10414    
10415            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10416            selected_shape parameter and ivar to selected_shapes. It's now a
10417            list of shape ids.
10418            (MapRenderer.draw_label_layer): Deal with multiple selected
10419            shapes. Rearrange the code a bit so that the setup and shape type
10420            distinctions are only executed once.
10421    
10422            * test/test_selection.py: Test cases for the selection class
10423    
10424    2003-03-11  Jonathan Coles   <[email protected]>
10425    
10426            * Thuban/Model/load.py: Temporary fix so that the xml reader
10427            doesn't cause Thuban to crash.
10428    
10429            * Thuban/Model/layer.py: Handle the cyclic references between
10430            a layer and its classification better, and be sure to disconnect
10431            the classification from the layer when the layer is destroyed
10432            so that we don't maintain a cyclic reference that may not be
10433            garbage collected.
10434    
10435            * Thuban/Model/classification.py: See comment for layer.py.
10436    
10437    2003-03-12  Jan-Oliver Wagner <[email protected]>
10438    
10439            * HOWTO-Release: New. Information on the steps for releasing
10440            a new version of Thuban.
10441    
10442    2003-03-11  Jonathan Coles   <[email protected]>
10443    
10444            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10445            Use True instead of true.
10446            (Classifier): Should have a single panel in which all the controls lie.
10447    
10448            * Thuban/UI/proj4dialog.py: Add normal border.
10449    
10450            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10451    
10452            * Thuban/UI/mainwindow.py: Use True instead of true.
10453    
10454            * setup.py: Update some definitions to use wxWindows2.4 files
10455    
10456            * Data/iceland_sample_class.thuban: Fixed file so that the
10457            field_type information is present.
10458    
10459    2003-03-10  Jonathan Coles   <[email protected]>
10460    
10461            * Thuban/UI/classifier.py (Classifier.__init__): Make the
10462            field type label grow so that when the text changes the
10463            size is updated correctly. This may be a wxWindows bug.
10464    
10465    2003-03-10  Jonathan Coles   <[email protected]>
10466    
10467            * Thuban/UI/application.py: Changed SESSION_CHANGED to
10468            SESSION_REPLACED.
10469    
10470            * Thuban/UI/classifier.py: Wrap text with _().
10471            (ClassGrid.CreateTable): Set dimensions and size hints here,
10472            instead of in Reset, so we only set the size once.
10473    
10474            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10475    
10476            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10477            Call Close() instead of Shutdown().
10478    
10479            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10480    
10481            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10482            Go back to using OnClose() instead of Shutdown().
10483    
10484    2003-03-10  Jonathan Coles   <[email protected]>
10485    
10486            * Thuban/UI/classifier.py (Classifier): SelectField() needed
10487            to know the old field index as well as the new one.
10488    
10489    2003-03-10  Jonathan Coles   <[email protected]>
10490    
10491            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10492            to correctly set the table information and call this from
10493            __init__ and from _OnFieldSelect so that all the information
10494            is up to date when the dialog opens and when a field is changed.
10495    
10496    2003-03-10  Jonathan Coles   <[email protected]>
10497    
10498            * Thuban/Model/classification.py (Classification): Don't use
10499            layer's message function directly, use the ClassChanged() method
10500            when then classification changes. SetField/SetFieldType/SetLayer
10501            must keep the information about field name and field type in
10502            sync when an owning layer is set or removed.
10503    
10504            * Thuban/Model/layer.py: Added ClassChanged() so that the
10505            classification can tell the layer when its data has changed.
10506            (Layer.SetClassification): Accepts None as an arguement to
10507            remove the current classification and correctly handles
10508            adding a new classification.
10509    
10510            * Thuban/Model/load.py: Comment out print statement
10511    
10512            * test/test_classification.py, test/test_save.py: New and
10513            improved tests.
10514    
10515    2003-03-07  Jonathan Coles   <[email protected]>
10516    
10517            * Thuban/Model/classification.py: Implemented __copy__ and
10518            __deepcopy__ for ClassGroup* and ClassGroupProperites so
10519            they can easily be copied by the classifier dialog.
10520            (ClassGroupProperites.__init__): The default line color should
10521            have been Color.Black.
10522    
10523            * Thuban/UI/classifier.py: Setting and Getting table values now
10524            uses a consistent set of functions.
10525            (Classifier): Now non-modal. Has field type label which changes
10526            as the field changes. Keep track of buttons in a list so that
10527            we can enable/disable the buttons when the None field is selected.
10528            (SelectPropertiesDialog): Add buttons to make the colors transparent.
10529    
10530            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10531            does what OnClose did, but can be called by the application to
10532            close a window. Needed when a session changes, and we have to
10533            close the classifier windows.
10534    
10535            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10536            Shuts down open dialogs. Used when a new session is created
10537            or a session is opened.
10538            (MainWindow.SaveSession): Should only call application.SaveSession()
10539            if we don't call SaveSessionAs first.
10540            (MainWindow.Classify): Allow different classifier dialogs for
10541            different layers.
10542    
10543            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10544            the parent class handle it. Add Shutdown() to unsubscibe from
10545            event notification and call the parent Shutdown(). This was
10546            necessary so the application can close the tree window.
10547    
10548    2003-03-06  Jonathan Coles   <[email protected]>
10549    
10550            * Thuban/Model/classification.py: Minor documentation changes,
10551            Addition of __eq__ and __ne__ methods.
10552            (Classification.SetLayer): prevent recursion between this method
10553            and Layer.SetClassification().
10554    
10555            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10556    
10557            * Thuban/Model/layer.py (SetClassification): prevent recursion
10558            between this method and Classification.SetLayer().
10559    
10560            * test/test_classification.py, test/test_load.py,
10561            test/test_session.py: Fixed and added tests for the classification
10562            classes.
10563    
10564    2003-03-06  Bernhard Herzog  <[email protected]>
10565    
10566            * Thuban/UI/classifier.py (ClassGrid.__init__)
10567            (ClassGrid.CreateTable): Move the SetSelectionMode call to
10568            CreateTable because otherwise it triggers an assertion in
10569            wxPython/wxGTK 2.4.
10570    
10571    2003-03-05  Jonathan Coles   <[email protected]>
10572    
10573            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10574    
10575            * Thuban/Model/load.py: import FIELDTYPE constants from table.
10576    
10577            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10578    
10579            * Thuban/Model/table.py: Put FIELDTYPE constants back.
10580    
10581    2003-03-05  Jonathan Coles   <[email protected]>
10582    
10583            * Thuban/UI/classifier.py: Added class documentation.
10584            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10585            Store just the groups in the table and generate the other
10586            column information when it is requested. Add "None" field
10587            to pull-down to select no classification.
10588    
10589            * Thuban/common.py: Moved FIELDTYPE constants from table.py
10590            (Str2Num): Only catch ValueError exceptions.
10591    
10592            * Thuban/Model/classification.py: Class documentation. Renaming
10593            of methods with Stroke to Line. Groups are stored in a single
10594            list with the default as the first element. Groups are searched
10595            in the order they appear in the list.
10596    
10597            * Thuban/Model/color.py: Documentation.
10598    
10599            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10600            the kind of data represented by a field.
10601    
10602            * Thuban/Model/load.py (ProcessSession): Use proper string
10603            conversion function; fixes RTbug #1713.
10604    
10605            * Thuban/Model/save.py (Saver): Store field type information.
10606    
10607            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10608            (Table): Add field_info_by_name() to retrieve field information
10609            by specifying the field name, not the number.
10610    
10611            * Thuban/UI/mainwindow.py: Function name changes.
10612    
10613            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10614            get the layer classification once. Don't try to classify
10615            values when the field is None: just use the default properties.
10616    
10617            * Thuban/UI/view.py: Function name changes.
10618    
10619            * Doc/thuban.dtd: Add field_type attribute to a classification.
10620    
10621    2003-03-04  Bernhard Herzog  <[email protected]>
10622    
10623            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10624            the fill and stroke layer attributes optional with suitable
10625            default values. Add the stroke_width layer attribute. Use correct
10626            syntax for empty elements. Make the attribute list for labels
10627            refer to the label element.
10628    
10629    2003-03-04  Bernhard Herzog  <[email protected]>
10630    
10631            * setup.py (thuban_build_py.build): Add a comment about distutils in
10632            Python 2.3 containing some of the functionality we implement in
10633            setup.py ourselves.
10634    
10635            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10636            before the selection mode. Doing it the other way round triggers
10637            an assertion in wxWindows.
10638    
10639            * Thuban/Model/save.py (escape): Fix typo in doc-string
10640    
10641            * Thuban/Model/classification.py: Remove unnecessary wxPython
10642            import
10643    
10644    2003-03-04  Jonathan Coles   <[email protected]>
10645    
10646            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10647            Parameter 'value' should default to None.
10648    
10649            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10650            the class attribute __classification is now private.
10651    
10652            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10653            Classifier to ClassGrid. Added support for removing selected rows,
10654            which including code for keeping track of when cells are selected,
10655            and deselected.
10656            (ClassTable): Support for added/removing rows. Fixed a problem
10657            with __ParseInput whereby it would not allow strings (only numbers)
10658            to be entered.
10659            (Classifier): Added button and supporting code for removing
10660            selected rows.
10661    
10662    2003-02-27  Jonathan Coles   <[email protected]>
10663    
10664            * Thuban/common.py: Moved color conversion functions into
10665            Thuban/UI/common.py.
10666            (Str2Num): Now converts the float (not the string) to a long/int
10667            so that an exception isn't thrown.
10668    
10669            * Thuban/UI/common.py: Common functions used in several UI modules
10670    
10671            * Thuban/Model/classification.py: Changed the class hierarchy
10672            so that a Classification consists of Groups which return
10673            Properties when a value matches a Group.
10674    
10675            * Thuban/Model/layer.py: Fixed name resolution problem.
10676    
10677            * Thuban/Model/load.py: Use new Classification and Group functions.
10678    
10679            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10680            failure.
10681            (Saver.write_classification): Use new Classification and Group
10682            functions.
10683    
10684            * Thuban/UI/classifier.py: Changes to use new Classification and Group
10685            functions. Fix to create a tuple with a single value instead of
10686            simply returning the value.
10687    
10688            * Thuban/UI/renderer.py: Use new Classification and Group functions.
10689            Use common.py functions.
10690    
10691            * Thuban/UI/tree.py: Use common.py functions.
10692            
10693            * test/test_classification.py: Use new Classification and Group
10694            classes.
10695    
10696    2003-02-24  Jonathan Coles   <[email protected]>
10697    
10698            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10699            functions from Thuban color objects to wxWindow colour objects.
10700    
10701            * Thuban/Model/classification.py (Classification): Renamed
10702            GetProperties() to GetClassData(). Used the new iterator
10703            in TreeInfo().
10704            (ClassIterator): Iterator implementation to iterate over the
10705            ClassData objects in a classification object.
10706    
10707            * Thuban/Model/save.py (Saver.write_classificaton): Uses
10708            the new iterator to save the classification information.
10709    
10710            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10711            for changing the stroke and fill colors and previewing the
10712            changes.
10713    
10714            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10715            MainWindow.SaveSessionAs): Text string changes so the dialogs
10716            have more meaningful titles.
10717    
10718            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10719            Classification method name from GetProperties to GetClassData.
10720    
10721            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10722            instead of accessing now non-existent class variables.
10723    
10724    2003-02-24  Bernhard Herzog  <[email protected]>
10725    
10726            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10727            unneeded Shape() call. Rendering is substantially faster without
10728            it and it avoids some problems with broken shape files.
10729    
10730    2003-02-20  Frank Koormann   <[email protected]>
10731    
10732            Force minimal size of identify and label dialogs. The autosizing
10733            looked too ugly.
10734    
10735            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10736            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10737            Set size of listctrl.
10738            * Thuban/UI/identifyview.py (IdentifyView.__init__):
10739            Set size of dialog.
10740    
10741    2003-02-19  Jonathan Coles   <[email protected]>
10742    
10743            * test/test_classification.py, test/test_layer.py,
10744            test/test_load.py, test/test_map.py, test/test_session.py:
10745            Updated the tests to use the new functions that are in the
10746            respective classes.
10747    
10748            * Thuban/Model/classification.py (Classification):
10749            Uses the new ClassData* classes. Modification messages are
10750            passed up to the parent layer (if it exists).
10751            (ClassData): New class to encapsulate the common data in each
10752            classification property.
10753            (ClassDataDefault): Represents the Default class. data.
10754            (ClassDataPoint): Represents a single class. data point
10755            (ClassDataRange): Represents a class. range
10756            (ClassDataMap): Represents a class. map (unused).
10757    
10758            * Thuban/Model/color.py: Added Color.None to represent something
10759            with no color. Color.Black represents the color black.
10760            (NoColor): Helper class derived from Color to represent something
10761            with no color.
10762    
10763            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10764            stroke_width attributes. Made the 'classification' attribute private.
10765            New methods for setting/getting the classification.
10766    
10767            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10768            to get the classifcation and use the new ClassData* classes to
10769            hold the classification data. Use Str2Num to convert numbers
10770            properly.
10771    
10772            * Thuban/Model/save.py (Saver): Use new Color and Classification
10773            methods
10774    
10775            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10776            custom grid.
10777            (ClassTable): Support for editing Values and Labels and for
10778            changing what type (point or range) of data is stored in each
10779            property based on how the user enters the data.
10780            (Classifier): Support for saving the new classifications and
10781            launching the dialog to edit a property.
10782            (SelectPropertiesDialog): New class for editing the visual
10783            properties of a classification (stroke color, width, and fill color)
10784            (ClassPreviewer): Took the Draw method from ClassRenderer and
10785            made most of it into this new class. Intend to use this class in
10786            the SelectPropertiesDialog for previewing changes.
10787    
10788            * Thuban/UI/renderer.py: Use new Color and Classification methods.
10789    
10790            * Thuban/UI/tree.py: Formatting changes.
10791    
10792            * Doc/thuban.dtd: Add 'label' element
10793    
10794            * Thuban/common.py: New. Contains common routines used throughout
10795            the code.
10796            (Str2Num): Takes a string and converts it to the "best" type of
10797            number.
10798    
10799    2003-02-14  Bernhard Herzog  <[email protected]>
10800    
10801            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10802            dragging flag is always set to 0 even when the tool implementation
10803            raises an exception
10804    
10805    2003-02-11  Bernhard Herzog  <[email protected]>
10806    
10807            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10808            method to create a splash screen.
10809            (ThubanApplication.ShowMainWindow): New. Show the main window.
10810            Needed so the splash screen can display the mainwindow
10811            (ThubanApplication.OnInit): Call the
10812            new splash_screen method to determine whether the application
10813            should display a splash screen. If it displays a splash screen do
10814            not immediately show the main window.
10815    
10816    2003-02-11  Jonathan Coles  <[email protected]>
10817    
10818            * Thuban/Model/classification.py: Added import line to fix
10819            feature conflicts between running on python2.2 and python2.1.
10820    
10821            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10822            onto the clinfo parameter, so removed the deepcopy().
10823    
10824    2003-02-10  Jonathan Coles  <[email protected]>
10825    
10826            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10827            Added element_open variable to track opening and closing of tags
10828            so that tags that don't span more than one line are closed with
10829            /> instead of </tag_name>. Use the GetDefault*() methods of
10830            the Classification class.
10831    
10832            * Thuban/Model/classification.py (Classificaton): Added set and
10833            get methods for the default data. The class also takes a layer
10834            reference so that modification messages can be sent. Fixed the
10835            methods to use the new ClassData class.
10836            (ClassData): New class to encapsulate the classification data
10837    
10838            * Thuban/Model/layer.py (Layer): Remove the
10839            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
10840            SetDefault*() methods on the layer's classification object.
10841            (Layer.__init__): Use the new SetDefault*() methods in the
10842            Classification class.
10843    
10844            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
10845            object instead of a dictionary.
10846    
10847            * Thuban/UI/classifier.py (ClassRenderer): New class to
10848            draw the classifications in the dialog box's table.
10849            (Classifier): Modified to use the ClassRenderer class.
10850    
10851            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
10852            methods of the Classification class.
10853    
10854            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
10855            of the ClassData class.
10856    
10857            * test/test_classification.py, test/test_layer.py,
10858            test/test_map.py, test/test_session.py: Fix the tests to work
10859            with the above code changes.
10860    
10861    2003-02-03  Jonathan Coles  <[email protected]>
10862    
10863            * Thuban/Model/classification.py (Classification): Added getNull()
10864            to return the NullData reference
10865    
10866            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
10867            Layer.SetStrokeWidth): Modified these functions to change the
10868            null data in the classification rather than keep these values
10869            directly in the Layer class. Menu options to change these values
10870            work again.
10871    
10872    2003-01-28  Jonathan Coles  <[email protected]>
10873    
10874            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
10875            Fixed crashing problem on some systems. Dialog box shows
10876            classification data.
10877    
10878            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
10879            Colors in the tree view.
10880    
10881            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
10882            the tree info for classifications. Commented out unnecessary lines.
10883    
10884            * Thuban/Model/classification.py (Classification.TreeInfo): New
10885            function to add information about the classification into the
10886            tree view.
10887    
10888    2003-01-27  Jan-Oliver Wagner <[email protected]>
10889    
10890            * Thuban/__init__.py (_): New.
10891    
10892            * Thuban/Model/classification.py, Thuban/Model/extension.py,
10893            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
10894            Thuban/Model/session.py, Thuban/UI/application.py,
10895            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
10896            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
10897            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
10898            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
10899            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
10900    
10901  2003-01-27  Jonathan Coles  <[email protected]>  2003-01-27  Jonathan Coles  <[email protected]>
10902    
10903    * Thuban/Model/layer.py: Classification initialization calls.          * Thuban/Model/layer.py: Classification initialization calls.
10904    
10905    * Thuban/Model/classification.py: Created class to encapsulate          * Thuban/Model/classification.py: Created class to encapsulate
10906    a layer classification. Supports specific data points and          a layer classification. Supports specific data points and
10907    ranges.          ranges.
10908    
10909    * Thuban/Model/load.py: Added support for loading classification          * Thuban/Model/load.py: Added support for loading classification
10910    information.          information.
10911    
10912    * Thuban/Model/save.py: Added support for saving classification          * Thuban/Model/save.py: Added support for saving classification
10913    information.          information.
10914    
10915    * Thuban/UI/classifier.py: Initial class for a dialog box for          * Thuban/UI/classifier.py: Initial class for a dialog box for
10916    specifying classification information.          specifying classification information.
10917    
10918    * Thuban/UI/mainwindows.py: Support for opening the classifier          * Thuban/UI/mainwindows.py: Support for opening the classifier
10919    dialog.          dialog.
10920    
10921    * Thuban/UI/renderer.py: Support for drawing a layer with the          * Thuban/UI/renderer.py: Support for drawing a layer with the
10922    classification information.          classification information.
10923    
10924    * Data/iceland_sample_class.thuban: iceland_sample with          * Data/iceland_sample_class.thuban: iceland_sample with
10925    classification data.          classification data.
10926    
10927    * test/test_classification: Tests for the Classification class.          * test/test_classification: Tests for the Classification class.
10928    
10929  2002-12-09  Bernhard Herzog  <[email protected]>  2002-12-09  Bernhard Herzog  <[email protected]>
10930    
# Line 60  Line 10960 
10960          * Thuban/UI/mainwindow.py: Altered the order of tools in the          * Thuban/UI/mainwindow.py: Altered the order of tools in the
10961          toolbar: First now are all navigation tools (Zoom In/Out, Pan,          toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10962          Full Extent).          Full Extent).
10963        
10964  2002-10-23  Bernhard Herzog  <[email protected]>  2002-10-23  Bernhard Herzog  <[email protected]>
10965    
10966          * setup.py (setup call): version now 0.1.3          * setup.py (setup call): version now 0.1.3
# Line 171  Line 11071 
11071          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11072          VIEW_POSITION          VIEW_POSITION
11073    
11074  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
11075    
11076          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11077    
# Line 258  Line 11158 
11158    
11159          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
11160          records.          records.
11161          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
11162    
11163          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11164          into the underlying table.          into the underlying table.
# Line 296  Line 11196 
11196          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11197          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
11198    
11199  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
11200    
11201          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11202          tree window already open          tree window already open
# Line 424  Line 11324 
11324          * 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
11325          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
11326          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
11327          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11328          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
11329    
11330          * 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 11385 
11385          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
11386          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
11387          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
11388          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
11389          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
11390    
11391  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 566  Line 11466 
11466          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
11467          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
11468    
11469  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
11470    
11471          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
11472          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 795  Line 11695 
11695          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11696          position in the statusbar          position in the statusbar
11697    
11698  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
11699    
11700          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11701    
11702  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
11703            
11704          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
11705    
11706          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
11707    
11708          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
11709    
11710  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11711            box
11712    
11713    2002-04-21  Jan-Oliver Wagner <[email protected]>
11714    
11715          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11716    
11717          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
11718    
11719          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11720          icon; added map_full_extend as tool          icon; added map_full_extend as tool
11721    
11722  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
11723    
11724          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11725          saving _new_ sessions          saving _new_ sessions
# Line 920  Line 11821 
11821    
11822          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
11823          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
11824    
11825  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
11826    
11827          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11828          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
11829    
11830          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11831          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
11832          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
11833          too.          too.
# Line 1037  Line 11937 
11937          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
11938          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
11939    
11940          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11941          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
11942          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
11943          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
11944          the application's OnInit method          the application's OnInit method
# Line 1054  Line 11954 
11954          layer to the tableview dialog.          layer to the tableview dialog.
11955    
11956          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
11957          (TableGrid):          (TableGrid):
11958          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
11959          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
11960          (TableFrame.__init__):          (TableFrame.__init__):
# Line 1121  Line 12021 
12021  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
12022    
12023          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12024            
12025          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12026          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
12027            
12028          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12029          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
12030          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 12071 
12071          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
12072          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
12073          link_file method          link_file method
12074            
12075          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12076          the window when the first layer is added to the map.          the window when the first layer is added to the map.
12077    
# Line 1208  Line 12108 
12108          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
12109          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12110          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
12111            
12112          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
12113          installer          installer
12114    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26