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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2381 - (show annotations)
Mon Oct 4 16:44:05 2004 UTC (20 years, 5 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 404784 byte(s)
Added missing self-test

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26