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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2339 - (show annotations)
Fri Aug 20 16:59:21 2004 UTC (20 years, 6 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 397401 byte(s)
Fix bug in projection handling of layers

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26