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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2388 - (show annotations)
Mon Nov 15 16:27:41 2004 UTC (20 years, 4 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 406118 byte(s)
* Extensions/svgexport/: Minor improvements to doc strings.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26