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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2397 - (show annotations)
Thu Nov 18 20:19:04 2004 UTC (20 years, 3 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 407544 byte(s)
Now the hit test considers the size of point symbols.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26