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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2419 - (show annotations)
Fri Nov 26 11:44:32 2004 UTC (20 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 411147 byte(s)
(Testobjectexport.test_transparent_polygon): Commented out some
debug prints

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26