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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2308 - (show annotations)
Wed Jul 28 12:47:04 2004 UTC (20 years, 7 months ago) by jschuengel
Original Path: trunk/thuban/ChangeLog
File size: 391741 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26