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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2460 - (show annotations)
Wed Dec 15 14:01:04 2004 UTC (20 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 419061 byte(s)
(PostgreSQLServer.execute_sql): Extend to
so that it returns a result for select statements.
(PostgreSQLServer.server_version): New.  Return the version of the
server software.
(PostgreSQLServer.require_authentication): The format of
pg_hba.conf has changed between PostgrSQL 7.2 and 7.3.  Check the
server version and generate the file in the correct format

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26