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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2323 - (show annotations)
Tue Aug 3 12:00:47 2004 UTC (20 years, 7 months ago) by jschuengel
Original Path: trunk/thuban/ChangeLog
File size: 394238 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26