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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2435 - (show annotations)
Tue Dec 7 16:44:51 2004 UTC (20 years, 3 months ago) by nhueffme
Original Path: trunk/thuban/ChangeLog
File size: 412939 byte(s)
Adding a new extension to read shapefiles with ogr. It is planned to add other
vector formats.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26