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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2482 - (show annotations)
Sat Dec 18 02:36:59 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 423769 byte(s)
	svgexport 1.0.0: Treats holes and islands nicely. Documentation added.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	Added new tests: test_export_polygon_with_hole()
	and test_polygon_with_hole().

	* Extensions/svgexport/svgmapwriter.py
	(draw_polygon_shape()): Uses DrawPath correctly now.

	* Doc/manual/thuban-manual.xml: Added documentation for stable
	extention svgexport.
	* Doc/manual/thuban-manual-de.xml: Copied English section about
	svexport over.

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

	* Extensions/svgexport/svgsaver.py,maplegend.py:
	Moved from experimental to stable extension menu.

	* Extensions/svgexport/TODO: updated.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26