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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2337 - (hide annotations)
Fri Aug 13 16:37:21 2004 UTC (20 years, 6 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 397081 byte(s)
Update for the ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26