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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2425 - (show annotations)
Sat Nov 27 20:22:38 2004 UTC (20 years, 3 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 411544 byte(s)
	* Extensions/svgexport/test/test_svgmapwriter.py:
	Removed Jan from author list as he did not change enough significant
	lines yet.

	* Extensions/svgexport/__init__.py: Added Bernhard as author
	of the Extension.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26