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

Legend:
Removed from v.803  
changed lines
  Added in v.2562

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26