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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2487 - (show annotations)
Sat Dec 18 22:57:34 2004 UTC (20 years, 2 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 424328 byte(s)
Some fixes of gns2shp extension.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26