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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2272 - (show annotations)
Wed Jul 7 12:53:05 2004 UTC (20 years, 8 months ago) by jschuengel
Original Path: trunk/thuban/ChangeLog
File size: 382746 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26