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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2470 - (show annotations)
Thu Dec 16 11:00:10 2004 UTC (20 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 419675 byte(s)
Fix for RT#2237

(ProjFrame._show_proj_panel): If the
panel to be shown is the UnknownProjPanel disable the OK and Try
buttons.  Otherwise enable them.
(ProjFrame.__GetProjection): The UnknownProjPanel returns None for
the parameters.  In that case __GetProjection also returns None
now.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26