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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2269 - (show annotations)
Tue Jul 6 14:35:16 2004 UTC (20 years, 8 months ago) by jschuengel
Original Path: trunk/thuban/ChangeLog
File size: 382439 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26