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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2297 - (show annotations)
Thu Jul 22 13:07:52 2004 UTC (20 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 389740 byte(s)
* Thuban/UI/viewport.py (ViewPort.VisibleExtent): New.  Return the
visible extent of the map in projected coordinates

* test/test_viewport.py (SimpleViewPortTest.test_default_size)
(SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
tests.
(SimpleViewPortTest.test_visible_extent): New. The real test for
VisibleExtent()

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26