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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2351 - (show annotations)
Sat Sep 25 18:49:20 2004 UTC (20 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 399704 byte(s)
(TestLayer.test_arc_layer_with_projection):
Remove a debug print and some tab characters.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26