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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2338 - (show annotations)
Fri Aug 20 16:50:22 2004 UTC (20 years, 6 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 397208 byte(s)
Changes to be consistent with coding style

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26