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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2513 - (show annotations)
Mon Dec 27 17:00:15 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 426982 byte(s)
	svgexport 1.0.0cvs: Fixed label export.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	class TestSVGRenderer(): New class; new test test_label_font().

	* Extensions/svgexport/svgmapwriter.py
	(SVGRenderer.label_font()): initialised Font size with self.factor now,
	makes test_label_font happy.

	* Extensions/svgexport/TODO: crossed out fixed label export item.
	Added item for options.

	* Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26