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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26