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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2442 - (show annotations)
Thu Dec 9 10:51:09 2004 UTC (20 years, 3 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 413756 byte(s)
ChangeLog updated

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26