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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2349 - (show annotations)
Thu Sep 23 19:38:30 2004 UTC (20 years, 5 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 399281 byte(s)
Added xmi file for documentation.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26