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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2338 - (hide annotations)
Fri Aug 20 16:50:22 2004 UTC (20 years, 6 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 397208 byte(s)
Changes to be consistent with coding style

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26