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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2448 - (show annotations)
Mon Dec 13 11:53:51 2004 UTC (20 years, 3 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 416725 byte(s)
Added Alternative Path feature

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26