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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2480 - (show annotations)
Sat Dec 18 00:29:04 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 422941 byte(s)
	Refactored in svgexport:
	DrawPath replaces DrawPolygon; added newline in front of "M" in paths.

	* Extensions/svgexport/svgmapwriter.py
	Added verbosity level 3 to print out polygon points.
	(class Point): added __repr__
	(class Brush, __str__()): Added space after ,.
	(DrawPolygon): Renamed to DrawPath()
	(DrawPath): Takes list of polygons as input now, adds \n before "M"s.
	(DrawLines): Using DrawPath now.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	Replaced DrawPolygon() calls with DrawPath() and put the first argument
	inside another list. Adapted test data with a newline before "M".

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26