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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2512 - (show annotations)
Mon Dec 27 16:47:51 2004 UTC (20 years, 2 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 426465 byte(s)
Fixing russells loginfo.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26