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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2343 - (show annotations)
Mon Sep 20 08:13:32 2004 UTC (20 years, 5 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 397918 byte(s)
Fixed typos in docstrings.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26