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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2525 - (show annotations)
Thu Jan 20 10:00:34 2005 UTC (20 years, 1 month ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 428249 byte(s)
	* Thuban/UiI/about.py: take iso-8859-15 when getdefaultlocale returns
	None. (Fixes rt#2910.)

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26