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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2511 - (show annotations)
Mon Dec 27 16:31:32 2004 UTC (20 years, 2 months ago) by russell
Original Path: trunk/thuban/ChangeLog
File size: 426163 byte(s)
The middle button now pans the map view.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26