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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2296 - (hide annotations)
Thu Jul 22 13:05:50 2004 UTC (20 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 389346 byte(s)
Use support.run_tests as the main
function when running asa script.

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

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26