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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1639 - (show annotations)
Fri Aug 22 18:19:27 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 266799 byte(s)
update ChangeLog

1 2003-08-22 Bernhard Herzog <[email protected]>
2
3 Implement saving a session with a postgis connection
4
5 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
6 elements for database connections and shapestores using db
7 connections
8 (session): Add the dbconnections to the content model
9
10 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
11 Write the db connections
12 (SessionSaver.write_session): Call write_db_connections to write
13 the connection before the data sources
14 (SessionSaver.write_data_containers): Handle postgis shapestores
15
16 * test/test_save.py (SaveSessionTest.thubanids)
17 (SaveSessionTest.thubanidrefs): Update for new DTD
18 (SaveSessionTest.test_save_postgis): New. Test saving a session
19 with postgis connections
20
21 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
22 (PostGISTable.TableName): New accessor methods for the connection
23 and table name
24
25 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
26 (TestPostGISTable.test_dbname): New methods to test the new
27 PostGISConnection methods
28
29 2003-08-22 Bernhard Herzog <[email protected]>
30
31 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
32 for exceptions occurring when establishing a Database connection
33 (PostGISConnection.connect): Catch psycopg.OperationalError during
34 connects and raise ConnectionError.
35
36 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
37 tests for database exceptions
38
39 2003-08-22 Bernhard Herzog <[email protected]>
40
41 Prepare the test suite for tests with required authentication
42
43 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
44 variables with two predefined users/passwords, one for the admin
45 and one for a non-privileged user.
46 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
47 the non-privileged user to the database and set the admin password
48 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
49 Better error reporting
50 (PostgreSQLServer.connection_params)
51 (PostgreSQLServer.connection_string): New methods to return
52 information about how to connect to the server
53 (PostgreSQLServer.execute_sql): New. Convenience method to execute
54 SQL statements
55 (PostgreSQLServer.require_authentication): Toggle whether the
56 server requires authentication
57 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
58 Add or alter users
59 (PostGISDatabase.initdb): Pass the admin name one the
60 subprocesses' command lines. Grant select rights on
61 geometry_columns to everybody.
62 (upload_shapefile): Use the admin name and password when
63 connecting. Grant select rights on the new table to everybody.
64
65 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
66 server's new methods to get the connection parameters.
67
68 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
69 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
70 server's new methods to get the connection parameters.
71
72 * test/test_postgis_db.py
73 (TestPostGISConnection.test_gis_tables_empty)
74 (TestPostGISConnection.test_gis_tables_non_empty)
75 (PostGISStaticTests.setUp): Use the server's new methods to get
76 the connection parameters.
77
78 2003-08-22 Bernhard Herzog <[email protected]>
79
80 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
81
82 * Thuban/version.py: Add psycopg version
83
84 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
85 version of the psycopg module
86
87 2003-08-22 Bernhard Herzog <[email protected]>
88
89 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
90 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
91 at the moment. The functionality should probably be implemented
92 some time, though.
93 (DBFrame.OnRemove): Display a message if the connection can't be
94 removed because it's still in use.
95
96 2003-08-22 Jan-Oliver Wagner <[email protected]>
97
98 * Thuban/UI/about.py (About.__init__): split up the huge about
99 text into elements/lists for easier translation. This fixes bug
100 https://intevation.de/rt/webrt?serial_num=2058
101 Also, made some forgotten string available for the i18n.
102
103 2003-08-21 Bernhard Herzog <[email protected]>
104
105 Make postgis support really optional including insensitive menu
106 items.
107
108 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
109 whether the postgis is supported.
110
111 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
112 to make postgis support optional
113
114 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
115 version of Thuban.Model.postgisdb.has_postgis_support
116 (database_management command): Make it only sensitive if postgis
117 is supported.
118
119 2003-08-21 Jan-Oliver Wagner <[email protected]>
120
121 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
122 (section Adding and Removing Layers): Added text and described
123 multi-selection.
124 (chapter Extensions): New.
125
126 2003-08-21 Jan-Oliver Wagner <[email protected]>
127
128 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
129 settings to allow multiple files to load into the map.
130 Also reduced selection to *.shp as a default.
131
132 2003-08-20 Bernhard Herzog <[email protected]>
133
134 Add dialogs and commands to open database connections and add
135 database layers.
136
137 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
138 method to open the database connection management dialog
139 (MainWindow.AddDBLayer): New method to add a layer from a database
140 (_has_dbconnections): New helper function to use for sensitivity
141 (database_management command, layer_add_db command): New commands
142 that call the above new methods.
143 (main_menu): Add the new commands to the menu.
144
145 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
146 (PostGISConnection.connect): Establish the actual connection in a
147 separate method and call it in __init__. This makes it easier to
148 override the behavior in test cases
149 (PostGISConnection.BriefDescription): New method to return a brief
150 description for use in dialogs.
151
152 * test/test_postgis_db.py (NonConnection): DB connection that
153 doesn't actually connect
154 (TestBriefDescription): New class with tests for the new
155 BriefDescription method
156
157 2003-08-19 Jan-Oliver Wagner <[email protected]>
158
159 Moved anything from extensions to libraries.
160
161 * libraries: New.
162
163 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
164
165 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
166 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
167 been moved here from thuban/extensions/pyprojection/
168 See there in the Attic for the older history.
169
170 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
171 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
172 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
173 have been moved here from thuban/extensions/pyshapelib/
174 See there in the Attic for the older history.
175
176 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
177 files have been moved here from thuban/extensions/shapelib/
178 See there in the Attic for the older history.
179
180 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
181 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
182 thuban/extensions/thuban/
183 See there in the Attic for the older history.
184
185 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
186
187 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
188 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
189
190 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
191 Moved to libraries/shapelib.
192
193 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
194 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
195 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
196 Moved to libraries/pyshapelib.
197
198 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
199 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
200 Moved to libraries/pyprojection.
201
202 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
203
204 * extensions: Removed.
205
206 2003-08-19 Bernhard Herzog <[email protected]>
207
208 * test/test_viewport.py (ViewPortTest): We don't use the
209 facilities of FileTestMixin so don't derive from it.
210 (TestViewportWithPostGIS): New class with tests for using a
211 viewport on a map with postgis layers.
212
213 2003-08-19 Bernhard Herzog <[email protected]>
214
215 Add the db connection management to the session.
216
217 * Thuban/Model/session.py (Session.__init__): New instance
218 variable db_connections
219 (Session.AddDBConnection, Session.DBConnections)
220 (Session.HasDBConnections, Session.CanRemoveDBConnection)
221 (Session.RemoveDBConnection): New methods to manage and query the
222 db connections managed by the session
223 (Session.OpenDBShapeStore): New method to open a shapestore from a
224 db connection
225
226 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
227 messages for the db connection handling in the session
228
229 * test/test_postgis_session.py: New. test cases for the session's
230 db connection handling with postgis connections
231
232 2003-08-19 Bernhard Herzog <[email protected]>
233
234 Add very basic postgis database support and the corresponding test
235 cases. The test cases require a PostgreSQL + postgis installation
236 but no existing database. The database will be created
237 automatically by the test cases
238
239 * test/README: Add note about skipped tests and the requirements
240 of the postgis tests.
241
242 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
243
244 * test/test_postgis_db.py: New. Test cases for the postgis
245 support.
246
247 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
248 format
249
250 * test/test_wellknowntext.py: New. Test cases for the
251 wellknowntext parser
252
253 * test/postgissupport.py: New. Support module for tests involving
254 a postgis database.
255
256 * test/support.py (execute_as_testsuite): Shut down the postmaster
257 if it's still running after the tests
258
259 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
260 well known text format
261
262 2003-08-19 Jan-Oliver Wagner <[email protected]>
263
264 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
265 message dialog.
266
267 2003-08-18 Bernhard Herzog <[email protected]>
268
269 * test/support.py (ThubanTestResult.printErrors): Indent the
270 reason for the skips in the output to make it a bit more readable.
271 (execute_as_testsuite): New helper function to run a test suite
272 and print some more information.
273 (run_tests): Use execute_as_testsuite to run the tests
274
275 * test/runtests.py (main): Use execute_as_testsuite to run the
276 tests
277
278 2003-08-18 Bernhard Herzog <[email protected]>
279
280 Fix some bugs in Thuban and the test suite that were uncovered by
281 changes introduced in Python 2.3:
282
283 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
284 filename is an absolute name
285
286 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
287 filename is an absolute name
288
289 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
290 unique filename to save to and use the correct relative filename
291 in the expected output.
292 (SaveSessionTest.test_dbf_table): Use the correct relative
293 filename in the expected output.
294
295 * test/test_layer.py (TestLayer.test_raster_layer): Update the
296 test to check whether the filename is absolute.
297
298 2003-08-18 Jan-Oliver Wagner <[email protected]>
299
300 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
301
302 2003-08-15 Bernhard Herzog <[email protected]>
303
304 Change the way shapes are returned by a shape store. The
305 ShapesInRegion method returns an iterator over actual shape
306 objects instead of a list of shape ids.
307
308 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
309 id.
310 (ShapefileStore.ShapesInRegion): Return an iterator over the
311 shapes which yields shape objects instead of returning a list of
312 shape ids
313 (ShapefileStore.AllShapes): New. Return an iterator over all
314 shapes in the shape store
315 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
316
317 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
318 doc-string.
319
320 * Thuban/UI/baserenderer.py
321 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
322 layer_shapes and make it return an iterator containg shapes
323 instead of a list of ids.
324 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
325 layer_shapes() change
326
327 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
328 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
329
330 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
331 changes in the ShapesInRegion return value.
332 (ViewPort._get_hit_tester): Remove commented out code
333
334 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
335 new return value.
336 (SimpleShapeStore.AllShapes): New. Implement this method too.
337
338 * test/test_layer.py (TestLayer.test_arc_layer)
339 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
340 (TestLayer.test_point_layer_with_projection)
341 (TestLayer.test_derived_store): Adapt to changes in the
342 ShapesInRegion return value.
343
344 * test/test_shapefilestore.py
345 (TestShapefileStoreArc.test_shapes_in_region)
346 (TestShapefileStorePolygon.test_shapes_in_region)
347 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
348 in the ShapesInRegion return value.
349 (TestShapefileStorePoint.test_all_shapes)
350 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
351 methods
352
353 * test/test_derivedshapestore.py
354 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
355 the ShapesInRegion return value.
356 (TestDerivedShapeStore.test_all_shapes)
357 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
358 methods
359
360 2003-08-15 Bernhard Herzog <[email protected]>
361
362 Make the renderers deal correctly with raw vs. python level
363 representation of shape geometries
364
365 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
366 Return a flag useraw in addition to the callable and the parameter
367 to indicate whether the callable can deal with the raw shape data
368 or uses the higher level python lists of coordinates. The callable
369 now should accept either the raw data or the return value of the
370 shape's Points() method.
371 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
372 change
373 (BaseRenderer.projected_points): Instead of the shape id use the
374 points list as parameter.
375 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
376 (BaseRenderer.draw_point_shape): Adapt to projected_points()
377 change and accept the points list as parameter instead of the
378 shape id.
379
380 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
381 the useraw flag as required by the BaseRenderer
382 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
383 changes.
384
385 * test/test_baserenderer.py
386 (TestBaseRenderer.test_point_with_classification): New test for
387 rendering a map with classifications.
388
389 2003-08-15 Bernhard Herzog <[email protected]>
390
391 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
392 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
393 (ViewPort._get_hit_tester, ViewPort.projected_points)
394 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
395 (ViewPort._find_label_at): Split the find_shape_at method into
396 several new methods and use the functions in the hit-test module.
397
398 * Thuban/UI/hittest.py: New module with Python-level hit-testing
399 functions
400
401 * test/test_hittest.py: New. Test for the new hittest module
402
403 2003-08-15 Bernhard Herzog <[email protected]>
404
405 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
406 projection to all corners of the bounding box to get a better
407 approximation of the projected bounding box
408
409 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
410 New. Test coordinate handling of a layer with a projection.
411 Catches the bug fixed in Layer.ShapesInRegion
412
413 2003-08-15 Bernhard Herzog <[email protected]>
414
415 Move some of the mock objects in test_baserenderer into their own
416 module so they can easily be used from other tests
417
418 * test/mockgeo.py: New test helper module with some mock objects
419 for geometry related things like shapes, shapestores and
420 projections.
421
422 * test/test_mockgeo.py: New. Tests for the new helper module
423
424 * test/test_baserenderer.py: Some of the mock-objects are in
425 mockgeo now.
426
427 2003-08-12 Jan-Oliver Wagner <[email protected]>
428
429 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
430
431 2003-08-12 Bernhard Herzog <[email protected]>
432
433 * po/de.po: New. German translations by Bjoern Broscheit
434
435 2003-08-12 Bernhard Herzog <[email protected]>
436
437 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
438 strings have to be one string literal.
439
440 2003-08-11 Bernhard Herzog <[email protected]>
441
442 * test/support.py (FloatComparisonMixin.assertPointListEquals):
443 New. This method was used in various derived classes, but it's
444 better to have it here.
445
446 * test/test_shapefilestore.py
447 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
448 FloatComparisonMixin
449
450 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
451 It's now in FloatComparisonMixin
452
453 * test/test_derivedshapestore.py
454 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
455 in FloatComparisonMixin
456
457 2003-08-11 Bernhard Herzog <[email protected]>
458
459 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
460 error message
461
462 2003-08-08 Jan-Oliver Wagner <[email protected]>
463
464 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
465 with version number.
466 Changed title to reflect version number of Thuban.
467
468 2003-08-08 Jan-Oliver Wagner <[email protected]>
469
470 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
471 the list corresponds to the "About" web page.
472
473 2003-08-08 Bernhard Herzog <[email protected]>
474
475 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
476 Make sure translated strings are recognized as one string literal.
477
478 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
479 Make sure translated strings are recognized as one string literal.
480
481 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
482 translated strings are recognized as one string literal.
483
484 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
485 sure translated strings are recognized as one string literal.
486
487 2003-08-07 Bernhard Herzog <[email protected]>
488
489 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
490 Simply delegates to the original shapestore.
491
492 * test/test_derivedshapestore.py
493 (TestDerivedShapeStore.test_raw_format): New. Test case for
494 DerivedShapeStore.RawShapeFormat
495
496 2003-08-07 Bernhard Herzog <[email protected]>
497
498 Add raw data interface to shape objects.
499
500 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
501 class to ShapefileShape which now holds shapefile specific
502 information.
503 (ShapefileShape.compute_bbox): Simplified to not cache any
504 information. The way this method is used that shouldn't matter
505 performance wise.
506 (ShapefileShape.RawData): New. Return the shapeid which is the raw
507 data format for shapes from shapefiles.
508 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
509 in the shape objects returned by a shapestore. For a
510 ShapefileStore this is always RAW_SHAPEFILE.
511 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
512 method.
513
514 * test/test_shapefilestore.py
515 (TestShapefileStore.test_raw_format): New test to test the raw
516 format feature of shapes.
517
518 * Thuban/Model/layer.py: Remove the unused import of Shape from
519 data. It was only there for interface compatibility but it's not
520 used inside of Thuban and the generic Shape class has gone away.
521
522 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
523 the raw data format and only use an optimized version of its a
524 shapefile.
525
526 2003-08-07 Bernhard Herzog <[email protected]>
527
528 * test/test_baserenderer.py (SimpleShape): Shape class for the
529 tests.
530 (SimpleShapeStore.Shape): Use SimpleShape instead of
531 Thuban.Model.data.Shape to make the tests independed of the coming
532 changes.
533
534 2003-08-07 Bernhard Herzog <[email protected]>
535
536 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
537 (ThubanTestProgram): New classes that extend the respective
538 classes from unittest. These new version support skipping tests
539 under certain expected conditions. In the Thuban test suite we
540 uses this for tests that require the optional gdal support.
541 (run_tests): Use ThubanTestProgram instead of the unittest.main()
542
543 * test/runtests.py (main): Use the new ThubanTestRunner instead of
544 the normal one from unittest
545
546 * test/test_layer.py (TestLayer.test_raster_layer): If this test
547 is not run because gdal support isn't available report this to the
548 runner.
549
550 * test/test_baserenderer.py
551 (TestBaseRenderer.test_raster_no_projection): Do not run this test
552 if gdal support isn't available and report this to the runner.
553
554 2003-08-06 Bernhard Herzog <[email protected]>
555
556 Rearrange the renderers a bit, partly in preparation for changes
557 required for the postgis merge, partly to make it more testable.
558 Also make the representation of coordinates in Shapes more
559 consistent.
560
561 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
562 this class is now in BaseRenderer. This class is now practically
563 only a specialization of BaseRenderer for rendering to an actual
564 wx DC.
565 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
566 to get the shapetype specific rendering functions.
567
568 * Thuban/UI/baserenderer.py: New file with the basic rendering
569 logic. The code in this file is completely independend of wx.
570 (BaseRenderer): Class with the basic rendering logic
571
572 * test/test_baserenderer.py: New. Test cases for BaseRenderer
573
574 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
575 error_on_redraw to guard agains endless loops and stack overflows
576 when there's a bug in the rendering code that raises exceptions.
577 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
578 rendering into a separate method _do_redraw so that error handling
579 is a bit easier. When an exception occurs, set error_on_redraw to
580 true. When it's true on entry to OnIdle do nothing and return
581 immediately.
582
583 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
584 Shape object will always have the coordinates as a list of list of
585 coordinate pairs (tuples).
586 (Shape.compute_bbox): Adapt to new representation.
587
588 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
589 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
590 Shape objects.
591
592 * test/test_shapefilestore.py
593 (ShapefileStoreTests.assertFloatTuplesEqual)
594 (ShapefileStoreTests.assertPointListEquals): Rename to
595 assertPointListEquals and change purpose to checking equality of
596 the lists returned by Shape.Points().
597 (TestShapefileStoreArc.test_shape)
598 (TestShapefileStorePolygon.test_shape)
599 (TestShapefileStorePoint.test_shape): Use the new
600 assertPointListEquals instead of assertFloatTuplesEqual
601
602 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
603 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
604 and change purpose to checking equality of the lists returned by
605 Shape.Points().
606 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
607 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
608 (TestLayer.test_derived_store): Use the new assertPointListEquals
609 instead of assertFloatTuplesEqual
610
611 * test/test_derivedshapestore.py
612 (TestDerivedShapeStore.assertFloatTuplesEqual)
613 (TestDerivedShapeStore.assertPointListEquals): Rename to
614 assertPointListEquals and change purpose to checking equality of
615 the lists returned by Shape.Points().
616 (TestDerivedShapeStore.test_shape): Use the new
617 assertPointListEquals instead of assertFloatTuplesEqual
618
619 2003-08-06 Jan-Oliver Wagner <[email protected]>
620
621 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
622 a bounding box. A dialog is raised in case, no bounding box
623 is found. This fixes bug #2043:
624 https://intevation.de/rt/webrt?serial_num=2043
625
626 2003-08-05 Bernhard Herzog <[email protected]>
627
628 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
629 object look like a Color instantiation. Formerly it looked like a
630 tuple.
631
632 * test/test_color.py (TestColor.test_repr)
633 (TestColor.test_equality, TestColor.test_inequality): New. test
634 some more apects of the Color class
635 (TestTransparent.test_repr, TestTransparent.test_hex)
636 (TestTransparent.test_equality): New. Test cases for the
637 Transparent object.
638
639 2003-08-04 Jan-Oliver Wagner <[email protected]>
640
641 * Doc/manual/thuban-manual.xml: a number of small improvements.
642 The resulting file is the version submitted for GREAT-ER II.
643
644 2003-08-01 Bernhard Herzog <[email protected]>
645
646 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
647 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
648 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
649
650 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
651 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
652 (ThubanEndBusyCursor): Add doc-strings
653
654 2003-08-01 Bernhard Herzog <[email protected]>
655
656 First step towards PostGIS integration. More abstraction by movin
657 more code from the layer to the shapestore. More methods of the
658 layer are now simply delegated to the equivalent method of the
659 shapestore. The SHAPETYPE_* constants are now in data not in
660 layer.
661
662 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
663 (SHAPETYPE_POINT, Shape): Move these constants and classes from
664 layer.py to data.py
665 (ShapefileStore.__init__): More Initialization for the new methods
666 and functionality.
667 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
668 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
669 (ShapefileStore.Shape): New methods that were formerly implemented
670 in the layer.
671 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
672 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
673 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
674 equivalents of the new shape methods. These versions are simply
675 delegated to the original shapstore.
676
677 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
678 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
679 (Layer.SetShapeStore): Removed the initializatin of instance
680 variables that were needed for the stuff that's now in
681 ShapefileStore
682 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
683 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
684 shapestore.
685
686 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
687 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
688 instead of layer.
689
690 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
691
692 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
693
694 * test/test_layer.py: Import the SHAPETYPE_* constants from data
695 instead of layer.
696 (TestLayer.test_derived_store): Remove the test for the exception
697 when instantiating the DerivedShapeStore with an incompatible
698 table which is now in test_derivedshapestore.py. Add some more
699 tests of the layer methods to determine whether they work for a
700 DerivedShapeStore as well.
701
702 2003-07-31 Jonathan Coles <[email protected]>
703
704 * Doc/manual/thuban-manual.xml: Fix the list of required packages
705 by just listing the name and where they can be found.
706
707 2003-07-31 Frank Koormann <[email protected]>
708
709 * Doc/manual/thuban-manual.xml:
710 Changed the screenshot elements to figure.
711 Changed some variablelist elements to itemizedlist.
712 Added section on GDAL formats.
713
714 2003-07-31 Jonathan Coles <[email protected]>
715
716 * Doc/manual/thuban-manual.xml: Added a few sentences about
717 the Fix Border Color option when generating classes.
718
719 2003-07-30 Jonathan Coles <[email protected]>
720
721 * Thuban/Model/classgen.py: Add docstrings. Rename specific
722 Ramp instances to use lower_case_style.
723
724 * Thuban/UI/classgen.py: Use renamed Ramp instances.
725
726 * Thuban/UI/classifier.py: Add docstrings.
727
728 * Thuban/UI/dock.py: Add docstrings.
729
730 * test/test_classgen.py: Use renamed Ramp instances.
731
732 2003-07-30 Bernhard Herzog <[email protected]>
733
734 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
735 was never used in Thuban.
736
737 2003-07-30 Bernhard Herzog <[email protected]>
738
739 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
740 method directly instead of going through the transient_table
741 method. This faster because transient_table may force the copy of
742 a DBF file into the transient database and setting a table's title
743 doesnm't affect the title of the associated transient table, so
744 this fixes RT #2042
745
746 * Thuban/UI/main.py (__version__): Don't import the already
747 removed show_exception_dialog.
748
749 2003-07-29 Jonathan Coles <[email protected]>
750
751 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
752 Put back this method and remove the equivalent function since we
753 are setting the exception hook from within this class (OnInit).
754
755 2003-07-29 Jonathan Coles <[email protected]>
756
757 * Doc/manual/images/5_2_custom_ramp.png,
758 Doc/manual/images/5_2_quantiles.png,
759 Doc/manual/images/5_2_uniform_dist.png,
760 Doc/manual/images/5_2_unique_values.png,
761 Doc/manual/images/8_int_error.png: New screen shots.
762
763 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
764 some points, and added more screen shots.
765
766 2003-07-29 Bernhard Herzog <[email protected]>
767
768 * Thuban/Model/data.py: Remove the now unused import of warnings
769
770 2003-07-29 Bernhard Herzog <[email protected]>
771
772 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
773 deprecated since before the 0.8 release and isn't used in Thuban
774 itself anymore.
775
776 * Thuban/Model/transientdb.py: Remove some unnecessary imports
777
778 2003-07-29 Jonathan Coles <[email protected]>
779
780 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
781 python exception hook here so that we are sure to catch any
782 Thuban exception that happen during initialization.
783
784 * Thuban/UI/main.py (main): Don't set the exception hook here,
785 it will get set in ThubanApplication.OnInit.
786
787 2003-07-29 Jonathan Coles <[email protected]>
788
789 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
790 Removed and called it show_exception_dialog() so that the exception
791 handler can be set before the class is created.
792
793 * Thuban/UI/main.py (main): Install the exception handler before
794 a ThubanApplication is created.
795
796 2003-07-29 Bernhard Herzog <[email protected]>
797
798 * po/it.po: New. Italian translation by Maurizio Napolitano
799
800 * po/ru.po: New. Russian translation by Alex Shevlakov
801
802 2003-07-29 Frank Koormann <[email protected]>
803
804 * Doc/manual/thuban-manual.xml: Extended section on supported
805 projections.
806
807 2003-07-29 Frank Koormann <[email protected]>
808
809 * Doc/manual/thuban-manual.xml: gaspell-checked.
810
811 2003-07-29 Jonathan Coles <[email protected]>
812
813 * Doc/manual/images/3_5_legend.png: Added border to improve look
814 on white background.
815
816 2003-07-29 Jonathan Coles <[email protected]>
817
818 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
819 descriptions for the legend toolbar.
820
821 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
822 cursor from dialog box.
823
824 2003-07-28 Jonathan Coles <[email protected]>
825
826 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
827
828 * Doc/manual/images/2_4_session_tree.png,
829 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
830 Doc/manual/images/4_2_layer_properties.png,
831 Doc/manual/images/4_2_raster_layer_properties.png,
832 Doc/manual/images/5_3_genclass.png,
833 Doc/manual/images/5_classification.png,
834 Doc/manual/images/6_projection.png,
835 Doc/manual/images/7_1_table_view.png,
836 Doc/manual/images/7_2_5_join.png: New screenshots.
837
838 2003-07-24 Jonathan Coles <[email protected]>
839
840 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
841
842 2003-07-24 Jonathan Coles <[email protected]>
843
844 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
845 chapter on Layer Management.
846
847 * Doc/manual/Makefile: New. Makefile to generate all formats for the
848 manual and images.
849
850 2003-07-24 Bernhard Herzog <[email protected]>
851
852 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
853 it annoys lintian which warns about these files not being
854 executable. The #1 isn't necessary here since if you absolutely
855 must execute them you can always say "python <filename>".
856
857 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
858 superfluous code to set brush and pen for point shapes
859
860 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
861 belong in viewport anyway
862
863 2003-07-24 Frank Koormann <[email protected]>
864
865 * Doc/manual/thuban-manual.xml: Added section on table management.
866
867 2003-07-24 Bernhard Herzog <[email protected]>
868
869 * test/runtests.py (main): Recognize the long "verbose" option
870 correctly.
871
872 2003-07-22 Jonathan Coles <[email protected]>
873
874 * Doc/manual/thuban-manual.xml: Continue to write first revision
875 of the manual.
876
877 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
878 with Begin/EndDrawing() calls to ensure we aren't doing to
879 many updates to the dc during rendering.
880 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
881 a pen and brush argument so they need to be passed to the function.
882
883 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
884 Calculates the minimum and maximum scale values. Factored out
885 of set_view_transform so that it could be used to zoom all the
886 way into a single point.
887 (ViewPort.set_view_transform): Call calc_min_max_scales().
888 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
889 if only a single point is selected.
890
891 * Doc/manual/images/1_2_legend_close.png,
892 Doc/manual/images/1_2_legend_dock.png,
893 Doc/manual/images/1_2_mainwindow.png,
894 Doc/manual/images/1_2_mainwindow.ps,
895 Doc/manual/images/1_2_mainwindow.sk,
896 Doc/manual/images/3_2_fullextent.png,
897 Doc/manual/images/3_2_fulllayerextent.png,
898 Doc/manual/images/3_2_fullshapeextent.png,
899 Doc/manual/images/3_2_pan.png,
900 Doc/manual/images/3_2_zoomin.png,
901 Doc/manual/images/3_2_zoomout.png,
902 Doc/manual/images/3_3_identify.png,
903 Doc/manual/images/3_3_label.png,
904 Doc/manual/images/3_5_invisible.png,
905 Doc/manual/images/3_5_movedown.png,
906 Doc/manual/images/3_5_moveup.png,
907 Doc/manual/images/3_5_props.png,
908 Doc/manual/images/3_5_tobottom.png,
909 Doc/manual/images/3_5_totop.png,
910 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
911
912 2003-07-18 Bernhard Herzog <[email protected]>
913
914 * Thuban/UI/messages.py (MAP_REPLACED): New message.
915
916 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
917 after the new map has been assigned
918
919 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
920 Delegate MAP_REPLACED to the canvas too
921 (MainWindow.prepare_new_session): Removed. Thanks to the new
922 MAP_REPLACED message it's no longer needed
923 (MainWindow.OpenSession, MainWindow.NewSession):
924 prepare_new_session has been removed.
925
926 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
927 MAP_REPLACED so that we can close the dialog if a new map is set.
928 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
929 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
930 dialog
931
932 * test/test_viewport.py (SimpleViewPortTest)
933 (SimpleViewPortTest.test_default_size): Add doc-strings
934 (ViewPortTest.setUp): Bind map to self.map so we can use it in
935 tests. Subscribe to MAP_REPLACED messages too.
936 (ViewPortTest.tearDown): No need to explicitly unsubscribe
937 (ViewPortTest.test_set_map): New test for the SetMap method.
938
939 2003-07-18 Bernhard Herzog <[email protected]>
940
941 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
942 Move this test from ViewPortTest.setUp to this new separate test
943 case. setUp is not the place for the actual tests.
944 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
945 more of the test from setUp to the new test test_inital_settings.
946 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
947 (ViewPortTest.test_proj_conv): Split test_proj_conv into
948 test_win_to_proj and test_proj_to_win and make the tests easier to
949 understand
950 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
951 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
952 (ViewPortTest.test_unprojected_rect_around_point)
953 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
954 Reformat to increase readability.
955
956 2003-07-18 Bernhard Herzog <[email protected]>
957
958 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
959
960 2003-07-18 Bernhard Herzog <[email protected]>
961
962 * test/runtests.py: The test suite can now be run without an X
963 connection. To make sure this remains true, remove the DISPLAY
964 environment variable so that an error occurs if the wxGTK is
965 imported accidentally
966
967 2003-07-18 Bernhard Herzog <[email protected]>
968
969 * Thuban/UI/viewport.py: Remove unused imports
970
971 * Thuban/UI/view.py: Remove unused imports
972
973 2003-07-18 Bernhard Herzog <[email protected]>
974
975 * test/test_export.py Remove unused imports. The OutputTransform
976 function is now in viewport.py and is called output_transform
977 (TestScalebar.test_output_transform)
978 (TestScalebar.test_OutputTransform): Renamed to
979 test_output_transform and updated to use output_transform instead
980 of OutputTransform
981
982 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
983 renamed.
984 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
985 renamed to output_transform
986
987 * Thuban/UI/viewport.py (OutputTransform, output_transform):
988 Rename to output_transform
989
990 2003-07-18 Bernhard Herzog <[email protected]>
991
992 * Thuban/Model/layer.py (Layer.__init__): Rename
993 classificationField to classificatin_column and init it here so
994 that it can be used in SetClassificationColumn
995 (Layer.GetClassificationColumn, Layer.GetClassificationField):
996 Rename to GetClassificationColumn.
997 (Layer.SetClassificationColumn, Layer.SetClassificationField):
998 Rename to SetClassificationColumn and issue a LAYER_CHANGED
999 message if the column changes.
1000 (Layer._classification_changed, Layer.ClassChanged): Rename to
1001 _classification_changed. Update the callers.
1002 (Layer.SetShapeStore): Further field->column renames.
1003
1004 * Thuban/Model/load.py (SessionLoader.start_classification)
1005 (SessionLoader.start_clpoint): Updates because of
1006 field->column method name changes in the Layer class
1007
1008 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
1009 because of field->column method name changes in the Layer class
1010
1011 * Thuban/UI/classifier.py (Classifier.__init__)
1012 (Classifier._OnTry, Classifier._OnRevert): Updates because of
1013 field->column method name changes in the Layer class
1014
1015 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
1016 because of field->column method name changes in the Layer class
1017
1018 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
1019 of field->column method name changes in the Layer class
1020
1021 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
1022 (SaveSessionTest.testClassifiedLayer): Update because of
1023 field->column method name changes in the Layer class
1024
1025 * test/test_layer.py (SetShapeStoreTests.setUp)
1026 (SetShapeStoreTests.test_sanity): Update because of field->column
1027 method name changes in the Layer class
1028 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
1029 (TestLayerModification.test_sanity)
1030 (TestLayerModification.test_initial_settings): remove unsued code
1031 and rename to test_sanity.
1032 (TestLayerModification.test_set_classification): New test for
1033 SetClassification and SetClassificationField.
1034
1035 2003-07-18 Bernhard Herzog <[email protected]>
1036
1037 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
1038 the non-fixed values as well. The old test would have accepted a
1039 fixed ramp that only returnes the fixed properties
1040
1041 2003-07-17 Jonathan Coles <[email protected]>
1042
1043 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
1044 shots for the manual. The XCF file is the source image and
1045 has additional layers to support changes.
1046
1047 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
1048
1049 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
1050 Return both the new class and the field name.
1051
1052 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
1053 fit the map to the window as this changes any zoom level that
1054 the user may have set.
1055
1056 2003-07-16 Jonathan Coles <[email protected]>
1057
1058 * Thuban/Model/classgen.py (generate_singletons,
1059 generate_uniform_distribution, generate_quantiles): Remove
1060 fixes parameter, but maintain the same functionality by having
1061 the calling function pass a FixedRamp object for the ramp.
1062 (FixedRamp): New. Adapts a ramp to have fixed property values.
1063
1064 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
1065 (Classification): Inherit from Publisher.
1066 (Classification.__init__): Remove the layer parameter.
1067 Classifications no longer need to have a parent layer.
1068 (Classification.GetField, Classification.GetFieldType,
1069 Classification.SetFieldInfo): Removed. The field name is stored
1070 in the layer, and the type can be retreived by calling
1071 Layer.GetFieldType().
1072 (Classification._set_layer, Classification.GetLayer): Removed.
1073 Classifications no longer have a parent layer.
1074
1075 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
1076 classification.
1077 (Layer.SetShapeStore): Reset the classification first while
1078 we still have the old shape store to work with.
1079 (Layer.GetClassificationField, Layer.SetClassificationField):
1080 New. Method for getting/setting the field to classify on.
1081 (Layer.SetClassification): Simplified now that the layer
1082 simply has to hold a reference to the classification and not
1083 tell the classification who owns it.
1084 Fixes RTbug #2023.
1085
1086 * Thuban/Model/load.py (SessionLoader.start_classification):
1087 Set the field name on the layer, not the classification.
1088
1089 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
1090 classification is modified.
1091
1092 * Thuban/Model/save.py (SessionSaver.write_classification):
1093 Get the field name and type from the layer.
1094
1095 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
1096 parameter records to rows and add docstring. Fixes RTbug #1997.
1097
1098 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
1099 ramp when we need to fix certain values of a ramp rather than
1100 using the old fixes parameter. Fixes RTbug #2024.
1101
1102 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
1103 parameter.
1104 (ClassTable.Reset): Add fieldType parameter and use it, rather
1105 than asking the classification.
1106 (Classifier.__init__): Remember the original class's field
1107 and ask the layer for the field type, rather than the classification.
1108 (Classifier.__SetGridTable): Retrieve the field and field type
1109 for the table because they are not in the classification.
1110 (Classifier._OnTry, Classifier._OnRevert): Set the classification
1111 field on the layer in addition to the classification itself.
1112
1113 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
1114 classification field from layer.
1115
1116 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
1117 classification field from layer. Split up tests and remove
1118 *-imports. Fixes RTbug #1992.
1119
1120 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
1121
1122 * test/test_classification.py
1123 (TestClassification.test_classification): Remove tests for methods
1124 that no longer exist.
1125
1126 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
1127 __init__ no longer has a field parameter, use SetClassificationField.
1128 (SetShapeStoreTests.test_sanity): Use layer object to get class
1129 field info.
1130
1131 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
1132 SetClassificationField on layer to set class field info.
1133
1134 * test/test_viewport.py: Renamed from test/test_view.py.
1135
1136 2003-07-16 Jan-Oliver Wagner <[email protected]>
1137
1138 * Doc/manual/thuban-manual.xml: Added authors and an initial
1139 coarse structure.
1140
1141 2003-07-15 Bernhard Herzog <[email protected]>
1142
1143 * test/support.py (FloatComparisonMixin): This is a mix-in class
1144 and therefore should not be derived from any other class.
1145
1146 * test/test_range.py (RangeTest): FloatComparisonMixin is a
1147 mix-in, so derive from TestCase as well.
1148
1149 2003-07-15 Bernhard Herzog <[email protected]>
1150
1151 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
1152 draw_func handling a bit to remove one layer of indirection. This
1153 makes the renderer about 10% faster in the non-classifying case
1154 and the code a bit cleaner
1155 (MapRenderer.draw_point_shape): Add the pen and brush parameters
1156 and set them in the dc. Now the draw_point_shape method and
1157 wxproj's draw_polygon_shape function have basically the same
1158 signature so that both can be directly used as draw_func
1159
1160 2003-07-15 Bernhard Herzog <[email protected]>
1161
1162 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
1163 string values (in addition to the labels) as UTF 8
1164
1165 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
1166 values if the field type is string
1167
1168 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
1169 saving a session with non-ascii string classification values.
1170
1171 * test/test_load.py (TestClassification.file_contents)
1172 (TestClassification.test): Check for non-ascii values in string
1173 classifications
1174
1175 2003-07-14 Jonathan Coles <[email protected]>
1176
1177 * test/test_view.py: New. Tests for ViewPort.
1178
1179 2003-07-14 Frank Koormann <[email protected]>
1180
1181 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
1182 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
1183
1184 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
1185 unicode strings from session file: session title, map title and
1186 projection name.
1187
1188 2003-07-10 Jonathan Coles <[email protected]>
1189
1190 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
1191 drag_stop, not drag_move when the mouse is released.
1192
1193 2003-07-10 Jonathan Coles <[email protected]>
1194
1195 The most important part of this is the seperation of view.py into
1196 two pieces. viewport.py now has a class called ViewPort which
1197 contains all the non-wx parts of view.py and can therefore be
1198 tested. view.py contains only the wx-specific parts and is fairly
1199 simple.
1200
1201 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
1202 RTTbug #1992.
1203 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
1204 RTTbug #1992.
1205
1206 * Thuban/Model/classgen.py (generate_singletons,
1207 generate_uniform_distribution, generate_quantiles):
1208 Added 'fixes' parameter so that property attributes can
1209 be held constant over the generated classification groups.
1210 (CustomRamp.GetProperties): Remove unused variables.
1211
1212 * Thuban/Model/map.py (Map.SetProjection): Send the old
1213 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
1214 event.
1215
1216 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
1217 parameter which is a list of records that restricts which
1218 records are saved. Fixes RTbug #1997.
1219
1220 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1221 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
1222
1223 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
1224 to allow the user to fix line color/width on generated groups.
1225 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
1226 functions to optionally fix group properties.
1227
1228 * Thuban/UI/main.py (main): Set exception hook to the
1229 ShowExceptionDialog. Fixes RTbug #1993.
1230
1231 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
1232 the table window when it is selectd to be shown.
1233
1234 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
1235 Export Selection button and move the export buttons underneath
1236 the table.
1237 (QueryTableFrame.UpdateStatusText): Added event argument so
1238 that it can respond to grid selection events. The status text
1239 is now updated even when the table is not associated with a
1240 layer as was previously assumed.
1241 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
1242 UpdateStatusText responds to these events.
1243 (QueryTableFrame.OnSaveAs): Renamed to doExport.
1244 (QueryTableFrame.doExport): Helper function that saves the
1245 entire table, or selected rows, to a file.
1246 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
1247 Respond to export button events and call doExport.
1248
1249 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
1250 the function doesn't return NULL without first setting a Python
1251 Error.
1252
1253 * test/runtests.py (main): Only print "Unknown option" for
1254 unsupported options.
1255
1256 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
1257 optional epsilon argument to specify floating point accuracy.
1258 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
1259 for each item test.
1260
1261 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
1262 tests for saving selected records.
1263
1264 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1265 tests for saving selected records.
1266
1267 * test/test_map.py (TestMapWithContents.test_set_projection):
1268 MAP_PROJECTION_CHANGED events send the old projection.
1269
1270 * test/test_session.py
1271 (TestSessionWithContent.test_forward_map_projection):
1272 MAP_PROJECTION_CHANGED events send the old projection.
1273
1274 * test/test_table.py (TableTest): Update tests to use non-deprecated
1275 functions.
1276
1277 2003-07-08 Bernhard Herzog <[email protected]>
1278
1279 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
1280 constants in the column objects are the standard ones defined in
1281 the table module.
1282
1283 * test/test_transientdb.py
1284 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
1285 exporting transient tables as DBF works. This should catch the bug
1286 just fixed in TransientTableBase.Width.
1287
1288 2003-07-08 Bernhard Herzog <[email protected]>
1289
1290 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
1291 interpolated colors correctly.
1292
1293 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
1294 New. Test case for the fix in classgen.py
1295
1296 2003-07-08 Bernhard Herzog <[email protected]>
1297
1298 * test/runtests.py (main): Make the default output less verbose
1299 and add a verbosity option (-v) to get the old output
1300
1301 2003-07-08 Bernhard Herzog <[email protected]>
1302
1303 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
1304 0.9.
1305
1306 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
1307 New. Return the join type
1308
1309 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
1310 DTD
1311 (SessionSaver.write_data_containers): Save the join type for
1312 joined tables
1313
1314 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
1315 namespace
1316 (SessionLoader.start_jointable): Handle the jointype attribute
1317
1318 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
1319 as of Thuban 0.8. These are now tests to determine whether Thuban
1320 can still read files generated by Thuban 0.8
1321
1322 * test/test_load.py (LoadSessionTest.dtd)
1323 (TestSingleLayer.file_contents)
1324 (TestLayerVisibility.file_contents, TestLabels.file_contents)
1325 (TestLayerProjection.file_contents)
1326 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1327 (TestJoinedTable.file_contents)
1328 (TestLoadError.file_contents): Update for new DTD
1329 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
1330 for new join type attribute
1331
1332 * test/test_save.py (SaveSessionTest.dtd)
1333 (SaveSessionTest.testEmptySession)
1334 (SaveSessionTest.testSingleLayer)
1335 (SaveSessionTest.testLayerProjection)
1336 (SaveSessionTest.testRasterLayer)
1337 (SaveSessionTest.testClassifiedLayer)
1338 (SaveSessionTest.test_dbf_table)
1339 (SaveSessionTest.test_joined_table): Update for new DTD
1340 (SaveSessionTest.test_joined_table): Add test for new join type
1341 attribute
1342
1343 2003-07-04 Bernhard Herzog <[email protected]>
1344
1345 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
1346 function for table_to_dbf
1347 (table_to_dbf): Deal with names longer than the 10 character limit
1348
1349 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1350 doc-string
1351 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
1352 long column names
1353
1354 2003-07-03 Bernhard Herzog <[email protected]>
1355
1356 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
1357
1358 2003-07-03 Bernhard Herzog <[email protected]>
1359
1360 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
1361 for the Thuban manual and README with some basic information about
1362 the manual
1363
1364 2003-07-03 Bernhard Herzog <[email protected]>
1365
1366 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1367 Update doc-string
1368 (TransientJoinedTable.create): Do not modify the column objects of
1369 the input tables in place and copy all columns of the input tables
1370 into the joined table after all.
1371
1372 * test/test_transientdb.py
1373 (TestTransientTable.test_transient_joined_table_same_column_name):
1374 Update to reflect the new behavior
1375 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1376 Update to reflect the new behavior
1377 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
1378 New test case for a bug which modified the column objects in place
1379
1380 2003-07-02 Jonathan Coles <[email protected]>
1381
1382 * Thuban/Model/classgen.py (generate_singletons,
1383 generate_uniform_distribution, generate_quantiles,
1384 GenQuantiles0): Make sure maxValue isn't less than
1385 one, otherwise we could divide by zero.
1386
1387 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
1388 ClassGenTest.doClassSingleTest): Call doBoundsTest to
1389 check the end classification groups against the
1390 proper property values.
1391 (ClassGenTest.doBoundsTest): New. Checks the first and
1392 last classification groups to make sure their properties
1393 are the correct upper and lower bounds for a color ramp.
1394
1395 2003-07-02 Jonathan Coles <[email protected]>
1396
1397 * Thuban/Model/classgen.py (generate_singletons,
1398 generate_uniform_distribution, generate_quantiles,
1399 GenQuantiles0): The denominator was one to high when
1400 calculating the index for the ramp causing the index
1401 to never to reach one.
1402
1403 2003-07-02 Jonathan Coles <[email protected]>
1404
1405 Changed the singature of ClassGroupRange.__init__ and
1406 ClassGroupRange.SetRange() so that the min/max values are
1407 passed as a tuple. This makes a better calling scheme for
1408 when a Range object is passed instead.
1409
1410 * Thuban/Model/classgen.py: Fixed parameters to
1411 ClassGroupRange constructor.
1412
1413 * Thuban/Model/classification.py (ClassGroupRange.__init__):
1414 Consolidate the min/max parameters into a single _range which
1415 can either be a tuple or a Range object.
1416 (ClassGroupRange.SetRange): Consolidate the min/max parameters
1417 into a single _range which can either be a tuple or a Range object.
1418
1419 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
1420 call to ClassGroupRange constructor to use a tuple.
1421
1422 * Thuban/Model/layer.py (Layer.SetClassification): Switch
1423 the classification instance variable to the new class
1424 before calling _set_layer otherwise subscribers to a
1425 LAYER_CHANGED event will not see any difference.
1426
1427 * test/test_classification.py: Fix tests of ClassGroupRange
1428 so that they use the new signature.
1429
1430 * test/test_load.py: Fix use of ClassGroupRange so that it
1431 uses the new signature.
1432
1433 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
1434 uses the new signature.
1435
1436 * test/test_save.py: Fix use of ClassGroupRange so that it
1437 uses the new signature.
1438
1439
1440 2003-07-01 Jonathan Coles <[email protected]>
1441
1442 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
1443 Import used objects/class from color.
1444 (generate_singletons): We don't
1445 need the numGroups parameter anymore because we are using
1446 the new ramps with GetProperties().
1447 (generate_uniform_distribution): Use new ramp method
1448 GetProperties().
1449 (generate_quantiles, GenQuantiles0): Use new ramp method
1450 GetProperties().
1451 (CustomRamp.SetNumGroups): Removed. The ramps now map
1452 a value from 0 to 1 to class properties so the number
1453 of groups is not needed ahead of time.
1454 (CustomRamp.next): Removed. CustomRamp does not support
1455 interation anymore.
1456 (CustomRamp.GetProperties): Returns a ClassGroupProperties
1457 object based on the index value from 0 to 1 that is
1458 passed to it.
1459 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
1460 Made into instances of Monochromatic class instread of
1461 deriving from it.
1462 (HotToCold.SetNumGroups): Removed. See CustomRamp.
1463 (HotToCold.next): Removed. See CustomRamp.
1464
1465 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
1466 (Classification.SetField, Classification.SetFieldType):
1467 Replaced with SetFieldInfo.
1468 (Classification.SetFieldInfo): New. Does a better job of
1469 what SetField and SetFieldType used to do by combining
1470 their function since they should really always be done
1471 at the same time.
1472 (Classification.SetLayer): Renamed to _set_layer.
1473 (Classification._set_layer): Should only be called from
1474 Layer's SetClassification. This does not cause a recursive
1475 call as SetLayer did because we know that Layer knows about
1476 the classification.
1477
1478 * Thuban/Model/color.py: Fixes RTbug #1971.
1479 (_Transparent): Renamed from Transparent so it doesn't
1480 conflict with the module variable.
1481 (Transparent, Black): Renamed from Color.Transparent,
1482 Color.Black so they are not class variables.
1483
1484 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
1485 (Layer.Destroy): We don't need to call SetClassification
1486 anymore to clear out the back reference in the classifcation
1487 to the layer. It's better to set it to None using _set_layer,
1488 and we won't be creating another clas object too.
1489 (Layer.SetClassification): Classification._set_layer is not
1490 recursive so remove all the locking variables. Also clean
1491 up the code so that it remains unchanged if something fails.
1492
1493 * Thuban/Model/load.py: Fixes RTbug #1971.
1494 (SessionLoader.start_classification): Call
1495 Classification.SetFieldInfo().
1496
1497 * Thuban/Model/save.py: Removed import of Color which wasn't
1498 being used.
1499
1500 * Thuban/UI/classgen.py: Fixes RTbug #1972.
1501 (ClassGenDialog.__init__): Color ramps are now instances
1502 already so we don't need to create any new objects.
1503 (ClassGenDialog.OnOK): Check for numGroups is no longer
1504 necessary because we never use it.
1505
1506 * Thuban/UI/classifier.py: Fixes RTbug #1971.
1507 (Classifier.__BuildClassification, Classifier.__SetGridTable):
1508 Call Classification.SetFieldInfo() instead of SetFieldType.
1509
1510 * Thuban/UI/renderer.py: Fixes RTbug #1971.
1511
1512 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
1513 (MapCanvas.__init__): Subscribe to the idle time event. Set
1514 background color to white.
1515 (MapCanvas.OnPaint): Set a flag indicating that we should
1516 render the map during idle time. If we already have a bitmap
1517 just draw it now.
1518 (MapCanvas.OnIdle): New. Render the map only during idle time.
1519 This also fixes a problem with the busy cursor under gtk.
1520
1521 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
1522 Fix calls to generate_singletons because the signature changed.
1523
1524 * test/test_classification.py: Fix color references and
1525 change calls to Classification.[SetField|SetFieldType] to
1526 SetFieldInfo.
1527
1528 * test/test_load.py: Fix color references.
1529
1530 * test/test_load_0_2.py: Fix color references.
1531
1532 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
1533 Change calls to Classification.[SetField|SetFieldType] to
1534 SetFieldInfo.
1535
1536 2003-07-01 Frank Koormann <[email protected]>
1537
1538 MERGE from the greater-ms3 branch.
1539
1540 * test/test_transientdb.py
1541 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1542 New. Test join of two tables with partly equal column names.
1543
1544 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
1545 If duplicates in left and right tables column names are found,
1546 append '_' (underscores) to the name until it is unique.
1547 Create always new internal names for the resulting table and reference
1548 columns in the join statement with <table>.<column>
1549
1550 2003-07-01 Bernhard Herzog <[email protected]>
1551
1552 * test/test_transientdb.py
1553 (TestTransientTable.test_transient_joined_table_same_column_name):
1554 New. Test whether joining on columns with the same names in both
1555 tables works.
1556
1557 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
1558 sure to use the right internal names even when joining on field
1559 with the same names in both tables. Also, detect duplicate names
1560 in the joined table correctly.
1561
1562 2003-07-01 Frank Koormann <[email protected]>
1563
1564 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1565 Reverse List of layers to render in same order as in desktop legend.
1566
1567 2003-06-30 Jonathan Coles <[email protected]>
1568
1569 * Thuban/version.py (make_tuple): Takes a version string
1570 and splits it into a tuple of at most three integers.
1571 Used make_tuple() to make tuple versions of the version
1572 numbers.
1573
1574 * Thuban/UI/about.py: Add Thuban email addresses.
1575
1576 2003-06-30 Jonathan Coles <[email protected]>
1577
1578 * Thuban/version.py: SQLite/PySQLite version dependencies
1579 were too high.
1580
1581 2003-06-30 Jonathan Coles <[email protected]>
1582
1583 * Thuban/version.py: Update version to 0.8.1
1584
1585 * MANIFEST.in: Added Projections so that default.proj is
1586 included.
1587
1588 2003-06-26 Jonathan Coles <[email protected]>
1589
1590 New About box with lots more information including library
1591 versions and credits. More/better version checking before
1592 Thuban starts.
1593
1594 * Thuban/UI/about.py: New. New About box that displays
1595 library version information and credits.
1596
1597 * Thuban/version.py: Added new 'versions' dictionary which
1598 contains the verions of various libraries which are checked
1599 when the module loads.
1600 (verify_versions): Check all version numbers and returns
1601 a list of errors.
1602
1603 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
1604 Reset the status of the buttons as the situation warrants,
1605 but in a better more reliable way by not relying on the
1606 current status to determine what needs to change.
1607
1608 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
1609 (verify_versions): Remove most of the code since it is
1610 now in Thuban.version.verify_versions.o
1611
1612 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
1613 About box in Thuban.UI.about.
1614
1615 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
1616 Returns the version of gdal library being used as a string.
1617
1618 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1619 Removed.
1620 (get_proj_version): Return the version of PROJ that the file
1621 was compiled with.
1622 (get_gtk_version): Return th version of GTK that the file
1623 was compiled with.
1624
1625 2003-06-25 Jonathan Coles <[email protected]>
1626
1627 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1628 of the SelectPropertiesDialog should be self so the window
1629 appears on top.
1630 (ClassGroupPropertiesCtrl.DoEdit): The parent
1631 of the SelectPropertiesDialog should be self so the window
1632 appears on top.
1633
1634 * Thuban/UI/resource.py: Cleaned up how we determine file
1635 extensions.
1636 (GetImageResource): Return an wxImage from our Resources.
1637
1638 2003-06-24 Jonathan Coles <[email protected]>
1639
1640 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1641 Check that a layer has a classification before trying
1642 to get it. Raster layers don't have classifications.
1643
1644 2003-06-23 Jonathan Coles <[email protected]>
1645
1646 * setup.py: Add Resources/XML to resource list.
1647
1648 2003-06-23 Jonathan Coles <[email protected]>
1649
1650 * setup.cfg: Fix copyright dates
1651
1652 2003-06-23 Jonathan Coles <[email protected]>
1653
1654 * MANIFEST.in: Update with Resources/XML
1655
1656 * setup.py: Don't include Locale resources yet as we don't
1657 have any and it causes problems building the distribution
1658 for Windows. Update version to 0.8.0.
1659
1660 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
1661
1662 * Thuban/UI/mainwindow.py: Add blank line at the end because
1663 file was not being read correctly building the Windows
1664 distribution.
1665
1666 2003-06-23 Jonathan Coles <[email protected]>
1667
1668 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
1669
1670 * Thuban/version.py: Temporarily update longversion for
1671 the 0.8 release so that it doesn't have the cvs revision.
1672
1673 2003-06-23 Jonathan Coles <[email protected]>
1674
1675 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
1676 to make sure that we don't create reentrant possibilities with
1677 wxYield.
1678
1679 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
1680 directly to avoid the wxSafeYield() call which generates an
1681 OnPaint event causing infinite recursion. Don't try to catch
1682 exception anymore. This was for before there were limits on map
1683 scaling.
1684
1685 2003-06-23 Bernhard Herzog <[email protected]>
1686
1687 Bug fix for RT #1961:
1688
1689 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
1690 Register DerivedShapestores with the session
1691
1692 * Thuban/Model/session.py (Session.Tables): Make sure each table
1693 is only listed once.
1694
1695 * test/test_load.py (TestJoinedTable.test): Add check_format call.
1696 Update file contents to match the one written out.
1697
1698 2003-06-20 Bernhard Herzog <[email protected]>
1699
1700 * test/xmlsupport.py (SaxEventLister.startElementNS)
1701 (SaxEventLister.endElementNS): Do not include the qname. Python
1702 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
1703 is (presumably incorrectly) None, whereas it's a string with the
1704 element name in the later versions.
1705
1706 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
1707 (TestEventList.test_even_list_namespace): Update tests to reflect
1708 the new behaviour
1709 (TestEventList.test_even_list_id_normalization): Fix doc-string
1710
1711 2003-06-20 Jonathan Coles <[email protected]>
1712
1713 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
1714 by deriving classes to determine if that layer supports shapes.
1715 (Layer): Override HasShapes and return true.
1716
1717 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
1718 instead of a direct call to wx[Begin|End]CusyCursor().
1719 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
1720 table data.
1721
1722 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
1723 New. Wrappers around the wxWindows functions that allow us to
1724 make additional calls such as wxYield which gives the native
1725 system a chance to update the cursor correctly.
1726
1727 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
1728 instead of a direct call to wx[Begin|End]CusyCursor().
1729
1730 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
1731 instead of a direct call to wx[Begin|End]CusyCursor().
1732 (MapCanvas.find_shape_at): Check if the current search layer
1733 support shapes, otherwise go on to the next layer.
1734
1735 * test/test_layer.py: Add tests in each type of layer for
1736 HasClassification() and HasShapes()
1737
1738 2003-06-20 Jonathan Coles <[email protected]>
1739
1740 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1741 turning on the busy cursor to allow the system to change the
1742 cursor before we begin painting. This fixes a problem that
1743 was occuring only under GTK. Fixes RTbug #1840.
1744
1745 2003-06-20 Bernhard Herzog <[email protected]>
1746
1747 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1748 version.
1749
1750 * Thuban/Model/save.py (sort_data_stores): New. Make topological
1751 sort of the data sources so they can be written with sources that
1752 data sources that depend on other data sources come after the
1753 sources they depend on.
1754 (SessionSaver.__init__): Add idmap instance variable to map from
1755 objects to the ids used in the file.
1756 (SessionSaver.get_id, SessionSaver.define_id)
1757 (SessionSaver.has_id): New. Methods to manage the idmap
1758 (SessionSaver.write): Use thuban-0.8.dtd
1759 (SessionSaver.write_session): Add a namespace on the session and
1760 write out the data sources before the maps.
1761 (SessionSaver.write_data_containers): New. Write the data
1762 containers.
1763 (SessionSaver.write_layer): Layer elements now refer to a
1764 shapestore and don't contain filenames anymore.
1765
1766 * Thuban/Model/load.py (LoadError): Exception class to raise when
1767 errors in the files are discovered
1768 (SessionLoader.__init__): Define dispatchers for elements with a
1769 thuban-0.8 namespace too.
1770 (SessionLoader.check_attrs): New helper method to check and
1771 convert attributes
1772 (AttrDesc): New. Helper class for SessionLoader.check_attrs
1773 (SessionLoader.start_fileshapesource)
1774 (SessionLoader.start_derivedshapesource)
1775 (SessionLoader.start_filetable, SessionLoader.start_jointable):
1776 Handlers for the new elements in the new fileformat
1777 (SessionLoader.start_layer): Handle the shapestore attribute in
1778 addition to filename.
1779 (SessionLoader.start_table, SessionLoader.end_table): Removed.
1780 They were never used in the old formats and aren't needed for the
1781 new.
1782
1783 * Thuban/Model/session.py (Session.DataContainers): New method to
1784 return all "data containers", i.e. shapestores and tables
1785
1786 * test/xmlsupport.py (SaxEventLister.__init__)
1787 (SaxEventLister.startElementNS, sax_eventlist): Add support to
1788 normalize IDs.
1789
1790 * test/test_xmlsupport.py
1791 (TestEventList.test_even_list_id_normalization): New test case for
1792 id normalization
1793
1794 * test/test_load.py (LoadSessionTest.check_format): Use ID
1795 normalization
1796 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1797 class atrributes used for ID normalization
1798 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1799 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1800 file format
1801 (TestJoinedTable): New test for loading sessions with joined
1802 tables.
1803 (TestLoadError): New. Test whether missing required attributes
1804 cause a LoadError.
1805
1806 * test/test_save.py (SaveSessionTest.thubanids)
1807 (SaveSessionTest.thubanidrefs): New class attributes for ID
1808 normalization in .thuban files.
1809 (SaveSessionTest.compare_xml): Use id-normalization.
1810 (SaveSessionTest.testEmptySession)
1811 (SaveSessionTest.testLayerProjection)
1812 (SaveSessionTest.testRasterLayer)
1813 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1814 (SaveSessionTest.testLayerProjection): The filename used was the
1815 same as for testSingleLayer. Use a different one.
1816 (SaveSessionTest.test_dbf_table)
1817 (SaveSessionTest.test_joined_table): New test cases for saving the
1818 new data sources structures.
1819 (TestStoreSort, MockDataStore): Classes to test the sorting of the
1820 data stores for writing.
1821
1822 * test/runtests.py: Add CVS keywords
1823
1824 2003-06-20 Jonathan Coles <[email protected]>
1825
1826 * test/test_session.py
1827 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1828 Use the cultural_landmark-point.dbf file for the store so that
1829 the table rows and shape count match.
1830
1831 2003-06-20 Jonathan Coles <[email protected]>
1832
1833 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1834 an exception if the number of shapes is different from the
1835 number of rows in the table. Address RTbug #1933.
1836
1837 * test/test_layer.py (TestLayer.test_derived_store): Add
1838 a test for the new exception in DerivedShapeStore.__init__.
1839
1840 * test/support.py (FloatTestCase): Removed since there is
1841 already FloatComparisonMixin. Fixes RTbug #1954.
1842 (FloatComparisonMixin.assertFloatEqual): Include test for
1843 infinity that was part of FloatTestCase.
1844
1845 * test/test_range.py (RangeTest): Inherit from
1846 support.FloatComparisonMixin now that we don't have
1847 support.FloatTestCase.
1848
1849 2003-06-20 Bernhard Herzog <[email protected]>
1850
1851 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1852 the implementation in xmlsupport instead.
1853 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1854
1855 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1856 of test_save
1857
1858 2003-06-20 Bernhard Herzog <[email protected]>
1859
1860 * test/test_load.py (LoadSessionTest.check_format): New helper
1861 method to make sure the test files we load might have been written
1862 by the current thuban version.
1863 (ClassificationTest.TestLayers, TestSingleLayer.test)
1864 (TestLayerVisibility.test, TestClassification.test)
1865 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1866 Add check_format() calls and fix the thuban data to match the data
1867 that would be written by saving the session loaded from it.
1868
1869 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1870 the same class and function in test_save.
1871
1872 * test/test_xmlsupport.py (TestEventList): New. test cases for
1873 sax_eventlist
1874
1875 2003-06-20 Bernhard Herzog <[email protected]>
1876
1877 * Resources/XML/thuban.dtd: Add comment about which versions of
1878 Thuban are covered by this DTD
1879 (map): Fix content model for layers and raster layers. There can
1880 be any number or layers and raster layers in any order.
1881
1882 2003-06-20 Jonathan Coles <[email protected]>
1883
1884 This is mainly about fixing RTbug #1949.
1885
1886 * Thuban/Model/classification.py: Remove "from __future__"
1887 import statement since python 2.2 is the earliest supported
1888 version.
1889
1890 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1891 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1892 depending on the units this projection *forwards* into.
1893
1894 * Thuban/Model/save.py (SessionSaver.write_classification):
1895 Remove unnecessary use of lambdas and nested functions.
1896
1897 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1898 adjustment here if the map projection uses degrees.
1899
1900 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1901 scale adjust code since it is now done before calling
1902 this method. Don't do anything if the map projection
1903 is None.
1904
1905 2003-06-19 Bernhard Herzog <[email protected]>
1906
1907 Move version specific load tests to their own file.
1908
1909 * test/test_load.py: Expand the doc-string to explain a bit how to
1910 handle file format changes.
1911 (TestClassification.test): Update the docstring as this test is
1912 not about Thuban 0.2 anymore.
1913
1914 * test/test_load_0_2.py: New file with the load tests for thuban
1915 files created with Thuban 0.2 and earlier.
1916
1917 2003-06-19 Bernhard Herzog <[email protected]>
1918
1919 Add XML validation to some of the tests. Validation will only be
1920 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1921 To make the DTD available to the test cases it's moved into
1922 Resources/XML
1923
1924 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1925 for versions up to and including 0.2. Two slight changes: added an
1926 encoding specification and fixed the comment which refered to
1927 GRASS, not Thuban
1928
1929 * test/xmlsupport.py: New support module for tests involving XML.
1930 Currently there's a mix-in class for XML validation.
1931
1932 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1933
1934 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1935 so that we can validate the
1936 (SaveSessionTest.testEmptySession)
1937 (SaveSessionTest.testSingleLayer)
1938 (SaveSessionTest.testSingleLayer)
1939 (SaveSessionTest.testLayerProjection)
1940 (SaveSessionTest.testRasterLayer)
1941 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1942
1943 * test/runtests.py (main): Call print_additional_summary instead
1944 of print_garbage_information
1945
1946 * test/support.py (resource_dir): New function to return the
1947 "Resource" subdirectory
1948 (print_additional_summary): New function to combine several
1949 summary functions
1950 (run_tests): Use print_additional_summary instead of calling
1951 print_garbage_information directly
1952
1953 2003-06-19 Bernhard Herzog <[email protected]>
1954
1955 * Doc/thuban.dtd (classification): Correct the content model of
1956 the classification element.
1957 (projection): Add the "name" attribute
1958
1959 2003-06-19 Frank Koormann <[email protected]>
1960
1961 MERGE from the greater-ms3 branch.
1962
1963 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1964 scale if projection is latlong to get better estimate.
1965
1966 Fix problem of hidden properties dialog under windows after double
1967 click on layer tree:
1968 The tree control always gets an Expanded / Collapsed event after
1969 the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
1970 raises the already displayed window.
1971
1972 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1973 raiseProperties initialized to prevent endless loops
1974 (LegendTree._OnItemActivated): Depending on self.raiseProperties
1975 simply raise the properties or open the dialog and issue a second
1976 event.
1977
1978 2003-06-18 Jonathan Coles <[email protected]>
1979
1980 * setup.py: Fix a few problems that occured under Windows.
1981
1982 2003-06-18 Jonathan Coles <[email protected]>
1983
1984 When Thuban loaded the map was redrawn twice because the
1985 legend was being opened after the mainwindow was created
1986 and not during its creation. This meant the map was drawn
1987 initially and then had to be redrawn when the legend
1988 caused the display to change. Now the legend is opened
1989 in the mainwindow constructor which resolves this issue.
1990
1991 Also, although we were checking for the existence of
1992 gdal and gdalwarp modules, the gdalwarp extension was
1993 still being compiled (which may fail if the system doesn't
1994 have gdal installed). the build_ext command to setup.py
1995 now accepts the flags --with-gdal and --without-gdal.
1996 If --without-gdal is specified setup.py will try to
1997 use the gdal parameters specified by gdal-config. Under
1998 windows, those parameters have to be set in setup.py
1999 as with proj4 an wxWindows.
2000
2001 * setup.py: Use a list instead of seperate variables for
2002 extension parameters so we can create a generic function
2003 that runs an appropriate *-config script.
2004 (run_cs_script): Renamed from run_wx_script and modified
2005 to accept a second argument which is a list of lists to
2006 be filled in by the values returned from running the command.
2007 (thuban_build_ext): New. Extends the build_ext command and
2008 provides the options --with-gdal/--without-gdal which then
2009 optionally includes the gdalwarp extension.
2010
2011 * Thuban/Model/resource.py: First check if we can import
2012 the gdalwarp Thuban extension before checking for gdal.
2013 Also added some comments.
2014
2015 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
2016 the map is None which may be the case if none has been loaded
2017 yet.
2018
2019 * Thuban/UI/main.py (main): Remove call to ShowLegend.
2020
2021 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
2022
2023 * Thuban/UI/renderer.py: Check for gdal support before importing
2024 gdalwarp.
2025 (MapRenderer.render_map): Only try to optimize if we have gdal
2026 support otherwise nothing will get drawn.
2027
2028 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
2029 during startup before a map has been created. Check if map is None
2030 before using it and do nothing if it is.
2031
2032 2003-06-17 Jonathan Coles <[email protected]>
2033
2034 Fix the problem with raster layers under Windows that caused
2035 Thuban to crash. The view should respond to layer projection
2036 changed events to update the display. Changes to a projection
2037 should not cause the map to be set to full extent.
2038
2039 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2040 current_map_proj to remember the current map projection so that
2041 when the projection changes we know what the previous projection
2042 was.
2043 (MapCanvas.SetMap): Unsubscribe and subscribe to
2044 LAYER_PROJECTION_CHANGED events.
2045 (MapCanvas.projection_changed): Split into two methods that respond
2046 to map and layer projection changes.
2047 (MapCanvas.map_projection_changed): New. Takes the current view and
2048 projects it using the new projection. This does not cause the
2049 map to be redrawn at full extent.
2050 (MapCanvas.layer_projection_changed): New. Cause a redraw which
2051 will draw each layer in its new projection.
2052
2053 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
2054 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
2055 under Windows.
2056
2057 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
2058 to twice sizeof(void*) because there are two digits for each
2059 hex byte.
2060
2061 2003-06-16 Bernhard Herzog <[email protected]>
2062
2063 Update to the layer interface: Direct access to the table,
2064 shapetable, shapefile and filename attributes is now actively
2065 deprecated by issuing deprecation warnings for all places where
2066 this happens.
2067
2068 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
2069 to the instance variables table, shapetable, shapefile and
2070 filename via __getattr__ so that we can issue a deprecation
2071 warning.
2072 (Layer.SetShapeStore): Don't set the deprecated instance variables
2073 any more
2074 (Layer.SetShapeStore): Don't use deprecated layer instance
2075 variables
2076 (Layer.Destroy): No need to explicitly remove the instance
2077 variables any more
2078 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
2079 instance variables
2080
2081 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2082 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
2083 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
2084 use deprecated layer instance variables
2085
2086 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
2087 deprecated layer instance variables
2088
2089 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2090 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
2091 instance variables
2092
2093 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
2094 deprecated layer instance variables
2095
2096 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
2097 deprecated layer instance variables
2098
2099 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
2100 deprecated layer instance variables
2101
2102 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
2103 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
2104 variables
2105
2106 * test/runtests.py (main): Turn Thuban's deprecation warnings into
2107 errors so that they're cought by the tests
2108
2109 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
2110 layer instance variables
2111
2112 2003-06-16 Jonathan Coles <[email protected]>
2113
2114 Fix a problem under Windows whereby if the user double-clicks on a
2115 layer in the legend that tree item will expand or collapse as well
2116 as open the layer properties dialog. The state of the tree item
2117 should not be affected.
2118
2119 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
2120 preventExpandCollapse and subscribe to expanding and collapsing
2121 events.
2122 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
2123 collapsing events and will veto the event if it has been triggered
2124 by the user double clicking on a layer.
2125 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
2126 that an expanding/collapsing event should be vetoed.
2127
2128 2003-06-13 Bernhard Herzog <[email protected]>
2129
2130 * Thuban/UI/classifier.py (Classifier.OnClose)
2131 (Classifier.map_layers_removed)
2132 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
2133 in OnClose and not in map_layers_removed or
2134 layer_shapestore_replaced to make sure it always happens when the
2135 dialog is closed
2136
2137 2003-06-13 Jonathan Coles <[email protected]>
2138
2139 This puts back a fix for Windows where a panel is needed so that
2140 the background of the table view appears correctly.
2141
2142 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
2143 object that can be used by derived classes to place any
2144 controls (including the grid) onto.
2145 (QueryTableFrame.__init__): Use the panel as the parent window
2146 for all the controls. Reparent the grid so that the panel is
2147 the parent. Call UpdateStatusText() to correctly initialize
2148 the status bar.
2149
2150 2003-06-13 Jonathan Coles <[email protected]>
2151
2152 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
2153 from wxFrame (as opposed to wxDialog like the other classes)
2154 but otherwise behaves like the other classes. This is needed
2155 for the TableView which isn't really a dialog and needs to
2156 have a status bar and control buttons.
2157
2158 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
2159 instance variable to keep track of how many rows are selected.
2160 Subscribe once to the the events we are interested in.
2161 (ThubanGrid.OnRangeSelect): Only handle event if event handling
2162 hasn't been turned off.
2163 (ThubanGrid.OnSelectCell): Only handle event if event handling
2164 hasn't been turned off.
2165 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
2166 as an event listener (which changes the event handler stack)
2167 simply set an instance variable to False. This is checked in
2168 the event handlers.
2169 (ThubanGrid.GetNumberSelected): Return the number of currently
2170 selected rows.
2171 (TableFrame): Inherit from ThubanFrame so we can have a
2172 status bar and control buttons.
2173 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
2174 Explicitly set which items are selected in the operator choice and
2175 action choice so there is always a valid selection. Fixes RTbug #1941.
2176 Subscribe to grid cell selection events so we can update the
2177 status bar.
2178 (QueryTableFrame.UpdateStatusText): Update the status bar with
2179 how many rows are in the grid, how many columns, and how many
2180 rows are selected.
2181 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
2182 Call UpdateStatusText when cells are (de)selected.
2183 (QueryTableFrame.OnQuery): Use the string value in the value
2184 combo if either the selected item index is 0 or if the string
2185 cannot be found in the predefined list (this happens if the
2186 user changes the text). Fixes RTbug #1940.
2187 Only turn off the grid event listeners if there a query comes
2188 back with a none empty list of ids. in the case that the list
2189 is empty this causes a grid.ClearSelection() call to actually
2190 clear the grid selection which causes the selected items in
2191 the map to be deselected. Fixes RTbug #1939.
2192
2193 * test/test_save.py (XMLWriterTest.Encode): Check return values.
2194 Fixes RTbug #1851.
2195
2196 2003-06-13 Bernhard Herzog <[email protected]>
2197
2198 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
2199 self.selected_shape with the current selection to make sure the
2200 contents of the dialog are up to date when it's shown for the
2201 first time.
2202 The dialog used to work without this by luck. The recent fix to
2203 the connector module 'broke' a 'feature' the identify view was
2204 relying on, i.e that subscribing to a message in response to
2205 receiving a message of that type would mean that the new
2206 subscriber would also be called for the same message.
2207
2208 2003-06-12 Jonathan Coles <[email protected]>
2209
2210 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
2211 the image is rendered. Fixes RTbug #1937.
2212
2213 2003-06-12 Jonathan Coles <[email protected]>
2214
2215 * Thuban/Lib/fileutil.py: As is done under Windows, create the
2216 user directory if it doesn't exist on a posix system.
2217 Fixes RTbug #1815.
2218
2219 * Thuban/Model/resource.py (get_user_proj_files): Moved the
2220 called to get_application_dir here, so that the directory
2221 will only be called if this method is invoked.
2222
2223 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
2224 the projfilepath if no projection is selected.
2225
2226 2003-06-12 Jonathan Coles <[email protected]>
2227
2228 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
2229 the scalebar if the current map has no projection set.
2230
2231 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
2232 projfilepath label to just the basename of the projection file
2233 rather than include the entire path.
2234
2235 * Thuban/Model/resource.py: Fix missed proj functions that
2236 needed to be renamed.
2237
2238 2003-06-12 Jonathan Coles <[email protected]>
2239
2240 * Thuban/Model/classification.py: Removed assert statements that
2241 tested if the variable was an instance of Color.
2242
2243 * Thuban/Model/color.py (Color): Remove commented code that isn't
2244 used.
2245 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
2246 Fixes RTbug #1835.
2247 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
2248 Needed now that the class doesn't inherit from Color.
2249
2250 2003-06-12 Jonathan Coles <[email protected]>
2251
2252 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
2253 check unicode strings.
2254
2255 * test/test_layer.py: Check for existence of gdal.
2256
2257 2003-06-12 Jonathan Coles <[email protected]>
2258
2259 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
2260 that was in load.py
2261
2262 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
2263 that was in save.py
2264
2265 2003-06-12 Jonathan Coles <[email protected]>
2266
2267 This is largely a collection of bug fixes. We also handle the
2268 case where gdal is not on the system. The XMLReader and XMLWriter
2269 classes were moved into there own files to resolve some circular
2270 import references and because they shouldn't really be in the
2271 file that is dediciated to reading/writing session files since
2272 they are also used elsewhere.
2273
2274 * Thuban/Model/classgen.py: Renamed functions to follow the
2275 function_names_with_underscores style. Fixes RTbug #1903.
2276 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2277
2278 * Thuban/Model/layer.py: Import gdal only if it available.
2279 (RasterLayer): Handle the case where the gdal library is unavailable.
2280 Addresses RTbug #1877.
2281
2282 * Thuban/Model/load.py (XMLReader): Moved into seperate file
2283 xmlreader.py.
2284
2285 2003-06-12 Jonathan Coles <[email protected]>
2286
2287 This is largely a collection of bug fixes. We also handle the
2288 case where gdal is not on the system. The XMLReader and XMLWriter
2289 classes were moved into there own files to resolve some circular
2290 import references and because they shouldn't really be in the
2291 file that is dediciated to reading/writing session files since
2292 they are also used elsewhere.
2293
2294 * Thuban/Model/classgen.py: Renamed functions to follow the
2295 function_names_with_underscores style. Fixes RTbug #1903.
2296 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2297
2298 * Thuban/Model/layer.py: Import gdal only if it available.
2299 (RasterLayer): Handle the case where the gdal library is unavailable.
2300 Addresses RTbug #1877.
2301
2302 * Thuban/Model/load.py (XMLReader): Moved into seperate file
2303 xmlreader.py.
2304
2305 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
2306 file xmlwriter.py.
2307
2308 * Thuban/Model/resource.py: Renamed functions to following the
2309 function_names_with_underscores style.
2310 (has_gdal_support): New function that returns true if the gdal
2311 library is available. Addresses RTbug #1877.
2312
2313 * Thuban/UI/application.py (ThubanApplication.OpenSession):
2314 Display a message box if the gdal library is not available, but
2315 only if there are any layers that would use it. Addresses RTbug #1877.
2316
2317 * Thuban/UI/classgen.py: Use renamed projection resource functions.
2318 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
2319 when using integers versus floats.
2320
2321 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
2322 determine if the "Add Image Layer" menu option should be
2323 greyed out or not. Addresses RTbug #1877.
2324
2325 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
2326
2327 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
2328 optimize if a raster layer is visible. Fixes RTbug #1931.
2329 Only draw the raster layer if the gdal library is available.
2330 Addresses RTbug #1877.
2331
2332 * test/test_classgen.py: Add tests for generate_singletons,
2333 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
2334 (test_calculate_quantiles): Fix some tests to catch the new
2335 ValueError that is raised.
2336
2337 * test/test_proj.py: Use renamed projection resource functions.
2338
2339 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
2340 test for saving classified layers. Fixes RTbug #1902.
2341 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
2342
2343 2003-06-12 Jan-Oliver Wagner <[email protected]>
2344
2345 Fix for http://intevation.de/rt/webrt?serial_num=1900.
2346
2347 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
2348
2349 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
2350 multiplechoicedialog.py rather than from the wxPython library.
2351
2352 2003-06-11 Frank Koormann <[email protected]>
2353
2354 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
2355 update.
2356
2357 2003-06-11 Frank Koormann <[email protected]>
2358
2359 * Thuban/Lib/fileutil.py (get_application_dir): New function to
2360 determine the absolute .thuban/thuban directory under
2361 "posix" (os.expanduser) and "nt" (read AppData registry key).
2362
2363 * Thuban/Model/resource.py: Use get_application_dir
2364
2365 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2366 Use get_application_dir.
2367
2368 2003-06-10 Bernhard Herzog <[email protected]>
2369
2370 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
2371 the messages MAP_LAYERS_REMOVED messages
2372 (LayerTableFrame.OnClose): Unsubscribe from it.
2373 (LayerTableFrame.map_layers_removed): New. Receiver for
2374 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
2375 dialog is showing is removed.
2376
2377 2003-06-10 Bernhard Herzog <[email protected]>
2378
2379 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
2380 of the receivers list so that unsubscribing in a receiver doesn't
2381 modify it while iterating over it.
2382
2383 * test/test_connector.py
2384 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
2385 unsubscribing in a receiver works correctly. See docstring for
2386 details
2387
2388 2003-06-10 Bernhard Herzog <[email protected]>
2389
2390 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
2391 message.
2392
2393 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
2394 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
2395 LAYER_CHANGED will still be sent if the classification changes.
2396
2397 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
2398 parameter so we can subscribe to some of its messages
2399 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
2400 and the layer's LAYER_SHAPESTORE_REPLACED
2401 (Classifier.unsubscribe_messages): New. Unsubscribe from message
2402 subscribed to in __init__
2403 (Classifier.map_layers_removed)
2404 (Classifier.layer_shapestore_replaced): receivers for the messages
2405 subscribed to in __init__. Unsubscribe and close the dialog
2406
2407 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
2408 the map to the Classifier dialog
2409
2410 * test/test_layer.py (SetShapeStoreTests): Derive from
2411 SubscriberMixin as well so we can test messages
2412 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
2413 messages
2414 (SetShapeStoreTests.tearDown): Clear the messages again
2415 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
2416 for the modified flag too
2417 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
2418 to check whether SetShapeStore sets the modified flag
2419 (SetShapeStoreTests.test_set_shape_store_different_field_name)
2420 (SetShapeStoreTests.test_set_shape_store_same_field)
2421 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
2422 Add tests for the messages. This checks both the new
2423 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
2424
2425 2003-06-06 Jan-Oliver Wagner <[email protected]>
2426
2427 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
2428 the menu items.
2429
2430 2003-06-05 Frank Koormann <[email protected]>
2431
2432 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2433 Layout reimplemented without panel. Make life easier to fit the list
2434 in the dialog.
2435
2436 2003-06-05 Frank Koormann <[email protected]>
2437
2438 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
2439 once on initialisation (Former implementation resulted in multiple
2440 entries for each projection).
2441 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
2442 if set, select the projection found under the specified name. This
2443 overwrites any other selection estimate.
2444 Removed projchoice filling from this method.
2445 (ProjFrame._OnSave, ProjFrame._OnAddToList):
2446 Updated call of ProjFrame.__FillAvailList
2447 (LCCPanel._DoLayout): Moved parameter controls in more common order.
2448
2449 * Resources/Projections/defaults.proj: Extended defaults representing
2450 various common European projections.
2451
2452 2003-06-05 Frank Koormann <[email protected]>
2453
2454 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2455 Use ListCtrl instead of GridCtrl
2456
2457 * Thuban/Model/resource.py:
2458 Guess location of .thuban directory from tempdir parent directory.
2459
2460 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2461 Guess location of .thuban directory from tempdir parent directory.
2462
2463 2003-06-04 Bernhard Herzog <[email protected]>
2464
2465 Do not cache the values returned by the tree widget's
2466 GetFirstChild and GetNextChild methods because it led to lots of
2467 segfaults. The new way requires more brute force but is more
2468 reliable.
2469
2470 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
2471 variable layer2id
2472 (LegendTree.find_layer): New method to do with brute force what
2473 layer2id tried to accomplish
2474 (LegendTree._OnMsgLayerChanged)
2475 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
2476 Use find_layer instead of layer2id
2477 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
2478 update layer2id anymore
2479 (LegendTree._OnMsgMapLayersRemoved)
2480 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2481
2482 2003-06-03 Thomas Koester <[email protected]>
2483
2484 * Thuban/Model/classgen.py (GenQuantiles0): New function.
2485
2486 2003-06-02 Bernhard Herzog <[email protected]>
2487
2488 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
2489 New commands.
2490 (main_menu): Add the new commands.
2491 (MainWindow.TableRename): New. Implementation of the table_rename
2492 command.
2493 (MainWindow.RenameLayer): New. Implementation of the layer_rename
2494 command.
2495
2496 * Thuban/Model/session.py (Session.AddTable): call self.changed to
2497 set the modified flag
2498
2499 * test/test_session.py (TestSessionSimple.test_add_table): Test
2500 whether the modified flag is set properly
2501
2502 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
2503 instead of issue so that the modified flags get updated.
2504
2505 * test/test_base.py (SomeTitledObject): Derive from Modifiable
2506 instead of Publisher to reflect reality better and to accomodate
2507 the fact that SetTitle now calls changed instead of issue
2508
2509 2003-06-02 Bernhard Herzog <[email protected]>
2510
2511 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
2512 acquisition has to happen before the try in a try-finally.
2513
2514 2003-06-02 Bernhard Herzog <[email protected]>
2515
2516 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
2517 possible that a layer is removed that is not currently selected in
2518 the legend so don't check for this.
2519
2520 2003-05-30 Bernhard Herzog <[email protected]>
2521
2522 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
2523 variables to None that have direct or indirect references to
2524 shapefiles or dbf files to make sure that they do go away and the
2525 files are closed.
2526
2527 2003-05-30 Bernhard Herzog <[email protected]>
2528
2529 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
2530 availImgListIndices when a new image list is created
2531
2532 2003-05-30 Bernhard Herzog <[email protected]>
2533
2534 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
2535 changing_selection to indicate whether the LegendTree code itself
2536 is currently changing the selection
2537 (LegendTree.normalize_selection): New method to normalize the
2538 selection by selecting the layer item even if the user clicked on
2539 the classification.
2540 (LegendTree._OnSelChanged): normalize the selection. This works
2541 around a bug in wx which doesn't keep track of the selection
2542 properly when subtrees are deleted.
2543
2544 2003-05-30 Bernhard Herzog <[email protected]>
2545
2546 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
2547 maximum and minimum scale factors.
2548
2549 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
2550 changes in classgen.py
2551
2552 2003-05-30 Jonathan Coles <[email protected]>
2553
2554 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
2555 all the methods functions. Fixes RTBug #1903.
2556
2557 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
2558 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
2559 RTBug #1907.
2560
2561 * Thuban/UI/classgen.py: Use classgen functions that were part
2562 of the ClassGenerator class. Put try/finally blocks around
2563 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
2564 RTBug #1904.
2565
2566 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
2567
2568 * Thuban/UI/legend.py: The legend was cleared and repopulated any
2569 time something changed which caused some state to be lost such
2570 as which children were expanded or collapsed. Fixes RTBug #1901.
2571 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
2572 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
2573 the legend but not in the map.
2574 (LegendTree.__FillTree): Move main functionality out into smaller
2575 methods that can be used by other methods.
2576 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
2577 if they are available.
2578 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
2579 that we override the wxTreeCtrl method. Iterate over children
2580 and call __RemoveLayer.
2581 (LegendTree.__AddLayer): New. Add a new layer to the legend.
2582 (LegendTree.__RemoveLayer): Remove a layer from the legend.
2583 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
2584 Should only be called with the id of a layer branch.
2585 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
2586 Returns the root item or creates one if necessary.
2587
2588 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
2589 ProjectRasterFile with tuple arguments instead of strings.
2590
2591 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
2592 with try/finally. Fixes RTBug #1904.
2593
2594 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
2595 with try/finally. Fixes RTBug #1904.
2596 (MapCanvas.FitSelectedToWindow): If a single point is selected
2597 simply center it on the display. Fixes RTBug #1849.
2598
2599 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
2600 to be compiled as a standalone app. Now the code can only be
2601 called from Python which simplifies the parameter passing.
2602 (ProjectRasterFile): Handle Python arguments. Remove code that
2603 checks for a destination dataset. Add more clean up code.
2604
2605 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
2606 TestMapWithContents.test_lower_layer_bottom):
2607 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
2608 Fixes RTBug #1907.
2609
2610 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
2611 extent to the map when the legend is toggled. Fixes RTBug #1881.
2612
2613 2003-05-29 Jan-Oliver Wagner <[email protected]>
2614
2615 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
2616 unsubscribes all that is subcribed in __init__.
2617
2618 2003-05-28 Bernhard Herzog <[email protected]>
2619
2620 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
2621 (MainWindow.CanDuplicateLayer): New methods to implement the
2622 Layer/Duplicate command.
2623 (layer_duplicate command): New.
2624 (main_menu): Add layer_duplicate to the Layer menu.
2625
2626 2003-05-28 Bernhard Herzog <[email protected]>
2627
2628 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2629 renderer so that NULL/None values get displayed differently (by a
2630 gray rectangle).
2631 (TableGrid.__init__): Override the default renderers
2632
2633 2003-05-28 Bernhard Herzog <[email protected]>
2634
2635 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2636 classification to "None" if the type of the field has changed.
2637
2638 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2639 test for the Layer.SetShapeStore method
2640
2641 2003-05-28 Jan-Oliver Wagner <[email protected]>
2642
2643 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
2644 does not necessarily have a filename).
2645
2646 2003-05-28 Jan-Oliver Wagner <[email protected]>
2647
2648 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
2649 sort the selection list for the dialog.
2650
2651 2003-05-28 Frank Koormann <[email protected]>
2652
2653 * extensions/thuban/wxproj.cpp
2654 (project_point): Removed cast to int for projected point coordinates.
2655 (shape_centroid): Return last point if all polygon vertices fall
2656 to one point.
2657
2658 2003-05-28 Bernhard Herzog <[email protected]>
2659
2660 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
2661 with layers that don't have shapestores, i.e. raster layers.
2662
2663 2003-05-28 Bernhard Herzog <[email protected]>
2664
2665 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
2666 when determining the title from the filename.
2667
2668 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
2669 reflect changes in the way the title is derived from the filename
2670
2671 2003-05-28 Frank Koormann <[email protected]>
2672
2673 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
2674 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2675
2676 2003-05-27 Bernhard Herzog <[email protected]>
2677
2678 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
2679 delegate SelectedLayer.
2680 (MainWindow.LayerUnjoinTable): Implement.
2681 (_can_unjoin): New. Helper function for the sensitivity of the
2682 layer/unjoin command.
2683
2684 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
2685 (DerivedShapeStore.OrigShapeStore): New. Return the original
2686 shapestore. Used to figure out how to unjoin.
2687 (DerivedShapeStore.Shapefile): Fix a typo.
2688
2689 2003-05-27 Bernhard Herzog <[email protected]>
2690
2691 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
2692 well
2693 (JoinDialog.__init__): Use the layer parameter and only build the
2694 left choice when a layer is given
2695 (JoinDialog.OnJoin): Handle layer joins as well
2696 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
2697 that the user selects the "Select..." item. The sensitivitly
2698 updating is now in update_sensitivity
2699 (JoinDialog.y): New method to refactor the sensitivity update of
2700 the join button into its own method.
2701
2702 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2703
2704 2003-05-27 Bernhard Herzog <[email protected]>
2705
2706 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
2707 iff there are unreferenced tables in the session
2708
2709 2003-05-27 Bernhard Herzog <[email protected]>
2710
2711 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
2712
2713 * Thuban/Model/session.py (Session.UnreferencedTables): New method
2714 to return tables that are not referenced by other tables or shape
2715 stores and can be removed.
2716 (Session.RemoveTable): Issue a TABLE_REMOVED message after
2717 removing the table
2718
2719 * Thuban/UI/mainwindow.py: Remove unused imports
2720 (MainWindow.TableClose): Implement.
2721
2722 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
2723 messages so that the frame will be automatically closed when a new
2724 session is opened or the table is removed.
2725 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
2726 __init__
2727 (TableFrame.close_on_session_replaced)
2728 (TableFrame.close_on_table_removed): New. Subscribers that close
2729 the window
2730
2731 * test/test_session.py (TestSessionMessages.test_remove_table)
2732 (TestSessionSimple.test_remove_table): Move the test to
2733 TestSessionSimple and add test for the TABLE_REMOVED message
2734 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
2735 (TestSessionSimple.test_unreferenced_tables) New. Test for the
2736 UnreferencedTables method.
2737 (UnreferencedTablesTests): New. Class with some more sophisticated
2738 tests for UnreferencedTables.
2739
2740 2003-05-27 Frank Koormann <[email protected]>
2741
2742 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2743 display has some unwanted side effects. Removed again.
2744
2745 2003-05-27 Frank Koormann <[email protected]>
2746
2747 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2748
2749 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2750
2751 2003-05-27 Jan-Oliver Wagner <[email protected]>
2752
2753 * test/test_menu.py (MenuTest.test): Added test for
2754 Menu.RemoveItem().
2755
2756 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2757 the menu.
2758
2759 2003-05-27 Frank Koormann <[email protected]>
2760
2761 Nonmodal dialogs without parent (i.e. they can fall behind the main
2762 window)
2763
2764 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2765 all dialogs in the dialogs dictionary and the canvas.
2766
2767 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2768 parent, i.e. can fall behind other windows.
2769 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2770 dictionary before removing it.
2771
2772 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2773
2774 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2775 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2776 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2777
2778 2003-05-27 Bernhard Herzog <[email protected]>
2779
2780 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2781 tableview dialog
2782 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2783 Also, don't use the table's titles as the dialog names. The titles
2784 aren't guaranteed to be unique.
2785 (MainWindow.TableOpen): Open a table view dialog after opening the
2786 table
2787
2788 2003-05-27 Bernhard Herzog <[email protected]>
2789
2790 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2791 effect can be achieved by simply closing the window showing the
2792 table.
2793 (MainWindow.TableHide): Removed.
2794 (main_menu): Removed "table_hide"
2795
2796 2003-05-27 Frank Koormann <[email protected]>
2797
2798 Fix legend tree display problems under Win32
2799
2800 * Thuban/UI/legend.py: BMP_SIZE_W = 15
2801 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2802 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2803
2804 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2805
2806 2003-05-27 Jan-Oliver Wagner <[email protected]>
2807
2808 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2809 'after' now allows to insert separators almost anywhere in the menu.
2810
2811 2003-05-27 Frank Koormann <[email protected]>
2812
2813 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2814 "S" of selection box label to hint on hot key (Alt-S). Works under
2815 Win32 but is ignored under GTK.
2816
2817 2003-05-26 Frank Koormann <[email protected]>
2818
2819 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2820 Center Choices.
2821
2822 2003-05-26 Bernhard Herzog <[email protected]>
2823
2824 Remove the Precision methods again. They're too DBF specific to be
2825 part of the table interface and they're only used in table_to_dbf
2826 anyway.
2827
2828 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2829 fixed precision of 12 for doubles.
2830 (TransientTableBase.Precision): Removed
2831 (AutoTransientTable.Width): Delegate to self.table.
2832
2833 * Thuban/Model/table.py (DBFTable.Precision)
2834 (MemoryTable.Precision): Removed.
2835 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2836 (table_to_dbf): Use a fixed precision of 12 for floats unless the
2837 column object specifies something else.
2838
2839 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2840 test for table_to_dbf
2841
2842 2003-05-26 Bernhard Herzog <[email protected]>
2843
2844 * test/test_transientdb.py
2845 (TestTransientTable.run_iceland_political_tests): Fix a comment.
2846
2847 2003-05-26 Bernhard Herzog <[email protected]>
2848
2849 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2850 implementation. Mark parts of the file format strings for
2851 localization.
2852
2853 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2854 file and add the table to the tables managed by the session
2855
2856 * test/test_session.py (TestSessionSimple.test_open_table_file):
2857 New. test case for OpenTableFile
2858
2859 2003-05-26 Jan-Oliver Wagner <[email protected]>
2860
2861 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2862 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2863 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2864 Replace the true/false of wxWindows by True/False of Python 2.2.1.
2865
2866 2003-05-26 Jan-Oliver Wagner <[email protected]>
2867
2868 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2869 already a selection present, update the grid accordingly.
2870
2871 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2872 resizeable and increase its initial size.
2873
2874 2003-05-26 Frank Koormann <[email protected]>
2875
2876 Table export functionality
2877
2878 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2879 Return width (in characters) for a column.
2880 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2881 (table_to_dbf): Write table to dbf file.
2882 (table_to_csv): Write table to csv file.
2883
2884 * Thuban/Model/transientdb.py (TransientTableBase.Width,
2885 TransientTableBase.Precision): Return column width and precision.
2886
2887 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2888 or table_to_csv depending on file selection.
2889
2890 * test/test_dbf_table.py:
2891 Test table_to_dbf (extension of former part of test).
2892
2893 * test/test_csv_table.py:
2894 Test table_to_csv.
2895
2896 2003-05-23 Jan-Oliver Wagner <[email protected]>
2897
2898 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2899 Use QueryTableFrame instead of TableFrame.
2900
2901 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2902 table window with 'Layer Table:' instead of 'Table:'.
2903
2904 2003-05-23 Jan-Oliver Wagner <[email protected]>
2905
2906 Give all tables a title via mix-in TitledObject.LayerShowTable
2907
2908 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2909 only if it exists.
2910
2911 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2912 and call its init-method with a default title. Remove Title() method.
2913
2914 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2915 AutoTransientTable): mix-in TitledObject and call its init-method with
2916 a default title. Remove Title() method.
2917
2918 2003-05-23 Bernhard Herzog <[email protected]>
2919
2920 * Thuban/Model/session.py (Session.AddShapeStore): Define
2921 AddShapeStore analogously to AddTable.
2922
2923 * test/test_session.py (TestSessionSimple.test_add_shapestore):
2924 New. Test for AddShapeStore
2925
2926 2003-05-23 Jan-Oliver Wagner <[email protected]>
2927
2928 Introducing QueryTableFrame and a very coarse ShowTable implementation.
2929
2930 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2931 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2932 The latter implements the selection GUI without dependency on a layer.
2933 LayerTableFrame now is derived from QueryTableFrame and connects
2934 to a layer.
2935
2936 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2937 implementation that still needs work.
2938
2939 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2940
2941 2003-05-22 Frank Koormann <[email protected]>
2942
2943 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2944 Added "outer_join = False" as optional parameter.
2945 (TransientJoinedTable.create): If outer join is true, perform a
2946 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2947 the left table. Records not matching are filled with 0 / None.
2948
2949 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2950 (JoinDialog.OnJoin): Consider outer join check box.
2951
2952 2003-05-22 Bernhard Herzog <[email protected]>
2953
2954 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2955 somewhat safer way. Storing the traceback in a local variable can
2956 lead to memory leaks
2957
2958 2003-05-22 Bernhard Herzog <[email protected]>
2959
2960 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2961 the wxMessageDialog's Destroy() method.
2962
2963 2003-05-22 Frank Koormann <[email protected]>
2964
2965 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2966 TransientTable.Title()
2967
2968 2003-05-22 Frank Koormann <[email protected]>
2969
2970 Join Dialog, initial version.
2971
2972 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2973
2974 * Thuban/UI/join.py (JoinDialog): Functional implementation of
2975 former framework. Renamed Table1/Table2 to LeftTable/RightTable
2976 in all occurences.
2977
2978 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2979 Typo fixed.
2980
2981 2003-05-22 Bernhard Herzog <[email protected]>
2982
2983 Give the tables titles so that the GUI can display more meaningful
2984 names. For now the titles are fixed but depend on e.g. filenames
2985 or the titles of the joined tables.
2986
2987 * Thuban/Model/transientdb.py (TransientTable.Title)
2988 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2989
2990 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2991
2992 * test/test_transientdb.py
2993 (TestTransientTable.test_auto_transient_table_title): New. Test
2994 for the Title method
2995 (TestTransientTable.test_transient_joined_table)
2996 (TestTransientTable.test_transient_table): Add test for the Title
2997 methods
2998
2999 * test/test_memory_table.py (TestMemoryTable.test_title): New.
3000 Test for the Title method
3001
3002 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
3003 the Title method
3004
3005 2003-05-22 Bernhard Herzog <[email protected]>
3006
3007 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3008 Provide a better way to destroy the layers
3009 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
3010 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3011 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
3012 the new way to destroy the layers.
3013 (TestLayer.test_derived_store): New. Test for using a layer with a
3014 DerivedShapeStore
3015
3016 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
3017 filename if the shape store actually has one.
3018
3019 2003-05-22 Bernhard Herzog <[email protected]>
3020
3021 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
3022 for the filename
3023
3024 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
3025 for the FileName method
3026 (TestDBFTableWriting.test_write): Fix spelling of filename
3027
3028 2003-05-22 Thomas Koester <[email protected]>
3029
3030 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
3031 from SciParam that now really is immutable.
3032
3033 2003-05-22 Frank Koormann <[email protected]>
3034
3035 Layer Top/Bottom placement added to legend.
3036
3037 * Thuban/UI/legend.py
3038 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
3039 bound to tool events.
3040 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
3041 New, methods binding the event methods with the map methods.
3042
3043 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
3044 layer at top/bottom of layer stack.
3045
3046 * Resources/Bitmaps/top_layer.xpm: New button icon.
3047
3048 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
3049
3050 2003-05-22 Bernhard Herzog <[email protected]>
3051
3052 * Thuban/Model/session.py (Session.RemoveTable): New method to
3053 remove tables
3054
3055 * test/test_session.py (TestSessionSimple.test_remove_table): New.
3056 Test for RemoveTable
3057
3058 2003-05-22 Thomas Koester <[email protected]>
3059
3060 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
3061 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
3062
3063 2003-05-22 Bernhard Herzog <[email protected]>
3064
3065 Implement a way to discover dependencies between tables and
3066 shapestores.
3067
3068 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
3069 (TransientJoinedTable.Dependencies)
3070 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
3071 interface
3072 (TransientJoinedTable.__init__): Keep tack of the original table
3073 objects in addition to the corresponding transient tables.
3074
3075 * Thuban/Model/table.py (DBFTable.Dependencies)
3076 (MemoryTable.Dependencies): New. Implement the dependencies
3077 interface
3078
3079 * Thuban/Model/data.py (ShapeTable): New. Helper class for
3080 ShapefileStore
3081 (ShapefileStore.__init__): Use ShapeTable instead of
3082 AutoTransientTable
3083 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
3084 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
3085 methods for filename and type
3086 (ShapefileStore.Dependencies): New. Implement the dependencies
3087 interface
3088 (DerivedShapeStore): New class to replace SimpleStore. The main
3089 difference to SimpleStore is that it depends not on a shapefile
3090 but another shapestore which expresses the dependencies a bit
3091 better
3092 (SimpleStore.__init__): Add deprecation warning.
3093
3094 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
3095 Test for the Dependencies method.
3096
3097 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
3098 New. Test for the Dependencies method.
3099
3100 * test/test_transientdb.py
3101 (TestTransientTable.test_auto_transient_table_dependencies): New.
3102 Test for the Dependencies method.
3103 (TestTransientTable.test_transient_joined_table): Add test for the
3104 Dependencies method.
3105
3106 * test/test_session.py (TestSessionSimple.setUp)
3107 (TestSessionSimple.tearDown): New. Implement a better way to
3108 destroy the sessions.
3109 (TestSessionSimple.test_initial_state)
3110 (TestSessionSimple.test_add_table): Bind session to self.session
3111 so that it's destroyed by tearDown
3112 (TestSessionSimple.test_open_shapefile): New. Test for
3113 OpenShapefile and the object it returns
3114
3115 2003-05-22 Bernhard Herzog <[email protected]>
3116
3117 * Thuban/Model/session.py (Session.AddTable): New method to
3118 register tables with the session.
3119 (Session.Tables): Return the tables registered with AddTable too.
3120
3121 * test/test_session.py (TestSessionSimple.test_add_table): New.
3122 Test case for the AddTable method
3123
3124 2003-05-22 Frank Koormann <[email protected]>
3125
3126 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
3127 lower right corner, center labels for selections, initialize controls
3128 in reasonable order for keyboard navigation.
3129
3130 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
3131 (ProjFrame.__DoOnProjAvail): Determine position of current projection
3132 using the wxListBox.FindString() method. Still a problem (#1886)
3133
3134 * Thuban/UI/classifier.py
3135 (Classifier.__init__, SelectPropertiesDialog.__init__)
3136
3137 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
3138 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
3139 different classification types from here to __init__.
3140 (GenUniquePanel.__init__): Set the column width of the first field
3141 in the Field ListCtrl to the full width.
3142
3143 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
3144 Button to 'Export'. Center Buttons in Selection Box, set Focus to
3145 Grid.
3146 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
3147 changes focus to the Selection when pressing "Alt-S".
3148
3149 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
3150 the text if not visible. The italic font sometimes exceeds the
3151 rendering area.
3152
3153 2003-05-21 Jonathan Coles <[email protected]>
3154
3155 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
3156 to OnClose so that Thuban closes correctly.
3157
3158 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
3159 DockFrame.OnClose, not DockFrame._OnClose.
3160
3161 2003-05-21 Jonathan Coles <[email protected]>
3162
3163 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
3164 references to 'inf' and use new Range __init__ to pass floats
3165 directly rather than converting them to strings first.
3166 Fixes RTBug #1876.
3167
3168 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
3169 Use new Range ___init__ to pass floats.
3170
3171 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
3172 filename is a valid image file. Throw IOError otherwise.
3173
3174 * Thuban/Model/range.py: Brought over new Range from SciParam that
3175 is immutable and has an __init__ which can accept floats.
3176
3177 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
3178 into try block. AddLayer doesn't throw any exceptions anymore.
3179 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
3180 try block.
3181
3182 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
3183 the first item in choices. Fixes RTBug #1882.
3184
3185 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
3186 has gone to 0 which is a serious problem. abort.
3187 (MapRenderer.draw_raster_layer): Catch IOError seperately and
3188 print the error from GDAL.
3189
3190 * Thuban/UI/tableview.py (TableGrid.__init__): Call
3191 ToggleEventListeners to turn on listening.
3192 (TableGrid.ToggleEventListeners): New. Turns event listening on
3193 and off so as to prevent excessive messages.
3194 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
3195 to suppress excessive messages when selecting many rows.
3196 Fixes RTBug #1880.
3197
3198 * Thuban/UI/view.py: Added checks against if scale == 0. This
3199 is a serious problem that can occur when an image without
3200 geo data is loading and causes the map projection bounds to
3201 go to infinity. Right now, the solution is to simply try
3202 to recover.
3203
3204 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
3205 to set the MFILEReceiver attributes even if the data is NULL.
3206
3207 * extensions/thuban/gdalwarp.cpp: Improved the error handling
3208 and passed GDAL messages back up to the Python layer. Also
3209 tried to fix some memory leaks that were present in the original
3210 utility but didn't matter because the program aborted.
3211
3212 * test/test_range.py: Copied over tests from SciParam. Removed
3213 tests against importing. Fixes RTBug #1867.
3214
3215 2003-05-21 Bernhard Herzog <[email protected]>
3216
3217 * test/test_load.py: Remove unused imports and restructure the
3218 test code
3219 (LoadSessionTest): Split into one class for each test and turn
3220 LoadSessionTest itself into the base class for all such session
3221 tests.
3222 (ClassificationTest): New base class for load tests that test
3223 classifications
3224 (TestSingleLayer, TestLayerVisibility, TestClassification)
3225 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
3226 for the individual tests
3227
3228 * test/support.py (FileLoadTestCase.filename): New base class for
3229 file loading tests
3230
3231 2003-05-21 Jan-Oliver Wagner <[email protected]>
3232
3233 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
3234 Mercator' to 'UTM Zone 32' as a more convenient example.
3235 Added 'Gauss Krueger Zone 6'.
3236
3237 * Data/iceland_sample_raster.thuban: political polygon now
3238 filled transparent to have the raster image visible at once.
3239
3240 2003-05-21 Frank Koormann <[email protected]>
3241
3242 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
3243 OnClose() to keep in sync with extensions. Internally Thuban
3244 still uses "underscored" names.
3245
3246 2003-05-20 Jonathan Coles <[email protected]>
3247
3248 This puts back Raster layer support. These layers support projections
3249 through the GDAL library. Currently, the CVS version is being used.
3250 There are no Debian packages available although this may change soon.
3251 A GDAL driver was extended to support writing to memory rather to
3252 files.
3253
3254 There is still some work that needs to be done, such as some error
3255 handling when loading invalid images or when there is a problem
3256 projecting the image. This putback simply checks in the majority
3257 of the work.
3258
3259 * setup.py: Add gdalwarp library extension.
3260
3261 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
3262 Defaults to False, but can be overridden by subclasses if they
3263 support classification.
3264 (RasterLayer): New. Defines a new layer that represents an
3265 image.
3266
3267 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
3268 tag handler.
3269 (SessionLoader.start_layer): Encode the filename.
3270 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
3271 New. Supports reading a rasterlayer tag.
3272
3273 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
3274
3275 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
3276 get a string in Latin1. If we get such as string convert it to
3277 unicode first, otherwise leave if alone before encoding.
3278 (SessionSaver.write_layer): Add support for writing both Layers
3279 and RasterLayers.
3280
3281 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3282 The right argument may not be a string, it could also be a Column.
3283
3284 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
3285 Make initial window size 600x400. Fixes RTBug #1872.
3286
3287 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
3288 the dialog is constructed so that we can support layers that
3289 do not have classifications.
3290 (Classifier._OnTry): Only build a classification if the layer
3291 supports one.
3292
3293 * Thuban/UI/legend.py: Change all checks that a layer is an
3294 instance of Layer into checks against BaseLayer.
3295 (LegendTree.__FillTreeLayer): Only add children to a branch if
3296 the layer supports classification.
3297
3298 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
3299 MainWindow.OpenSession): Don't proceed with an action if the
3300 user chooses Cancel when they are asked to save changes.
3301 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
3302 user to select an image file. Create a new RasterLayer and add
3303 it to the map.
3304
3305 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
3306 for rendering RasterLayer layers.
3307 (MapRenderer.draw_raster_layer): Actually method that calls
3308 the GDALWarp python wrapper and constructs an image from the
3309 data returned.
3310
3311 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
3312 Choices symbols to match those used in the table query method.
3313 Replace deprecated method calls on table with new method names.
3314
3315 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
3316 how small the scale can get. This still needs more testing.
3317
3318 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
3319 Provides a driver to output in .bmp format.
3320
3321 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
3322 New. Provides IO routines which write to memory, rather than a file.
3323
3324 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
3325 of the gdalwarp utility provided in GDAL. Added function calls
3326 that can be accessed from python.
3327
3328 * Data/iceland_sample_raster.thuban: New. Sample file that uses
3329 a raster layer.
3330
3331 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
3332 layer image data.
3333
3334 * Doc/thuban.dtd: Added rasterlayer attribute definition.
3335
3336 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
3337 tests associated with the raster layer code.
3338
3339 * test/test_transientdb.py
3340 (TestTransientTable.test_auto_transient_table_query): Added a test
3341 for using a Column object as the "right" parameter to a query.
3342
3343 2003-05-19 Frank Koormann <[email protected]>
3344
3345 * Thuban/version.py (get_changelog_date):
3346 Catch exceptions if ChangeLog does not exist.
3347
3348 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
3349
3350 2003-05-19 Frank Koormann <[email protected]>
3351
3352 Extended version information for Thuban
3353
3354 * Thuban/version.py: New, version information for Thuban: Last
3355 modification date and last ChangeLog entry date.
3356
3357 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
3358 information: Display Thuban, wxPython and Python version.
3359
3360 2003-05-16 Bernhard Herzog <[email protected]>
3361
3362 * Thuban/Model/save.py: Remove some unused imports including the
3363 __future__ import for nested_scopes as Thuban relies on Python 2.2
3364 now.
3365 (XMLWriter.encode): Remove the special case for a None argument.
3366 In the saver encode is always called with a string argument.
3367
3368 2003-05-16 Bernhard Herzog <[email protected]>
3369
3370 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
3371 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
3372 of the bug was that e.g. float("1.2") would fail. Thuban now
3373 requires 2.4.x.
3374
3375 2003-05-16 Frank Koormann <[email protected]>
3376
3377 Printing enhancement and WMF export (under Win32)
3378
3379 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
3380 ScreenRenderer. Renders Map, Legend and Scalebar for export.
3381 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
3382 PrintRender.
3383
3384 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
3385 to fullfil information needed for PrinterRenderer.
3386 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
3387 (MapCanvas.Print): Adapted to new MapPrintout.
3388 (OutputTransform): General calculations to transform from canvas
3389 coordinates to export/printing devices.
3390
3391 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
3392 new method_command to call ExportMap, with platform dependency (only
3393 __WXMSW__)
3394
3395 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
3396 of scalebar drawing area as new parameters.
3397
3398 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
3399
3400 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
3401 Update to extended scalebar.DrawScalebar header.
3402
3403 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
3404
3405 * test/test_scalebar.py: Made test executable as standalone.
3406
3407 2003-05-16 Bernhard Herzog <[email protected]>
3408
3409 * Thuban/Model/table.py (Table): Remove this compatibility alias
3410 for DBFTable.
3411
3412 * test/test_table.py: Import DBFTable as Table because that alias
3413 doesn't exist anymore.
3414
3415 * Thuban/UI/classgen.py: Remove some unused imports
3416
3417 2003-05-14 Jonathan Coles <[email protected]>
3418
3419 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
3420 Fix docstring.
3421 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
3422 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
3423 values of the supplied range to determine the beginning and end
3424 bounds of the generated classes.
3425
3426 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
3427 do not have a leading 0 (.5 is now accepted as well as 0.5).
3428
3429 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
3430 call to ClassGenerator.GenUniformDistribution.
3431
3432 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
3433 layout bug with the 'Projection' label.
3434
3435 * test/support.py (FloatTestCase): New. Needed for the Range tests.
3436
3437 * test/test_range.py: New. Imported from SciParam.
3438
3439 2003-05-12 Jonathan Coles <[email protected]>
3440
3441 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
3442 to table.UniqueValues() with calls that retrieve all the values
3443 from the table. This will need to be replaced by a method on table
3444 which can simply return the list (perhaps more efficiently).
3445
3446 2003-05-12 Jonathan Coles <[email protected]>
3447
3448 The return value of ClassGenerator.CalculateQuantiles has changed.
3449 Refer to the documentation for details.
3450
3451 * test/test_classgen.py: Modified Quantile tests to use the
3452 new return values.
3453
3454 * Thuban/Model/classgen.py
3455 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
3456 use new return values from CalculateQuantiles to produce the correct
3457 range bounds in the Classification.
3458 (ClassGenerator.CalculateQuantiles): Add more comments describing
3459 the return values and parameters. Make minor adjustments to improve
3460 the legibility of the code. Fix problem with adjusted not being set
3461 in most cases.
3462
3463 2003-05-12 Frank Koormann <[email protected]>
3464
3465 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
3466 and latin1. Fixes #1851 finally.
3467
3468 2003-05-09 Jonathan Coles <[email protected]>
3469
3470 * test/test_classgen.py: New. Tests the Quantile algorithm.
3471
3472 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
3473 Clean up debugging statement, add comments, fix a small bug in the
3474 returned adjusted percentiles.
3475
3476 2003-05-09 Jonathan Coles <[email protected]>
3477
3478 Introduces Range class from SciParam into the ClassGroupRange class,
3479 and such ranges can now be saved and loaded from disk.
3480
3481 Quantiles are now available in the Classification Generator.
3482
3483 Initial support for building Queries on a table. Doesn't do anything
3484 but run some tests.
3485
3486 * Thuban/Model/classification.py: Explicit imports.
3487 (ClassGroupRange): Use the Range class to store the underlying
3488 range information. The interface remains the same, except for
3489 GetRange(), and you can also supply a Range object as the min
3490 parameter to SetRange or __init__.
3491
3492 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
3493 string appropriately for use in Thuban. Fixes RTbug #1851.
3494 (SessionLoader.end_projection): Handle the context of the
3495 projection tag a bit better by looking at what objects are not
3496 None. There was an assumption that a projection tag for a map
3497 could occur before any layers.
3498 (SessionLoader.start_clrange): Provide backward compatibility for
3499 reading min/max values as well as the new range parameter.
3500
3501 * Thuban/Model/map.py: Explicit imports.
3502
3503 * Thuban/Model/resource.py: Import _.
3504 (ProjFileSaver.write): write header using projfile.dtd.
3505
3506 * Thuban/Model/save.py: Explicit imports.
3507 (XMLWriter.encode): New. Encode the given string from a format
3508 used by Thuban into UTF-8. Fixes RTbug #1851.
3509
3510 * Thuban/UI/classgen.py: Explicit imports.
3511 (ClassGenDialog.__init__): Clean up the code and add support
3512 for Quantiles.
3513 (ClassGenDialog.OnOK): Add support for Quantiles.
3514 (GenQuantilesPanel): New. Input panel for Quantiles.
3515 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
3516 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
3517
3518 * Thuban/Model/classgen.py: New. Contains all the classes named above.
3519
3520 * Thuban/UI/classifier.py: Explicit imports.
3521 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
3522 ClassTable.SetValueAsCustom): Reworked to use new Range class.
3523
3524 * Thuban/UI/legend.py: Explicit imports.
3525
3526 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
3527 a Table menu and associated method calls.
3528 (MainWindow.choose_color): Removed. No longer needed.
3529
3530 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
3531 should be disabled if no projection is selected in the available
3532 list.
3533
3534 * Thuban/UI/renderer.py: Explicit imports.
3535
3536 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
3537 with correctly selecting the rows and issuing the right events.
3538 Be sure to call Skip() to allow the grid to do some of its own
3539 handling which allows the rows to actually be selected.
3540 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
3541 selecting multiple shapes.
3542 (LayerTableFrame): Support for building Queries.
3543 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
3544
3545 * Thuban/UI/tree.py: Explicit imports.
3546
3547 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
3548 table view can call it.
3549
3550 * test/test_classification.py: Explicit imports.
3551 (TestClassification.test_ClassGroupRange): Fix test for new
3552 Range class.
3553
3554 * Doc/thuban.dtd: Add range parameter for clrange.
3555
3556 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
3557 object in ClassGroupRange, and also uesd for inputting ranges in
3558 the classifer table and elsewhere.
3559
3560 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
3561 yet.
3562
3563 2003-05-09 Frank Koormann <[email protected]>
3564
3565 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
3566
3567 2003-05-08 Frank Koormann <[email protected]>
3568
3569 Coding style updates
3570
3571 * test/test_scalebar.py: Replaced tab indentation by spaces.
3572
3573 * Thuban/UI/scalebar.py: Explicit imports.
3574
3575 2003-05-08 Frank Koormann <[email protected]>
3576
3577 * Thuban/UI/scalebar.py
3578 (ScaleBar.DrawScalebar): Format string bug fixed.
3579
3580 2003-05-08 Frank Koormann <[email protected]>
3581
3582 Reorganization of scalebar component (no wx in Thuban/Model)
3583
3584 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
3585 (deriveInterval):
3586 Calculate scalebar interval and unit which fits in width for scale.
3587 (roundInterval): Round float.
3588
3589 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
3590
3591 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
3592
3593 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
3594
3595 2003-05-08 Frank Koormann <[email protected]>
3596
3597 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
3598 Initialize ScaleBar with canvas.map
3599
3600 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
3601 round intervals to display smarter lengths
3602 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
3603 layer. If the maps has no projection applied grey the scalebar.
3604
3605 2003-05-07 Frank Koormann <[email protected]>
3606
3607 Basic Scalebar features added.
3608
3609 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
3610
3611 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
3612 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
3613 and the renderer.
3614
3615 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
3616
3617 * Thuban/UI/messages.py: SCALE_CHANGED added.
3618
3619 2003-05-07 Bernhard Herzog <[email protected]>
3620
3621 * Thuban/Model/session.py (Session.__init__): New instance
3622 variable shapestores to hold a list of all open shapestore objects
3623 (Session.ShapeStores): New. Accessor method for the shapestores
3624 list.
3625 (Session._add_shapestore, Session._clean_weak_store_refs): New.
3626 Internal methods to maintain the shapestores list.
3627 (Session.Tables): New. Return all tables open in the session.
3628 (Session.OpenShapefile): Insert the new ShapeStore into the
3629 shapestores list.
3630
3631 * test/test_session.py (TestSessionSimple.test_initial_state): Add
3632 tests for ShapeStores and Tables
3633 (TestSessionWithContent.test_shape_stores)
3634 (TestSessionWithContent.test_tables): New. Test cases for
3635 ShapeStores and Tables
3636
3637 2003-05-07 Bernhard Herzog <[email protected]>
3638
3639 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3640 Add comments about the optimizations used.
3641 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
3642 Implement the ReadValue table interface method.
3643
3644 * test/test_transientdb.py
3645 (TestTransientTable.run_iceland_political_tests)
3646 (TestTransientTable.test_transient_joined_table): Add tests for
3647 ReadValue
3648
3649 2003-05-07 Frank Koormann <[email protected]>
3650
3651 * Resources/Bitmaps/fulllayerextent.xpm,
3652 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
3653 new icons.
3654
3655 2003-05-06 Bernhard Herzog <[email protected]>
3656
3657 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3658 New. Simply delegate to the transient table's version.
3659
3660 * test/test_transientdb.py
3661 (TestTransientTable.test_auto_transient_table_query): New. Test
3662 case for AutoTransientTable's SimpleQuery
3663
3664 2003-05-06 Bernhard Herzog <[email protected]>
3665
3666 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
3667 Implement a simple query method for the query dialog
3668 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
3669 the row index or shapeid.
3670 (TransientTable.create): Insert the right value of the row index
3671 (TransientJoinedTable.create): Copy the row index of the left
3672 table to the joined result table
3673
3674 * test/test_transientdb.py
3675 (TestTransientTable.test_transient_table_read_twice): Fix
3676 doc-string
3677 (TestTransientTable.test_transient_table_query): New. Test for the
3678 SimpleQuery method
3679
3680 2003-05-06 Bernhard Herzog <[email protected]>
3681
3682 Convert all table users to use the new table interface. This only
3683 covers Thuban itself, not GREAT-ER or other applications built on
3684 Thuban yet, so the compatibility interface stays in place for the
3685 time being but it now issues DeprecationWarnings.
3686
3687 Finally, the new Table interface has a new method, HasColumn.
3688
3689 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
3690 issue deprecation warnings when they're. The warnings refer to the
3691 caller of the method.
3692 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
3693 for the deprecation warnings
3694
3695 * test/test_table.py: Ignore the deprecation warnings for the old
3696 table in the tests in this module. The purpose of the tests is to
3697 test the old interface, after all.
3698
3699 * test/test_transientdb.py
3700 (TestTransientTable.run_iceland_political_tests): Use the
3701 constants for the types. Add a test for HasColumn
3702 (TestTransientTable.test_transient_joined_table): Adapt to new
3703 table interface. Add a test for HasColumn
3704 (TestTransientTable.test_transient_table_read_twice): Adapt to new
3705 table interface
3706
3707 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
3708 Adapt to new table interface
3709
3710 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
3711 new table interface
3712
3713 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
3714 (RecordTable.SetTable): Adapt to new table interface
3715
3716 * Thuban/UI/classifier.py (Classifier.__init__)
3717 (Classifier.__init__): Adapt to new table interface
3718
3719 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3720 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
3721 to new table interface
3722
3723 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
3724 (AutoTransientTable.HasColumn): Implement the new table interface
3725 method
3726 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
3727 (AutoTransientTable.UniqueValues): Adapt to new table interface
3728
3729 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
3730 Adapt to new table interface
3731
3732 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
3733 simplify opening shapefiles a bit easier.
3734 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3735 (TestLayer.test_point_layer): Use the new helper method
3736 (TestLayer.test_get_field_type): New. Test for the GetFieldType
3737 method
3738
3739 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3740 the new table method
3741
3742 * test/test_memory_table.py (TestMemoryTable.test_has_column):
3743 Test for the new table method HasColumn
3744
3745 2003-05-06 Jonathan Coles <[email protected]>
3746
3747 Addresses the "Selection Extent" wish of RTbug #1787.
3748
3749 * Resources/Bitmaps/fulllayerextent.xpm,
3750 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3751 extent. These are just place holders for the real bitmaps.
3752
3753 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3754 calculate the bounding box once (the first time compute_bbox() is
3755 called).
3756 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3757 the bounding box for the shapes in lat/long coordinates.
3758
3759 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3760 option.
3761 (MainWindow.has_selected_shapes): New. Returns true if there are
3762 any selected shapes.
3763 (MainWindow.FullSelectionExtent): New. Calls
3764 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3765 (_has_selected_shapes): New. Returns true if there are any
3766 selected shapes.
3767
3768 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3769 true if there are any selected shapes.
3770
3771 * Thuban/UI/view.py (MapCanvas): Added delegated method
3772 HasSelectedShapes.
3773 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3774 shapes on the canvas using the map projection (if any).
3775
3776 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3777 for Layer.ShapesBoundingBox().
3778
3779 2003-05-06 Bernhard Herzog <[email protected]>
3780
3781 * Resources/Projections/defaults.proj: Fix spelling of Mercator
3782
3783 2003-05-05 Jonathan Coles <[email protected]>
3784
3785 Addresses the "Full Layer Extent" wish of RTbug #1787.
3786
3787 * Resources/Projections/defaults.proj: Added UK National Grid.
3788
3789 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3790 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3791 when the user selects the menu option.
3792
3793 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3794 scales the given layer on the canvas using the map projection.
3795
3796 2003-05-05 Bernhard Herzog <[email protected]>
3797
3798 Convert the table implementations to a new table interface. All
3799 tables use a common mixin class to provide backwards compatibility
3800 until all table users have been updated.
3801
3802 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3803 provide backwards compatibility for table classes implementing the
3804 new interface
3805 (DBFTable, MemoryTable): Implement the new table interface. Use
3806 OldTableInterfaceMixin as base for compatibility
3807 (DBFColumn, MemoryColumn): New. Column description for DBFTable
3808 and MemoryTable resp.
3809
3810 * test/test_dbf_table.py: New. Test cases for the DBFTable with
3811 the new table interface.
3812
3813 * test/test_memory_table.py: New. Test cases for the MemoryTable
3814 with the new table interface.
3815
3816 * test/test_table.py: Document the all tests in this file as only
3817 for backwards compatibility. The equivalent tests for the new
3818 interface are in test_memory_table.py and test_dbf_table.py
3819 (MemoryTableTest.test_read): field_info should be returning tuples
3820 with four items
3821 (MemoryTableTest.test_write): Make doc-string a more precise.
3822
3823 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3824 table interface. Derive from from OldTableInterfaceMixin for
3825 compatibility.
3826 (TransientTableBase.create): New intance variable column_map to
3827 map from names and indices to column objects
3828 (TransientTable.create): Use the new table interface of the input
3829 table
3830 (AutoTransientTable): Convert to new table interface. Derive from
3831 from OldTableInterfaceMixin for compatibility.
3832 (AutoTransientTable.write_record): Removed. It's not implemented
3833 yet and we still have to decide how to handle writing with the new
3834 table and data framework.
3835
3836 * test/test_transientdb.py
3837 (TestTransientTable.run_iceland_political_tests)
3838 (TestTransientTable.test_transient_joined_table): Use the new
3839 table interface
3840
3841 2003-05-05 Jonathan Coles <[email protected]>
3842
3843 This is namely a collection of UI updates to improve user interactivity.
3844 Tabbing between controls now exists and you can use ESC to close dialog
3845 boxes; ENTER will active the default button.
3846
3847 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3848 order that the controls are created so that tabbing works correctly.
3849 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3850 wxDialog can handle the default button correctly.
3851 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3852 same reasons as for OnOK.
3853 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3854 when we ask the table for the maximum/minimum values of a field
3855 which could take a very long time.
3856
3857 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3858 order that the controls are created so that tabbing works correctly.
3859 (SelectPropertiesDialog.__init__): Rearrange the order that the
3860 controls are created so that tabbing works correctly.
3861
3862 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3863 to derive from a wxDialog but behave like the original implementation
3864 which was derived from a wxFrame. wxDialog provides useful key
3865 handling functionality like ESC calling OnCancel and ENTER calling
3866 OnOK which is lost with wxFrame.
3867
3868 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3869 new dialogs.
3870
3871 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3872 order that the controls are created so that tabbing works correctly.
3873 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3874 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3875 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3876 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3877 can provide the "UK National Grid" as a default projection.
3878 (UTMPanel.__init__): Rearrange the order that the controls are
3879 created so that tabbing works correctly.
3880
3881 2003-05-05 Bernhard Herzog <[email protected]>
3882
3883 * extensions/thuban/wxproj.cpp: Fix some of the comments.
3884 (project_point): If a map projection but no layer projection is
3885 given, convert degrees to radians before applying the map
3886 projection.
3887
3888 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3889 (TableGrid.allow_messages): New methods to make it possible to
3890 inhibit message sending.
3891 (TableGrid.issue): Only send the message if not inhibited.
3892 (LayerTableGrid.select_shape): Use the new methods to make sure
3893 that no ROW_SELECTED message is sent while we're updating the
3894 selected rows to match the selected shapes.
3895
3896 2003-05-02 Jan-Oliver Wagner <[email protected]>
3897
3898 Implementation of MemoryTable.
3899
3900 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3901 implementation that operates on a list of tuples. All of the data
3902 are kept in the memory.
3903
3904 * test/test_table.py (MemoryTableTest): New.
3905
3906 * test/test_transientdb.py (SimpleTable): Removed.
3907 (TestTransientTable.test_transient_joined_table,
3908 (TestTransientTable.test_transient_table_read_twice): Replaced
3909 SimpleTable by MemoryTable.
3910
3911 2003-04-30 Jonathan Coles <[email protected]>
3912
3913 * Data/iceland_sample.thuban: Now contains correct projections
3914 for each of the layers.
3915
3916 * Resources/Projections/defaults.proj: Geographic projection
3917 contains unit conversion parameter.
3918
3919 2003-04-30 Jonathan Coles <[email protected]>
3920
3921 The most important part of this putback is the projection changes.
3922 It should now be possible to specify the projection that a layer
3923 is in and then specify a different projection for the map. The
3924 projection dialog has an extra parameter for a geographic projection
3925 which lets the user select if the input is in degrees or radians.
3926
3927 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3928 to say that the parameter is a tuple of unprojected
3929 points (which is what the callers to this method were assuming).
3930 Also, since the points are unprojected we need to projected them.
3931
3932 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3933 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3934 groups are selected, move the layer up/down. Fixes RTbug #1833.
3935
3936 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3937
3938 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3939 parameter in call to SetClientData.
3940 (GeoPanel): Add support for selecting the units that the
3941 source data is in (Radians or Degrees).
3942
3943 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3944 the rendering loop by reducing the number of if's, removing the
3945 unnecessary try/except block, and checking if the old group
3946 is the same as the new one (which happens a lot if there is
3947 no classification, or lots of shapes are in the same group).
3948
3949 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3950 around the redraw routine to try to catch problems that the user
3951 may create by selecting invalid projections for the data set and
3952 map. Clears the display if there are any problems and prints the
3953 error.
3954 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3955 rectangle.
3956
3957 * extensions/thuban/wxproj.cpp (project_point): First invert the
3958 supplied point (which should be in projected coordinates) using
3959 the layer's projection and then project the point using the
3960 map's projection.
3961 (project_points): Use project_point() to project each point.
3962
3963 2003-04-30 Jan-Oliver Wagner <[email protected]>
3964
3965 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3966 don't set the Classification to None if the classfication field
3967 is None (ie only a DEFAULT).
3968
3969 2003-04-30 Bernhard Herzog <[email protected]>
3970
3971 * Thuban/UI/view.py: Fix some typos.
3972
3973 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3974 not pop up the dialog if the selection becomes empty (this could
3975 happen if e.g. a new selection is opened while the identify tool
3976 is active and dialog had been closed)
3977
3978 2003-04-30 Bernhard Herzog <[email protected]>
3979
3980 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3981 instance variable read_record_last_result
3982 (TransientTableBase.read_record): Make sure reading the same
3983 record twice works. The implementation uses the new instance
3984 variable read_record_last_result
3985
3986 * test/test_transientdb.py
3987 (TestTransientTable.test_transient_table_read_twice): New test
3988 case for the above bug-fix.
3989
3990 2003-04-29 Jonathan Coles <[email protected]>
3991
3992 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3993
3994 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3995
3996 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3997 (ClassTable.SetValueAsCustom): Rename keyword argument in
3998 ClassGroup* constructors to match argument name.
3999
4000 2003-04-29 Bernhard Herzog <[email protected]>
4001
4002 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
4003 transient DB if it exists to make sure it doesn't leave a journal
4004 file in the temp directory.
4005
4006 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
4007 self.conn to None after closing the connection to make sure it's
4008 not closed twice
4009
4010 2003-04-29 Jonathan Coles <[email protected]>
4011
4012 Add a visible parameter in the layer XML tag. The default value is
4013 "true". If anything other than "false" is specified we also assume
4014 "true". Addresses RTbug #1025.
4015
4016 * Doc/thuban.dtd: Add visible parameter to a layer.
4017
4018 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
4019 of visible from 1 to True.
4020 (Layer.__init__): Change default value of visible from 1 to True.
4021
4022 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
4023 parameter.
4024
4025 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
4026 parameter.
4027
4028 * test/test_load.py: Add new test data contents_test_visible.
4029 (LoadSessionTest.setUp): save test data.
4030 (LoadSessionTest.testLayerVisibility): Test if the visible flag
4031 is loaded correctly.
4032
4033 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
4034 for saving an invisible layer.
4035
4036 2003-04-29 Jonathan Coles <[email protected]>
4037
4038 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
4039 legend dialog box and tell it to change its map to the one
4040 supplied to SetMap(). Fixes RTbug #1770.
4041
4042 2003-04-29 Bernhard Herzog <[email protected]>
4043
4044 Next step of table implementation. Introduce a transient database
4045 using SQLite that some of the data is copied to on demand. This
4046 allows us to do joins and other operations that require an index
4047 for good performance with reasonable efficiency. Thuban now needs
4048 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
4049 haven't tested that.
4050
4051 * Thuban/Model/transientdb.py: New. Transient database
4052 implementation.
4053
4054 * test/test_transientdb.py: New. Tests for the transient DB
4055 classes.
4056
4057 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
4058 classes to help automatically remove temporary files and
4059 directories.
4060 (Session.__init__): New instance variables temp_dir for the
4061 temporary directory and transient_db for the SQLite database
4062 (Session.temp_directory): New. Create a temporary directory if not
4063 yet done and return its name. Use AutoRemoveDir to have it
4064 automatically deleted
4065 (Session.TransientDB): Instantiate the transient database if not
4066 done yet and return it.
4067
4068 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
4069 AutoTransientTable so that data is copied to the transient DB on
4070 demand.
4071 (SimpleStore): New class that simply combines a table and a
4072 shapefile
4073
4074 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
4075 DBFTable and update its doc-string to reflect the fact that this
4076 is only the table interface to a DBF file. Table is now an alias
4077 for DBFTable for temporary backwards compatibility.
4078
4079 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
4080 the last reference to the session goes away so that the temporary
4081 files are removed properly.
4082
4083 * test/test_load.py (LoadSessionTest.tearDown): Remove the
4084 reference to the session to make sure the temporary files are
4085 removed.
4086
4087 2003-04-29 Bernhard Herzog <[email protected]>
4088
4089 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
4090 the __parser instance variable into a normal local variable in
4091 read. It's only used there and read will never be called more than
4092 once. Plus it introduces a reference cycle that keeps can keep the
4093 session object alive for a long time.
4094
4095 2003-04-29 Jonathan Coles <[email protected]>
4096
4097 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
4098 Projection an immutable item. Fixes RTbug #1825.
4099 (Projection.__init__): Initialize instance variables here.
4100 (ProjFile.Replace): New. Replace the given projection object with
4101 the new projection object. This solves the problem of needing the
4102 mutator Projection.SetProjection() in the ProjFrame class and
4103 allows a projection to change parameters without changing its
4104 location in the file.
4105
4106 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
4107 be of type wxSAVE and should verify overwriting a file.
4108
4109 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
4110 ProjFile.Replace() method instead of the mutator
4111 Projection.SetProjection(). Also requires that we reassign the
4112 client data to the new projection.
4113
4114 * test/test_proj.py (TestProjection.test): Test GetName() and
4115 GetAllParameters()
4116 (TestProjFile.test): Remove tests for Set*() methods. Add tests
4117 for Replace().
4118
4119 2003-04-25 Jonathan Coles <[email protected]>
4120
4121 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
4122 to save the name of the projection.
4123
4124 * test/test_save.py (SaveSessionTest.testLayerProjection): New
4125 test to verify layer projections are saved correctly.
4126
4127 2003-04-25 Jonathan Coles <[email protected]>
4128
4129 * Thuban/Model/proj.py (Projection.SetName): Set the name
4130 to "Unknown" if name is None.
4131 (Projection.SetAllParameters): New. Set the projection's
4132 parameter list to the one supplied.
4133 (Projection.SetProjection): New. Set the projection's
4134 properties to those of the supplied Projection.
4135
4136 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
4137 the dialog title to include the map's title.
4138 (MainWindow.LayerProjection): Set the dialog title to include
4139 the layer's title.
4140
4141 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
4142 error dialogs into a single method call.
4143 (ProjFrame.__VerifyButtons): Add more states to check.
4144 (ProjFrame.__GetProjection): Return the current state of an
4145 edited projection or None.
4146 (ProjFrame.__FillAvailList): Remove checks for states that
4147 shouldn't exist.
4148 (ProjFrame._OnNew): Clear all selected items and supply
4149 a projection panel if necessary.
4150
4151 * test/test_proj.py (TestProjFile.test): Add tests for
4152 ProjFile.SetAllParameters, ProjFile.SetProjection,
4153 ProjFile.SetName.
4154
4155 2003-04-25 Jonathan Coles <[email protected]>
4156
4157 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
4158 takes an optional argument to select the current projection.
4159 This does not guarantee that the item is visible due to
4160 limited wxWindows functionality. Fixes RTBug #1821.
4161
4162 2003-04-25 Jonathan Coles <[email protected]>
4163
4164 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
4165 the projection name and use it when constructing the Projection
4166 object.
4167
4168 * Thuban/Model/proj.py (Projection.__init__): Change the default
4169 value for 'name' to None and then test if name is equal to None
4170 in the body of the constructor. This way the caller doesn't have to
4171 know what the default value should be. Namely, useful in load.py
4172 where we have to pick a default value if the 'name' parameter
4173 doesn't exist in the XML file.
4174
4175 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
4176 Tests a file where a layer has a projection.
4177
4178 2003-04-25 Jonathan Coles <[email protected]>
4179
4180 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
4181 tree for projection information.
4182
4183 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
4184 XMLReader.GetFileName.
4185 (SessionLoader): Added support for loading projection tags that
4186 appear inside a layer.
4187
4188 * Thuban/Model/proj.py (ProjFile): Document the class. Move
4189 back to using a list because the order of the projections in
4190 the file is important to maintain. Fixes RTbug #1817.
4191
4192 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
4193 to ProjFile.GetFilename.
4194
4195 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
4196 information.
4197
4198 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
4199 ProjFrame._OnSaveAs. Removed old dead code from previous
4200 implementation.
4201 (ProjFrame._OnExport): Add support for exporting more than one
4202 projection to a single file.
4203 (ProjFrame.__FillAvailList): use string formatting (% operator)
4204 to build strings that are (partly) translated. Fixes RTbug #1818.
4205
4206 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
4207 class.
4208
4209 2003-04-24 Bernhard Herzog <[email protected]>
4210
4211 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
4212
4213 * po/fr.po: New. French translation by Daniel Calvelo Aros
4214
4215 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
4216 empty strings.
4217
4218 2003-04-24 Jonathan Coles <[email protected]>
4219
4220 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
4221 implement the interface that the ProjFrame dialog expects.
4222
4223 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
4224 name of the projection to be changed.
4225 (ProjFile): Use a dictionary instead of a list so that removing
4226 projections is easier and we are sure about uniqueness.
4227 (ProjFile.Remove): Remove the given projection object.
4228
4229 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
4230 Return a list with only one projection file instead of searching for
4231 any projection file. This simplifies many things if the user can
4232 only have one system file and one user file.
4233
4234 * Thuban/UI/classgen.py: Change all references to
4235 genCombo to genChoice.
4236
4237 * Thuban/UI/mainwindow.py: Add a Projection option under the
4238 layer menu.
4239 (MainWindow.LayerProjection): New. Open up a projection window
4240 for a layer.
4241
4242 * Thuban/UI/projdialog.py: Large changes to how the dialog is
4243 laid out. Use three panels instead of one. One for the list of
4244 projections, one for the edit controls, and one for the buttons.
4245 Fixed resizing problems so that the dialog resizes correctly
4246 when the projection panel changes. Added import/export, save, and
4247 new buttons/functionality.
4248
4249 2003-04-24 Bernhard Herzog <[email protected]>
4250
4251 First step towards table management. Introduce a simple data
4252 abstraction so that we replace the data a layer uses more easily
4253 in the next step.
4254
4255 * Thuban/Model/data.py: New file with a simple data abstraction
4256 that bundles shapefile and dbffile into one object.
4257
4258 * Thuban/Model/session.py (Session.OpenShapefile): New method to
4259 open shapefiles and return a shape store object
4260
4261 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
4262 object instead of a shapefile filename. This introduces a new
4263 instance variable store holding the datastore. For intermediate
4264 backwards compatibility keep the old instance variables.
4265 (open_shapefile): Removed. No longer needed with the shape store.
4266 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
4267 get the shape store used by a layer.
4268 (Layer.Destroy): No need to explicitly destroy the shapefile or
4269 table anymore.
4270
4271 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
4272 (MainWindow.AddLayer): Use the session's OpenShapefile method to
4273 open shapefiles
4274
4275 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
4276 session's OpenShapefile method to open shapefiles
4277
4278 * test/test_classification.py
4279 (TestClassification.test_classification): Use the session's
4280 OpenShapefile method to open shapefiles and build the filename in
4281 a more platform independed way
4282
4283 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
4284 Implement to have a session to use in the tests
4285 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4286 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
4287 session's OpenShapefile method to open shapefiles
4288 (TestLayerLegend.setUp): Instantiate a session so that we can use
4289 it to open shapefiles.
4290 (TestLayerLegend.tearDown): Make sure that all references to
4291 layers and session are removed otherwise we may get a resource
4292 leak
4293
4294 * test/test_map.py (TestMapAddLayer.test_add_layer)
4295 (TestMapWithContents.setUp): Instantiate a session so that we can
4296 use it to open shapefiles.
4297 (TestMapWithContents.tearDown): Make sure that all references to
4298 layers, maps and sessions are removed otherwise we may get a
4299 resource leak
4300 ("__main__"): use support.run_tests() so that more info about
4301 uncollected garbage is printed
4302
4303 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
4304 session's OpenShapefile method to open shapefiles
4305 ("__main__"): use support.run_tests() so that more info about
4306 uncollected garbage is printed
4307
4308 * test/test_selection.py (TestSelection.tearDown): Make sure that
4309 all references to the session and the selection are removed
4310 otherwise we may get a resource leak
4311 (TestSelection.get_layer): Instantiate a session so that we can
4312 use it to open shapefiles.
4313 ("__main__"): use support.run_tests() so that more info about
4314 uncollected garbage is printed
4315
4316 * test/test_session.py (TestSessionBase.tearDown)
4317 (TestSessionWithContent.tearDown): Make sure that all references
4318 to the session and layers are removed otherwise we may get a
4319 resource leak
4320 (TestSessionWithContent.setUp): Use the session's OpenShapefile
4321 method to open shapefiles
4322
4323 2003-04-24 Jonathan Coles <[email protected]>
4324
4325 * Thuban/Model/load.py (XMLReader.read): Should have been checking
4326 if the file_or_filename object had the 'read' attribute.
4327
4328 2003-04-23 Jonathan Coles <[email protected]>
4329
4330 * Thuban/Model/resource.py: Fixes RTbug #1813.
4331 (ReadProjFile): Add documentation about which exceptions are raised.
4332 Always pass the exceptions up to the caller.
4333 (GetProjFiles): If the directory can't be read return an empty list.
4334 If any of the proj files can't be read skip that file and go
4335 on to the next one.
4336
4337 * test/test_proj.py: Added test cases to handle nonexistent files,
4338 unreadable files, and files that don't parse correctly.
4339
4340 2003-04-23 Jonathan Coles <[email protected]>
4341
4342 Projection dialog. Allows the user to select from a list
4343 of projection templates and optionally edit them and save new ones.
4344
4345 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
4346 (ProjPanel): Base class for projection specific panels.
4347 (TMPanel): Projection panel for Transverse Mercartor.
4348 (UTMPanel): Projection panel for Universal Transverse Mercartor.
4349 (LCCPanel): Projection panel for Lambert Conic Conformal.
4350 (GeoPanel): Projetion panel for Geographic Projection.
4351
4352 2003-04-23 Jonathan Coles <[email protected]>
4353
4354 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
4355 promote symmetry. There now exists XMLReader and XMLWriter.
4356 (XMLReader.read): New. Call to read the given file descriptor or
4357 filename.
4358 (XMLReader.close): New. Make sure the file is closed.
4359 (XMLReader.GetFileName): New. Return just the file name that is being
4360 read from.
4361 (XMLReader.GetDirectory): New. Return just the directory of the file
4362 that is being read.
4363 (XMLReader.AddDispatchers): New. Take a dictionary which contains
4364 the names of functions to call as the XML tree is parsed.
4365 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
4366 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
4367 (SessionLoader): Removed class variables start_dispatcher and
4368 end_dispatcher since this functionality is now part of a class
4369 instance. Fixes RTbug #1808.
4370 (SessionLoader.__init__): Add dispatcher functions.
4371 (load_xmlfile): Code was moved into the XMLReader.read().
4372 (load_session): Use modified SessionLoader.
4373
4374 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
4375 map's projection.
4376
4377 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
4378 GetAllParameters.
4379 (Projection.GetParameter): Returns the value for the given parameter.
4380
4381 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
4382 (GetProjFiles): Renamed from GetProjections. Now returns a list
4383 of ProjFile objects.
4384 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
4385 a list of ProjFile objects whose files are not user defined.
4386 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
4387 list of ProjFile objects whose files are user defined.
4388 (ProjFileReader): Extend new XMLReader.
4389
4390 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
4391 promote symmetry.
4392
4393 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
4394 control instead of a wxComboBox. wxChoice controls do not generate
4395 events as the uses highlights possible choices which fixes problems
4396 with resizing the dialog when the use selects an option.
4397
4398 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
4399 control instead of a wxComboBox.
4400
4401 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
4402 dialog.
4403
4404 * test/test_proj.py (TestProjection.test): New tests for GetParameter
4405 method.
4406
4407 2003-04-22 Bernhard Herzog <[email protected]>
4408
4409 * Thuban/UI/mainwindow.py: Remove some unused imports and global
4410 constants
4411
4412 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4413 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
4414
4415 2003-04-17 Bernhard Herzog <[email protected]>
4416
4417 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
4418 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
4419 anymore.
4420 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
4421 (Layer.ShapeType, Layer.Shape): No need to call
4422 self.open_shapefile since it's always called in __init__
4423
4424 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
4425 In wxPython 2.4 there's no need to extend MainLoop anymore since
4426 wxPython itself makes sure OnExit is called.
4427
4428 2003-04-16 Jonathan Coles <[email protected]>
4429
4430 Initial putback of projection management code. Includes new
4431 classes to read and write projection files. The current load
4432 and save classes were abstracted a bit so they could be reused.
4433 The Projection class was extended to provide new methods and
4434 have a name.
4435
4436 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
4437 general XML reading methods that were part of ProcessSession.
4438
4439 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
4440 name.
4441 (ProjFile): New. Represents a file that contains projection
4442 information.
4443
4444 * Thuban/Model/resource.py: New. Contains general utilities
4445 for read and writing projection files.
4446
4447 * Thuban/Model/save.py (XMLSaver): New. Contains all the
4448 general XML writing methods that were part of SessionSaver.
4449 (SessionSaver): Renamed from Saver.
4450
4451 * test/test_proj.py: New test cases for the projection
4452 file read and write functions.
4453
4454 2003-04-16 Jonathan Coles <[email protected]>
4455
4456 * Thuban/Model/classification.py: Use repr() around values
4457 in the ClassGroup*.__repr__() methods so it is clearer when
4458 a value is a string and when it is a number.
4459
4460 * test/test_load.py: Rework the classification test to test
4461 that we can load old files.
4462 (testLabels): Test a file where the groups have labels.
4463
4464 2003-04-16 Bernhard Herzog <[email protected]>
4465
4466 Safer implementation of the performance enhancements of the
4467 low-level renderer:
4468
4469 * extensions/thuban/wxproj.cpp (extract_projection)
4470 (extract_pointer): Rename extract_projection to extract_pointer
4471 and redefine its purpose to return the pointer stored in a CObject
4472 returned by the object's cobject method. Update all callers.
4473 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
4474 handling of these low-level parameters so that each s_draw_info
4475 instance is handled as a CObject at python level that also
4476 contains real references to the actual python objects which
4477 contain the values in the struct. Add free_draw_info as the
4478 destructor.
4479 (draw_polygon_shape): Add the py_draw_info parameter which must a
4480 cobject containing an s_draw_info pointer.
4481
4482 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
4483 method to instantiat the low-level render parameter
4484 (MapRenderer.draw_shape_layer): Use the new method. Remove some
4485 commented out code.
4486 (MapRenderer.draw_polygon_shape): Make the first parameter not the
4487 layer but the low-level render parameter
4488 (ScreenRenderer.draw_shape_layer): Use the low-level render
4489 parameter.
4490
4491 2003-04-15 Jonathan Coles <[email protected]>
4492
4493 * Thuban/Model/classification.py: Implemented __repr__ for
4494 the ClassGroup* classes to make debugging a bit easier.
4495 (ClassGroup.SetLabel): Check that the string is an instance
4496 of StringTypes not StringType. Accounts for Unicode strings.
4497
4498 * Thuban/Model/color.py: Implemented __repr__ to make
4499 debugging a bit easier.
4500
4501 * Thuban/Model/save.py (Saver.write_classification): Need to
4502 save the group label.
4503
4504 * test/test_load.py (testClassification): New. Loads the
4505 iceland_sample_test.thuban file and checks if it was loaded
4506 correctly.
4507
4508 2003-04-15 Jonathan Coles <[email protected]>
4509
4510 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
4511 to improve rendering performance by initializing the variables
4512 that are not change each time draw_polygon_shape() is called.
4513 The values are stored in a global struct draw_info.
4514 (draw_polygon_shape): Removed initialization code that is
4515 now in draw_polygon_init().
4516
4517 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
4518 drawing initialization call to draw_polygon_init()
4519 (MapRenderer.draw_polygon_shape): Use new signature of
4520 draw_polygon_shape.
4521
4522 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
4523 weirdness by setting the range to (1, maxint).
4524
4525 * Thuban/Model/classification.py (ClassGroupProperties): Make
4526 instance variables private and optimize comparison operator
4527 by first checking if the color references are the same.
4528 (ClassGroupSingleton): Make instance variables private.
4529 (ClassGroupRange): Make instance variables private.
4530
4531 * HOWTO-Release: Filled in missing steps for releasing packages.
4532
4533 2003-04-15 Bernhard Herzog <[email protected]>
4534
4535 First stab at internationalized messages:
4536
4537 * Thuban/__init__.py (_): Implement the translation function for
4538 real using the python gettext module.
4539
4540 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
4541 translate empty strings.
4542
4543 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4544 Add a missing space to a warning message
4545
4546 * po/README: New. Notes about the management of the translation
4547 files.
4548
4549 * po/Makefile: New. Makefile to help manage the translation files.
4550
4551 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
4552
4553 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
4554 translations and support files in po/
4555
4556 * setup.py (data_files): Add the *.mo files to the data_files too
4557
4558 * README: Add note about the translations when building from CVS
4559
4560 2003-04-14 Jonathan Coles <[email protected]>
4561
4562 * Thuban/UI/dock.py: Fixes some window resizing problems most
4563 noticable under windows. Always assume the button bitmaps will
4564 be there. Code clean up.
4565 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
4566 images for the dock/undock button to the same images.
4567 Work around for RTbug #1801.
4568
4569 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
4570 be allowed to grow within the sizer. Fixes a bug under Windows
4571 where the toolbar wasn't being drawn.
4572
4573 2003-04-14 Frank Koormann <[email protected]>
4574
4575 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
4576 Updated design to try to make the button functionality more
4577 transparent.
4578
4579 2003-04-14 Jonathan Coles <[email protected]>
4580
4581 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
4582 finalize the intialization of the panel.
4583
4584 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
4585 creation of the panel. Should be the last thing called in the
4586 initializer of a subclass.
4587
4588 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
4589 set the current selections in the combo boxes. This is needed
4590 under Windows.
4591
4592 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
4593 level panel to the dialog so that the background colors are
4594 consistent under Windows.
4595
4596 2003-04-11 Jonathan Coles <[email protected]>
4597
4598 * Thuban/UI/classgen.py: Change color ramps to start at white
4599 not black.
4600
4601 * Thuban/UI/legend.py: Enable/disable the legend buttons when
4602 the legend changes. Fixes RTbug #1793.
4603
4604 * test/test_classification.py: Added test for copying of
4605 classifications.
4606
4607 2003-04-11 Jonathan Coles <[email protected]>
4608
4609 * Thuban/UI/resource.py: New. Centralize the loading of resources
4610 such as bitmaps.
4611
4612 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
4613 added images to the move buttons, added 'reverse' button.
4614 (CustomRampPanel.__init__): Added images to the move buttons.
4615 (GreyRamp): New. Generates a ramp from white to black.
4616 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
4617
4618 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
4619 ID_PROPERTY_*.
4620 (Classifier.__init__): Minor changes to the layout.
4621 (Classifier._OnTitleChanged): Listen for when the user edits the
4622 title and update the dialog's title and the layer's title.
4623
4624 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
4625
4626 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
4627 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
4628 if the layer's title changes.
4629
4630 * Thuban/UI/mainwindow.py: Added new menu item and associated code
4631 to open a dialog to rename the map.
4632 (MainWindow): Use new resource class to import bitmaps.
4633
4634 2003-04-11 Jonathan Coles <[email protected]>
4635
4636 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
4637 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
4638 Resources/Bitmaps/group_use_none.xpm,
4639 Resources/Bitmaps/group_use_not.xpm,
4640 Resources/Bitmaps/hide_layer.xpm,
4641 Resources/Bitmaps/layer_properties.xpm,
4642 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
4643 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
4644 New.
4645
4646 2003-04-10 Jonathan Coles <[email protected]>
4647
4648 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
4649 Should pass group to ClassGroup constructor.
4650
4651 2003-04-10 Jonathan Coles <[email protected]>
4652
4653 * Thuban/Model/classification.py: (ClassGroup): Move all the common
4654 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
4655 here. Implement SetVisible(), IsVisible().
4656 (ClassGroup.__init__): Add group parameter which acts as a copy
4657 constructor.
4658
4659 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
4660 "Visible" check boxes.
4661 (Classifier): Rename the buttons and refactor the code to match
4662 the new labels.
4663
4664 * Thuban/UI/legend.py: Classify button is now called "Properties".
4665 Refactored the code to change variable names.
4666 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
4667
4668 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
4669 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
4670 renamed to MainWindow.LayerEditProperties.
4671 (MainWindow.ToggleLegend): Don't include map name in legend title.
4672 (MainWindow.SetMap): Added the map name to the window title.
4673 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
4674 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
4675 Functionality is found in the layer properties dialog.
4676
4677 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4678 draw visible groups.
4679
4680 2003-04-09 Jonathan Coles <[email protected]>
4681
4682 * Thuban/UI/classgen.py: Modifications to allow simple
4683 addition and selection of new color schemes.
4684 (MonochromaticRamp): New. Generates a ramp between two colors.
4685 (RedRamp): New. Generates a ramp of all red.
4686 (GreenRamp): New. Generates a ramp of all green.
4687 (BlueRamp): New. Generates a ramp of all blue.
4688
4689 2003-04-09 Jonathan Coles <[email protected]>
4690
4691 * Thuban/Model/classification.py (Classification.__deepcopy__):
4692 Need to copy over field and fieldType attributes.
4693
4694 * Thuban/Model/table.py (Table.field_range): New. Retrive the
4695 maximum and minimum values over the entire table for a given
4696 field.
4697 (Table.GetUniqueValues): New. Retrieve all the unique values
4698 in the table for a given field.
4699
4700 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
4701 (GenUniquePanel): New. Controls to allow the user to select
4702 which unique field values they would like in the classification.
4703 (CustomRampPanel): Code that was in ClassGenDialog that allows
4704 the user to select the properties for a custom ramp.
4705 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
4706
4707 * Thuban/UI/classifier.py: Removed a lot of debugging code.
4708 (Classifier._SetClassification): Callback method so that the
4709 class generator can set the classification in the grid.
4710 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
4711 editing of a group properties class into a wxWindows control.
4712
4713 * Thuban/UI/dock.py: It was decided that if the user closes
4714 a dockable window the window should simply hide itself. That
4715 way if the user wants to show the dock again it appears in the
4716 same place as it was when it was closed.
4717 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
4718 (DockableWindow._OnButtonClose): Hide the window instead of
4719 destroying it.
4720 (DockableWindow._OnClose): Hide the window instead of
4721 destroying it.
4722
4723 * Thuban/UI/legend.py (LegendTree): Use a private method to
4724 consistently set the font and style of the text. Fixes RTbug #1786.
4725
4726 * Thuban/UI/mainwindow.py: Import just the Classifier class.
4727
4728 2003-04-07 Bernhard Herzog <[email protected]>
4729
4730 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
4731 to the map module
4732
4733 2003-04-07 Bernhard Herzog <[email protected]>
4734
4735 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4736 favor of ToggleSessionTree
4737 (MainWindow.ToggleSessionTree): New method to toggle visibility of
4738 the session tree.
4739 (MainWindow.SessionTreeShown): New method to return whether the
4740 session tree is currently shown.
4741 (MainWindow.ToggleLegend): New method to toggle visibility of the
4742 legend
4743 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4744 LegendShown
4745 (MainWindow.LegendShown): New method to return whether the legend
4746 is currently shown.
4747 (_method_command): Add checked parameter so we can define check
4748 menu items
4749 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4750 mainwindow methods.
4751 (show_session_tree, show_legend commands): Removed.
4752 (toggle_session_tree, toggle_legend commands): New commands to
4753 toggle the visibility of the dialogs
4754
4755 2003-04-07 Jonathan Coles <[email protected]>
4756
4757 * Thuban/UI/classgen.py: Fix Windows problem.
4758
4759 * Thuban/UI/dock.py: Fix Windows problem.
4760
4761 * Thuban/UI/mainwindow.py: Use False instead of false.
4762 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4763
4764 2003-04-07 Jonathan Coles <[email protected]>
4765
4766 Since we now say that the order of the groups in a classification
4767 matters, it makes sense to be able to manipulate that order. Most
4768 of the changes to Thuban/Model/classification.py are to that end.
4769
4770 * Thuban/Model/classification.py (Classification.AppendGroup,
4771 Classification.InsertGroup, Classification.ReplaceGroup,
4772 Classification.RemoveGroup, Classification.GetGroup): Do as the
4773 names imply.
4774 (Classification.FindGroup): This was called GetGroup, but GetGroup
4775 takes an index, while FindGroup takes a value.
4776 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4777 REFERENCE. Currently there is a cyclic reference between the layer
4778 and its classification. If the classification doesn't need to know
4779 its owning layer we can change this, since it may make sense to be
4780 able to use the same classification with different layers.
4781
4782 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4783
4784 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4785 not AddGroup()
4786
4787 * Thuban/UI/classifier.py: Now that we can depend on the order in
4788 a Classification and have methods to manipulate that order we don't
4789 need to use our own data structures in the grid. We can simply make
4790 the grid/table access the information they need from a copy of
4791 the classification object.
4792 (Classifier._OnCloseBtn): Event handler for when the user clicks
4793 'Close'. This is needed so if the user applies changes and then
4794 continues to change the table the user has the option of discarding
4795 the most recent changes and keeping what they applied.
4796
4797 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4798 into the same group.
4799
4800 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4801 with a really old version of proj, PJ_VERSION won't even be defined.
4802 If it isn't defined then just compile so that the function always
4803 returns Py_False.
4804
4805 * test/test_classification.py: Fix tests to use the renamed methods.
4806 Still need to write tests for the new methods.
4807
4808 2003-04-04 Jonathan Coles <[email protected]>
4809
4810 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4811 call to SetSelection out of the method and before the call
4812 to __SelectField in __init__. This prevents a recursion of events
4813 when _OnFieldSelect is triggered by the user.
4814
4815 2003-04-04 Jonathan Coles <[email protected]>
4816
4817 * Thuban/Model/classification.py: Rename Color.None to
4818 Color.Transparent.
4819 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4820 Don't bother copying the color, since Colors are immutable.
4821
4822 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4823 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4824 Thuban/UI/renderer.py, Thuban/UI/view.py:
4825 Rename Color.None to Color.Transparent.
4826
4827 * test/test_classification.py, test/test_load.py: Rename Color.None
4828 to Color.Transparent.
4829
4830 2003-04-04 Jonathan Coles <[email protected]>
4831
4832 * Thuban/Model/classification.py: Fix assert calls.
4833 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4834 Copy the color parameter rather than hold onto a reference.
4835
4836 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4837 the color object.
4838 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4839 are sure there exists only one refernce to Color.None in the system.
4840 This allows us to use 'is' rather than the comparision functions.
4841
4842 * Thuban/Model/save.py: Fix assert calls.
4843
4844 * Thuban/UI/classifier.py: Fix assert calls.
4845 (ClassGrid._OnCellDClick): Call up to the classifier to open the
4846 dialog to edit the groups properties.
4847 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4848 correctly if a cell is resized.
4849 (ClassTable.SetClassification): New. Changes the classification
4850 that is in the table.
4851 (ClassTable.__SetRow): Allow groups to be prepended.
4852 (Classifier): New code for opening the EditProperties and
4853 GenerateRanges dialogs.
4854 (SelectPropertiesDialog.__GetColor): Only set the color in the
4855 color dialog if the current color is not None.
4856
4857 * Thuban/UI/dock.py: Fix assert calls.
4858
4859 * Thuban/UI/legend.py: Fix assert calls.
4860
4861 * Thuban/UI/renderer.py: Fix assert calls.
4862
4863 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4864 classifications.
4865 (GenRangePanel): Panel specific to range generation.
4866 (GenSingletonPanel): Panel specific to singleton generation.
4867 (ClassGenerator): Class responsible for actually generating
4868 the classification from the data gathered in the dialog box.
4869 (PropertyRamp): Generates properties whose values range from
4870 a starting property to an ending property.
4871
4872 2003-04-03 Bernhard Herzog <[email protected]>
4873
4874 * test/support.py (print_garbage_information): New function that
4875 prints information about still connected messages and memory
4876 leaks.
4877 (run_suite): Removed.
4878 (run_tests): New function for use as a replacement of
4879 unittest.main in the test_* files. This one calls
4880 print_garbage_information at the end.
4881
4882 * test/runtests.py (main): Use support.print_garbage_information
4883
4884 * test/test_layer.py: Use support.run_tests instead of
4885 unittest.main so we get memory leak information
4886 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4887 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4888 (TestLayerLegend.test_visibility): Call the layer's Destroy method
4889 to fix a memory leak.
4890
4891 * test/test_classification.py: Use support.run_tests instead of
4892 unittest.main so we get memory leak information
4893 (TestClassification.test_classification): Call the layer's Destroy
4894 method to fix a memory leak.
4895
4896 2003-04-02 Bernhard Herzog <[email protected]>
4897
4898 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4899 Handle the reference counts of the return value and errors in
4900 PyArg_ParseTuple correctly.
4901
4902 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4903 sure the filename is absolute to avoid problems when saving the
4904 session again
4905
4906 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4907
4908 2003-04-01 Jonathan Coles <[email protected]>
4909
4910 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4911 that there actually are points in the returned list of points
4912 before trying to index into the list. The list may be empty if
4913 the shape is a Null Shape.
4914
4915 2003-04-01 Bernhard Herzog <[email protected]>
4916
4917 * test/test_map.py: Don't use from <module> import *
4918
4919 2003-04-01 Jonathan Coles <[email protected]>
4920
4921 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4922 LAYER_LEGEND_CHANGED
4923
4924 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4925 self.Destroy() to close the window after yesterday's changes.
4926
4927 * test/test_map.py, test/test_session.py: Fix messages that
4928 are sent from maps and layers.
4929
4930 2003-03-31 Jonathan Coles <[email protected]>
4931
4932 * Thuban/UI/classifier.py: Commented out some debugging statements.
4933 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4934 RTbug #1769.
4935
4936 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4937 position (although position doesn't work yet under GTK).
4938 (DockableWindow.Destroy): New. Called when the window must be
4939 closed. Namely needed when the DockFrame closes and must close
4940 its children.
4941 (DockFrame): Listen for EVT_CLOSE and destroy all children.
4942
4943 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4944 when then window is told to close.
4945 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4946 comment in source for more info.
4947
4948 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4949
4950 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4951 symmetry with other such methods.
4952 (MainWindow.ShowLegend): Show the legend docked by default.
4953
4954 2003-03-28 Jonathan Coles <[email protected]>
4955
4956 * Thuban/UI/classifier.py: Support for highlighting a specific
4957 group within the grid when the classification dialog is opened.
4958 Also contains a lot of debugging printouts which will later
4959 be removed.
4960
4961 * Thuban/UI/dock.py: Complete rework on the dock code so that
4962 that it is fairly removed from the rest of the Thuban application.
4963 It is easy to add new docks which the rest of the program having
4964 to be aware of them.
4965
4966 * Thuban/UI/legend.py: Modifications to support selecting a
4967 specific group in the classification dialog. Changed how layers
4968 are drawn when the layer is visible/invisible.
4969
4970 * Thuban/UI/mainwindow.py: Removed legend specific code and
4971 replaced it with calls to the new dock code.
4972
4973 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4974 to check if scale > 0. Trying to track down a divide by zero.
4975
4976 2003-03-26 Jonathan Coles <[email protected]>
4977
4978 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4979 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4980 now part of DockableWindow.
4981 (LegendPanel.DoOnSelChanged): Select the current layer in the
4982 map.
4983 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4984 with the selected layer and/or group.
4985
4986 2003-03-26 Jonathan Coles <[email protected]>
4987
4988 This putback contains the code for dockable windows. There is
4989 no support in wxWindows as of this date for windows that can
4990 attach themselves to other windows.
4991
4992 The current model contains a DockableWindow which has a parent
4993 window for when it is detached and a dock window that it puts
4994 its contents in when it is docked. The contents of a DockableWindow
4995 must be a DockPanel. DockPanel itself derives from wxPanel.
4996
4997 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4998 message, not a LAYER_LEGEND_CHANGED message.
4999
5000 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
5001
5002 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
5003 as one of the style properties for the fieldTypeText item to
5004 be sure that its size is correct when the text changes.
5005
5006 * Thuban/UI/dock.py: New. Classes for the DockPanel and
5007 DockableWindow.
5008
5009 * Thuban/UI/legend.py: Added some more buttons and made the
5010 LegendPanel a DockPanel.
5011
5012 * Thuban/UI/mainwindow.py: Added sash windows to the main window
5013 and supporting functions for manipulating the sashes.
5014 (MainWindow.ShowLegend): Create a DockableWindow with the
5015 LegendPanel as the contents.
5016
5017 * Thuban/UI/messages.py: Added DOCKABLE_* messages
5018
5019 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
5020 not LAYER_LEGEND_CHANGED, messages.
5021
5022 2003-03-25 Jonathan Coles <[email protected]>
5023
5024 * setup.py: Added custom script bdist_rpm_build_script so that
5025 when the rpm is built the path to wx-config is correct.
5026
5027 * setup.cfg: Added line saying to use the custom build script
5028
5029 2003-03-20 Jonathan Coles <[email protected]>
5030
5031 Initial implementation of the Legend.
5032
5033 * Thuban/UI/legend.py: New. Creates a window that shows the map's
5034 Legend information and allows the user to add/modify classifications
5035 and how the layers are drawn on the map.
5036
5037 * setup.py: New command 'build_docs' which currently uses
5038 happydoc to generate html documentation for Thuban.
5039
5040 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
5041 Returns a string which is appropriately describes the group.
5042
5043 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
5044 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
5045
5046 * Thuban/Model/map.py (Map): Rename messages and use new, more
5047 specific, messages.
5048
5049 * Thuban/Model/messages.py: New message to indicate that a layer's
5050 data has changed (LAYER_CHANGED). New map messages to indicate
5051 when layers have been added/removed/changed or if the stacking order
5052 of the layers has changed.
5053
5054 * Thuban/Model/session.py: Rename and use new messages.
5055
5056 * Thuban/UI/classifier.py: Remember if any changes have actually
5057 been applied so that if the dialog is cancelled without an application
5058 of changes we don't have to set a new classification.
5059 (ClassDataPreviewer): Pulled out the window specific code and put it
5060 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
5061 symbols on any DC.
5062
5063 * Thuban/UI/mainwindow.py: New code to open the legend.
5064
5065 * Thuban/UI/view.py: Use new message names.
5066
5067 2003-03-19 Jonathan Coles <[email protected]>
5068
5069 * Thuban/UI/main.py (verify_versions): New. Checks the versions
5070 of Python, wxPython, and some other libraries.
5071
5072 * extensions/thuban/wxproj.cpp (check_version): Checks the given
5073 version against what wxproj was compiled with.
5074 (check_version_gtk): If wxproj was compiled with gtk then check
5075 the given version against the version of the gtk library
5076 currently being used.
5077
5078 2003-03-14 Bernhard Herzog <[email protected]>
5079
5080 * test/test_command.py: Run the tests when the module is run as a
5081 script
5082
5083 2003-03-14 Bernhard Herzog <[email protected]>
5084
5085 Implement selection of multiple selected shapes in the same layer:
5086
5087 - Introduce a new class to hold the selection. This basically
5088 replaces the interactor which was nothing more than the
5089 selection anyway. A major difference is of course that the new
5090 selection class supports multiple selected shapes in one layer
5091
5092 - Move the object that represents the selection from the
5093 application to the canvas. The canvas is a better place than the
5094 application because the selection represents which shapes and
5095 layer of the map displayed by the canvas are selected and
5096 affects how the map is drawn.
5097
5098 - Make the selection and its messages publicly available through
5099 the mainwindow.
5100
5101 - The non-modal dialogs do not get a reference to the interactor
5102 anymore as they can simply refer to their parent, the
5103 mainwindow, for the what the interactor had to offer.
5104
5105 * Thuban/UI/selection.py: New module with a class to represent the
5106 selection.
5107
5108 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
5109 these unused messages
5110
5111 * Thuban/UI/application.py (ThubanApplication.OnInit)
5112 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
5113 interactor is gone now.
5114 (ThubanApplication.CreateMainWindow): There is no interactor
5115 anymore so we pass None as the interactor argument for now for
5116 compatibility.
5117
5118 * Thuban/UI/view.py (MapCanvas.delegated_messages)
5119 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
5120 Unsubscribe, delegate messages according to the delegated_messages
5121 class variable.
5122 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
5123 attributes from instance variables as described with the
5124 delegated_methods class variable.
5125 (MapCanvas.__init__): New instance variable selection holding the
5126 current selection
5127 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
5128 pass them on to the renderer
5129 (MapCanvas.SetMap): Clear the selection when a different map is
5130 selected.
5131 (MapCanvas.shape_selected): Simple force a complete redraw. The
5132 selection class now takes care of only issueing SHAPES_SELECTED
5133 messages when the set of selected shapes actually does change.
5134 (MapCanvas.SelectShapeAt): The selection is now managed in
5135 self.selection
5136
5137 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
5138 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
5139 Unsubscribe, delegate messages according to the delegated_messages
5140 class variable.
5141 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
5142 attributes from instance variables as described with the
5143 delegated_methods class variable.
5144 (MainWindow.__init__): The interactor as ivar is gone. The
5145 parameter is still there for compatibility. The selection messages
5146 now come from the canvas.
5147 (MainWindow.current_layer, MainWindow.has_selected_layer):
5148 Delegate to the the canvas.
5149 (MainWindow.LayerShowTable, MainWindow.Classify)
5150 (MainWindow.identify_view_on_demand): The dialogs don't need the
5151 interactor parameter anymore.
5152
5153 * Thuban/UI/tableview.py (TableFrame.__init__)
5154 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
5155 (LayerTableFrame.row_selected): The interactor is gone. It's job
5156 from the dialog's point of view is now done by the mainwindow,
5157 i.e. the parent. Subscribe to SHAPES_SELECTED instead
5158 of SELECTED_SHAPE
5159
5160 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
5161 is gone. It's job from the dialog's point of view is now done by
5162 the mainwindow, i.e. the parent.
5163
5164 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
5165 gone. It's job from the dialog's point of view is now done by the
5166 mainwindow, i.e. the parent.
5167
5168 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
5169 gone. It's job from the dialog's point of view is now done by the
5170 mainwindow, i.e. the parent.
5171 (SessionTreeCtrl.__init__): New parameter mainwindow which is
5172 stored as self.mainwindow. The mainwindow is need so that the tree
5173 can still subscribe to the selection messages.
5174 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
5175 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
5176 selection is now accessible through the mainwindow. Subscribe to
5177 SHAPES_SELECTED instead of SELECTED_SHAPE
5178
5179 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
5180 SHAPES_SELECTED message now.
5181 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
5182 so deal with multiple shapes
5183 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
5184 gone. It's job from the dialog's point of view is now done by the
5185 mainwindow, i.e. the parent.
5186
5187 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
5188 parameter is now a list of shape ids.
5189 (RecordTable.SetTable): The second parameter is now a list of
5190 indices.
5191
5192 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
5193 selected_shape parameter and ivar to selected_shapes. It's now a
5194 list of shape ids.
5195 (MapRenderer.draw_label_layer): Deal with multiple selected
5196 shapes. Rearrange the code a bit so that the setup and shape type
5197 distinctions are only executed once.
5198
5199 * test/test_selection.py: Test cases for the selection class
5200
5201 2003-03-11 Jonathan Coles <[email protected]>
5202
5203 * Thuban/Model/load.py: Temporary fix so that the xml reader
5204 doesn't cause Thuban to crash.
5205
5206 * Thuban/Model/layer.py: Handle the cyclic references between
5207 a layer and its classification better, and be sure to disconnect
5208 the classification from the layer when the layer is destroyed
5209 so that we don't maintain a cyclic reference that may not be
5210 garbage collected.
5211
5212 * Thuban/Model/classification.py: See comment for layer.py.
5213
5214 2003-03-12 Jan-Oliver Wagner <[email protected]>
5215
5216 * HOWTO-Release: New. Information on the steps for releasing
5217 a new version of Thuban.
5218
5219 2003-03-11 Jonathan Coles <[email protected]>
5220
5221 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
5222 Use True instead of true.
5223 (Classifier): Should have a single panel in which all the controls lie.
5224
5225 * Thuban/UI/proj4dialog.py: Add normal border.
5226
5227 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
5228
5229 * Thuban/UI/mainwindow.py: Use True instead of true.
5230
5231 * setup.py: Update some definitions to use wxWindows2.4 files
5232
5233 * Data/iceland_sample_class.thuban: Fixed file so that the
5234 field_type information is present.
5235
5236 2003-03-10 Jonathan Coles <[email protected]>
5237
5238 * Thuban/UI/classifier.py (Classifier.__init__): Make the
5239 field type label grow so that when the text changes the
5240 size is updated correctly. This may be a wxWindows bug.
5241
5242 2003-03-10 Jonathan Coles <[email protected]>
5243
5244 * Thuban/UI/application.py: Changed SESSION_CHANGED to
5245 SESSION_REPLACED.
5246
5247 * Thuban/UI/classifier.py: Wrap text with _().
5248 (ClassGrid.CreateTable): Set dimensions and size hints here,
5249 instead of in Reset, so we only set the size once.
5250
5251 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
5252
5253 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
5254 Call Close() instead of Shutdown().
5255
5256 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
5257
5258 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
5259 Go back to using OnClose() instead of Shutdown().
5260
5261 2003-03-10 Jonathan Coles <[email protected]>
5262
5263 * Thuban/UI/classifier.py (Classifier): SelectField() needed
5264 to know the old field index as well as the new one.
5265
5266 2003-03-10 Jonathan Coles <[email protected]>
5267
5268 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
5269 to correctly set the table information and call this from
5270 __init__ and from _OnFieldSelect so that all the information
5271 is up to date when the dialog opens and when a field is changed.
5272
5273 2003-03-10 Jonathan Coles <[email protected]>
5274
5275 * Thuban/Model/classification.py (Classification): Don't use
5276 layer's message function directly, use the ClassChanged() method
5277 when then classification changes. SetField/SetFieldType/SetLayer
5278 must keep the information about field name and field type in
5279 sync when an owning layer is set or removed.
5280
5281 * Thuban/Model/layer.py: Added ClassChanged() so that the
5282 classification can tell the layer when its data has changed.
5283 (Layer.SetClassification): Accepts None as an arguement to
5284 remove the current classification and correctly handles
5285 adding a new classification.
5286
5287 * Thuban/Model/load.py: Comment out print statement
5288
5289 * test/test_classification.py, test/test_save.py: New and
5290 improved tests.
5291
5292 2003-03-07 Jonathan Coles <[email protected]>
5293
5294 * Thuban/Model/classification.py: Implemented __copy__ and
5295 __deepcopy__ for ClassGroup* and ClassGroupProperites so
5296 they can easily be copied by the classifier dialog.
5297 (ClassGroupProperites.__init__): The default line color should
5298 have been Color.Black.
5299
5300 * Thuban/UI/classifier.py: Setting and Getting table values now
5301 uses a consistent set of functions.
5302 (Classifier): Now non-modal. Has field type label which changes
5303 as the field changes. Keep track of buttons in a list so that
5304 we can enable/disable the buttons when the None field is selected.
5305 (SelectPropertiesDialog): Add buttons to make the colors transparent.
5306
5307 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
5308 does what OnClose did, but can be called by the application to
5309 close a window. Needed when a session changes, and we have to
5310 close the classifier windows.
5311
5312 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
5313 Shuts down open dialogs. Used when a new session is created
5314 or a session is opened.
5315 (MainWindow.SaveSession): Should only call application.SaveSession()
5316 if we don't call SaveSessionAs first.
5317 (MainWindow.Classify): Allow different classifier dialogs for
5318 different layers.
5319
5320 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
5321 the parent class handle it. Add Shutdown() to unsubscibe from
5322 event notification and call the parent Shutdown(). This was
5323 necessary so the application can close the tree window.
5324
5325 2003-03-06 Jonathan Coles <[email protected]>
5326
5327 * Thuban/Model/classification.py: Minor documentation changes,
5328 Addition of __eq__ and __ne__ methods.
5329 (Classification.SetLayer): prevent recursion between this method
5330 and Layer.SetClassification().
5331
5332 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
5333
5334 * Thuban/Model/layer.py (SetClassification): prevent recursion
5335 between this method and Classification.SetLayer().
5336
5337 * test/test_classification.py, test/test_load.py,
5338 test/test_session.py: Fixed and added tests for the classification
5339 classes.
5340
5341 2003-03-06 Bernhard Herzog <[email protected]>
5342
5343 * Thuban/UI/classifier.py (ClassGrid.__init__)
5344 (ClassGrid.CreateTable): Move the SetSelectionMode call to
5345 CreateTable because otherwise it triggers an assertion in
5346 wxPython/wxGTK 2.4.
5347
5348 2003-03-05 Jonathan Coles <[email protected]>
5349
5350 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
5351
5352 * Thuban/Model/load.py: import FIELDTYPE constants from table.
5353
5354 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
5355
5356 * Thuban/Model/table.py: Put FIELDTYPE constants back.
5357
5358 2003-03-05 Jonathan Coles <[email protected]>
5359
5360 * Thuban/UI/classifier.py: Added class documentation.
5361 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
5362 Store just the groups in the table and generate the other
5363 column information when it is requested. Add "None" field
5364 to pull-down to select no classification.
5365
5366 * Thuban/common.py: Moved FIELDTYPE constants from table.py
5367 (Str2Num): Only catch ValueError exceptions.
5368
5369 * Thuban/Model/classification.py: Class documentation. Renaming
5370 of methods with Stroke to Line. Groups are stored in a single
5371 list with the default as the first element. Groups are searched
5372 in the order they appear in the list.
5373
5374 * Thuban/Model/color.py: Documentation.
5375
5376 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
5377 the kind of data represented by a field.
5378
5379 * Thuban/Model/load.py (ProcessSession): Use proper string
5380 conversion function; fixes RTbug #1713.
5381
5382 * Thuban/Model/save.py (Saver): Store field type information.
5383
5384 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
5385 (Table): Add field_info_by_name() to retrieve field information
5386 by specifying the field name, not the number.
5387
5388 * Thuban/UI/mainwindow.py: Function name changes.
5389
5390 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
5391 get the layer classification once. Don't try to classify
5392 values when the field is None: just use the default properties.
5393
5394 * Thuban/UI/view.py: Function name changes.
5395
5396 * Doc/thuban.dtd: Add field_type attribute to a classification.
5397
5398 2003-03-04 Bernhard Herzog <[email protected]>
5399
5400 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
5401 the fill and stroke layer attributes optional with suitable
5402 default values. Add the stroke_width layer attribute. Use correct
5403 syntax for empty elements. Make the attribute list for labels
5404 refer to the label element.
5405
5406 2003-03-04 Bernhard Herzog <[email protected]>
5407
5408 * setup.py (thuban_build_py.build): Add a comment about distutils in
5409 Python 2.3 containing some of the functionality we implement in
5410 setup.py ourselves.
5411
5412 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
5413 before the selection mode. Doing it the other way round triggers
5414 an assertion in wxWindows.
5415
5416 * Thuban/Model/save.py (escape): Fix typo in doc-string
5417
5418 * Thuban/Model/classification.py: Remove unnecessary wxPython
5419 import
5420
5421 2003-03-04 Jonathan Coles <[email protected]>
5422
5423 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
5424 Parameter 'value' should default to None.
5425
5426 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
5427 the class attribute __classification is now private.
5428
5429 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
5430 Classifier to ClassGrid. Added support for removing selected rows,
5431 which including code for keeping track of when cells are selected,
5432 and deselected.
5433 (ClassTable): Support for added/removing rows. Fixed a problem
5434 with __ParseInput whereby it would not allow strings (only numbers)
5435 to be entered.
5436 (Classifier): Added button and supporting code for removing
5437 selected rows.
5438
5439 2003-02-27 Jonathan Coles <[email protected]>
5440
5441 * Thuban/common.py: Moved color conversion functions into
5442 Thuban/UI/common.py.
5443 (Str2Num): Now converts the float (not the string) to a long/int
5444 so that an exception isn't thrown.
5445
5446 * Thuban/UI/common.py: Common functions used in several UI modules
5447
5448 * Thuban/Model/classification.py: Changed the class hierarchy
5449 so that a Classification consists of Groups which return
5450 Properties when a value matches a Group.
5451
5452 * Thuban/Model/layer.py: Fixed name resolution problem.
5453
5454 * Thuban/Model/load.py: Use new Classification and Group functions.
5455
5456 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
5457 failure.
5458 (Saver.write_classification): Use new Classification and Group
5459 functions.
5460
5461 * Thuban/UI/classifier.py: Changes to use new Classification and Group
5462 functions. Fix to create a tuple with a single value instead of
5463 simply returning the value.
5464
5465 * Thuban/UI/renderer.py: Use new Classification and Group functions.
5466 Use common.py functions.
5467
5468 * Thuban/UI/tree.py: Use common.py functions.
5469
5470 * test/test_classification.py: Use new Classification and Group
5471 classes.
5472
5473 2003-02-24 Jonathan Coles <[email protected]>
5474
5475 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
5476 functions from Thuban color objects to wxWindow colour objects.
5477
5478 * Thuban/Model/classification.py (Classification): Renamed
5479 GetProperties() to GetClassData(). Used the new iterator
5480 in TreeInfo().
5481 (ClassIterator): Iterator implementation to iterate over the
5482 ClassData objects in a classification object.
5483
5484 * Thuban/Model/save.py (Saver.write_classificaton): Uses
5485 the new iterator to save the classification information.
5486
5487 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
5488 for changing the stroke and fill colors and previewing the
5489 changes.
5490
5491 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
5492 MainWindow.SaveSessionAs): Text string changes so the dialogs
5493 have more meaningful titles.
5494
5495 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
5496 Classification method name from GetProperties to GetClassData.
5497
5498 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
5499 instead of accessing now non-existent class variables.
5500
5501 2003-02-24 Bernhard Herzog <[email protected]>
5502
5503 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
5504 unneeded Shape() call. Rendering is substantially faster without
5505 it and it avoids some problems with broken shape files.
5506
5507 2003-02-20 Frank Koormann <[email protected]>
5508
5509 Force minimal size of identify and label dialogs. The autosizing
5510 looked too ugly.
5511
5512 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
5513 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
5514 Set size of listctrl.
5515 * Thuban/UI/identifyview.py (IdentifyView.__init__):
5516 Set size of dialog.
5517
5518 2003-02-19 Jonathan Coles <[email protected]>
5519
5520 * test/test_classification.py, test/test_layer.py,
5521 test/test_load.py, test/test_map.py, test/test_session.py:
5522 Updated the tests to use the new functions that are in the
5523 respective classes.
5524
5525 * Thuban/Model/classification.py (Classification):
5526 Uses the new ClassData* classes. Modification messages are
5527 passed up to the parent layer (if it exists).
5528 (ClassData): New class to encapsulate the common data in each
5529 classification property.
5530 (ClassDataDefault): Represents the Default class. data.
5531 (ClassDataPoint): Represents a single class. data point
5532 (ClassDataRange): Represents a class. range
5533 (ClassDataMap): Represents a class. map (unused).
5534
5535 * Thuban/Model/color.py: Added Color.None to represent something
5536 with no color. Color.Black represents the color black.
5537 (NoColor): Helper class derived from Color to represent something
5538 with no color.
5539
5540 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
5541 stroke_width attributes. Made the 'classification' attribute private.
5542 New methods for setting/getting the classification.
5543
5544 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
5545 to get the classifcation and use the new ClassData* classes to
5546 hold the classification data. Use Str2Num to convert numbers
5547 properly.
5548
5549 * Thuban/Model/save.py (Saver): Use new Color and Classification
5550 methods
5551
5552 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
5553 custom grid.
5554 (ClassTable): Support for editing Values and Labels and for
5555 changing what type (point or range) of data is stored in each
5556 property based on how the user enters the data.
5557 (Classifier): Support for saving the new classifications and
5558 launching the dialog to edit a property.
5559 (SelectPropertiesDialog): New class for editing the visual
5560 properties of a classification (stroke color, width, and fill color)
5561 (ClassPreviewer): Took the Draw method from ClassRenderer and
5562 made most of it into this new class. Intend to use this class in
5563 the SelectPropertiesDialog for previewing changes.
5564
5565 * Thuban/UI/renderer.py: Use new Color and Classification methods.
5566
5567 * Thuban/UI/tree.py: Formatting changes.
5568
5569 * Doc/thuban.dtd: Add 'label' element
5570
5571 * Thuban/common.py: New. Contains common routines used throughout
5572 the code.
5573 (Str2Num): Takes a string and converts it to the "best" type of
5574 number.
5575
5576 2003-02-14 Bernhard Herzog <[email protected]>
5577
5578 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
5579 dragging flag is always set to 0 even when the tool implementation
5580 raises an exception
5581
5582 2003-02-11 Bernhard Herzog <[email protected]>
5583
5584 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
5585 method to create a splash screen.
5586 (ThubanApplication.ShowMainWindow): New. Show the main window.
5587 Needed so the splash screen can display the mainwindow
5588 (ThubanApplication.OnInit): Call the
5589 new splash_screen method to determine whether the application
5590 should display a splash screen. If it displays a splash screen do
5591 not immediately show the main window.
5592
5593 2003-02-11 Jonathan Coles <[email protected]>
5594
5595 * Thuban/Model/classification.py: Added import line to fix
5596 feature conflicts between running on python2.2 and python2.1.
5597
5598 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
5599 onto the clinfo parameter, so removed the deepcopy().
5600
5601 2003-02-10 Jonathan Coles <[email protected]>
5602
5603 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
5604 Added element_open variable to track opening and closing of tags
5605 so that tags that don't span more than one line are closed with
5606 /> instead of </tag_name>. Use the GetDefault*() methods of
5607 the Classification class.
5608
5609 * Thuban/Model/classification.py (Classificaton): Added set and
5610 get methods for the default data. The class also takes a layer
5611 reference so that modification messages can be sent. Fixed the
5612 methods to use the new ClassData class.
5613 (ClassData): New class to encapsulate the classification data
5614
5615 * Thuban/Model/layer.py (Layer): Remove the
5616 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
5617 SetDefault*() methods on the layer's classification object.
5618 (Layer.__init__): Use the new SetDefault*() methods in the
5619 Classification class.
5620
5621 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
5622 object instead of a dictionary.
5623
5624 * Thuban/UI/classifier.py (ClassRenderer): New class to
5625 draw the classifications in the dialog box's table.
5626 (Classifier): Modified to use the ClassRenderer class.
5627
5628 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
5629 methods of the Classification class.
5630
5631 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
5632 of the ClassData class.
5633
5634 * test/test_classification.py, test/test_layer.py,
5635 test/test_map.py, test/test_session.py: Fix the tests to work
5636 with the above code changes.
5637
5638 2003-02-03 Jonathan Coles <[email protected]>
5639
5640 * Thuban/Model/classification.py (Classification): Added getNull()
5641 to return the NullData reference
5642
5643 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
5644 Layer.SetStrokeWidth): Modified these functions to change the
5645 null data in the classification rather than keep these values
5646 directly in the Layer class. Menu options to change these values
5647 work again.
5648
5649 2003-01-28 Jonathan Coles <[email protected]>
5650
5651 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
5652 Fixed crashing problem on some systems. Dialog box shows
5653 classification data.
5654
5655 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
5656 Colors in the tree view.
5657
5658 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
5659 the tree info for classifications. Commented out unnecessary lines.
5660
5661 * Thuban/Model/classification.py (Classification.TreeInfo): New
5662 function to add information about the classification into the
5663 tree view.
5664
5665 2003-01-27 Jan-Oliver Wagner <[email protected]>
5666
5667 * Thuban/__init__.py (_): New.
5668
5669 * Thuban/Model/classification.py, Thuban/Model/extension.py,
5670 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
5671 Thuban/Model/session.py, Thuban/UI/application.py,
5672 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
5673 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
5674 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
5675 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
5676 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
5677
5678 2003-01-27 Jonathan Coles <[email protected]>
5679
5680 * Thuban/Model/layer.py: Classification initialization calls.
5681
5682 * Thuban/Model/classification.py: Created class to encapsulate
5683 a layer classification. Supports specific data points and
5684 ranges.
5685
5686 * Thuban/Model/load.py: Added support for loading classification
5687 information.
5688
5689 * Thuban/Model/save.py: Added support for saving classification
5690 information.
5691
5692 * Thuban/UI/classifier.py: Initial class for a dialog box for
5693 specifying classification information.
5694
5695 * Thuban/UI/mainwindows.py: Support for opening the classifier
5696 dialog.
5697
5698 * Thuban/UI/renderer.py: Support for drawing a layer with the
5699 classification information.
5700
5701 * Data/iceland_sample_class.thuban: iceland_sample with
5702 classification data.
5703
5704 * test/test_classification: Tests for the Classification class.
5705
5706 2002-12-09 Bernhard Herzog <[email protected]>
5707
5708 * test/test_command.py: New. Tests for the command classes.
5709
5710 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
5711 (Command.IsTool): New method to distinguish between command
5712 switching tools and other commands.
5713
5714 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
5715 the tool to avoid direct assignments to instance variables
5716 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
5717 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
5718 change the tool
5719
5720 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
5721 active tool's command turns insensitive, disable the tool.
5722 (_tool_command): Use the new ToolCommand class
5723
5724 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
5725 SelectTool method to change the tool
5726 (iconfile): Use the ToolCommand class
5727
5728 2002-12-03 Bernhard Herzog <[email protected]>
5729
5730 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
5731 the case of selected items that are not children of Layers or Maps
5732 properly. Previously this bug would trigger an assertion in
5733 wxWindows.
5734
5735 2002-11-06 Frank Koormann <[email protected]>
5736
5737 * Thuban/UI/mainwindow.py: Altered the order of tools in the
5738 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
5739 Full Extent).
5740
5741 2002-10-23 Bernhard Herzog <[email protected]>
5742
5743 * setup.py (setup call): version now 0.1.3
5744
5745 * MANIFEST.in: Add the files in test/
5746
5747 * test/README: Add note about tests requiring the iceland data
5748
5749 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
5750 copyright notice.
5751
5752 2002-10-18 Bernhard Herzog <[email protected]>
5753
5754 * test/test_map.py
5755 (TestMapWithContents.test_projected_bounding_box): Use an explicit
5756 epsilon.
5757
5758 * test/support.py (FloatComparisonMixin.assertFloatEqual)
5759 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
5760 message if the assertion fails and don't return the return value
5761 of self.assert_. In assertFloatSeqEqual the return meant that not
5762 all items of the sequence were compared.
5763
5764 2002-09-20 Bernhard Herzog <[email protected]>
5765
5766 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
5767
5768 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
5769
5770 * test/test_map.py (TestMapWithContents.test_tree_info): Create
5771 the string with the bounding box on the fly because of platform
5772 differences in the way %g is handled.
5773
5774 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
5775 DBFfile too because Thuban layers can't yet cope missing DBF
5776 files.
5777
5778 2002-09-20 Bernhard Herzog <[email protected]>
5779
5780 * test/test_menu.py: Use initthuban instead of
5781 add_thuban_dir_to_path to initialize Thuban.
5782
5783 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
5784 Mixin class for float comparisons
5785 (SubscriberMixin): New. Mixin class to test messages sent through
5786 the Connector class
5787
5788 * test/README: Fix a typo and add the -v flag to the command for
5789 individual tests
5790
5791 * test/test_session.py: New. Test cases for Thuban.Model.session
5792
5793 * test/test_proj.py: New. Test cases for Thuban.Model.proj
5794
5795 * test/test_map.py: New. Test cases for Thuban.Model.map
5796
5797 * test/test_layer.py: New. Test cases for Thuban.Model.layer
5798
5799 * test/test_label.py: New. Test cases for Thuban.Model.label
5800
5801 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5802
5803 * test/test_color.py: New. Test cases for Thuban.Model.color
5804
5805 * test/test_base.py: New. Test cases for Thuban.Model.base
5806
5807 2002-09-13 Bernhard Herzog <[email protected]>
5808
5809 * Thuban/Model/session.py (Session.forwarded_channels): Forward
5810 the CHANGED channel too.
5811
5812 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5813 CHANGED channel too.
5814 (Map.__init__): Call the Modifiable constructor as well.
5815
5816 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5817 event if the modified flag changes.
5818 (Modifiable.changed): Tweak the doc-string.
5819
5820 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5821 (MainWindow.set_position_text): Put the code that puts the text
5822 with the mouse position into the status bar into the new method
5823 set_position_text so that it can overwritten in derived classes.
5824
5825 2002-09-12 Bernhard Herzog <[email protected]>
5826
5827 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5828 message box on the main window.
5829
5830 2002-09-11 Bernhard Herzog <[email protected]>
5831
5832 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5833 the 'E' because it's less likely to interfere with other menu
5834 entries.
5835 (MainWindow.build_menu): remove an incorrect comment.
5836
5837 2002-09-10 Bernhard Herzog <[email protected]>
5838
5839 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5840 (_tool_command): Add sensitive parameter
5841 (_has_visible_map): Sensitivity callback to tools and other
5842 commands that require a visible map. Use it in map_zoom_in_tool,
5843 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5844 and map_full_extent
5845
5846 2002-09-06 Bernhard Herzog <[email protected]>
5847
5848 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5849 VIEW_POSITION
5850
5851 2002-09-04 Frank Koormann <[email protected]>
5852
5853 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5854
5855 2002-09-02 Bernhard Herzog <[email protected]>
5856
5857 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5858 wxWindows already and our implementation doesn't work correctly
5859 with wxGTK 2.3:
5860 (MapCanvas.__init__): Remove the instance variable
5861 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5862 be drawin
5863 (MapCanvas.OnIdle): Removed.
5864
5865 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5866 a parameter to determine the size of the rectangle.
5867 (MapCanvas.find_shape_at): Create the box around the point on a
5868 layer by layer basis and make the size depend on the shape type.
5869 This solves a problem with the selection of point shapes at the
5870 border of the layer's bounding box
5871
5872 2002-08-30 Bernhard Herzog <[email protected]>
5873
5874 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5875 for the sensitivity of remove layer.
5876 (_can_remove_layer): New. Sensitivity callback for remove layer
5877 (Command layer_remove): Use _can_remove_layer
5878
5879 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5880 determine whether a given layer can be deleted.
5881
5882 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5883 (MapCanvas.do_redraw): Get rid of the unused update_region
5884 instance variable
5885
5886 * Thuban/UI/view.py: Add/update some doc-strings.
5887
5888 * test/: new subdirectory with a bunch of unit tests.
5889
5890 * test/README, test/test_table.py, test/test_save.py,
5891 test/test_menu.py, test/test_load.py: Initial set of tests and
5892 brief instructions on how to run them
5893
5894 2002-08-29 Bernhard Herzog <[email protected]>
5895
5896 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5897 arcs with multiple parts.
5898
5899 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5900 Handle degenrate rectangles.
5901
5902 * Thuban/Model/table.py: Make writing records work correctly:
5903 (Table.__init__): Keep track of whether the DBF is open for
5904 writing
5905 (Table.write_record): Open the DBF file for writing when necessary
5906
5907 2002-08-27 Bernhard Herzog <[email protected]>
5908
5909 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5910 dbf files only for reading by default. Use a new writable dbf
5911 object for writing.
5912
5913 2002-08-26 Bernhard Herzog <[email protected]>
5914
5915 * Thuban/UI/mainwindow.py: Refactor the context creation:
5916 (MainWindow.Context): New method to return a context
5917 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5918 new method
5919
5920 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5921 layer table specific code from TableGrid into LayerTableGrid
5922 (TableFrame, LayerTableFrame): Split the layer table specific code
5923 from TableFrame into LayerTableFrame
5924 (LayerTableGrid.select_shape): Remove a debug print
5925
5926 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5927 LayerTableFrame
5928
5929 2002-08-23 Bernhard Herzog <[email protected]>
5930
5931 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5932 absolute filename.
5933
5934 2002-08-22 Bernhard Herzog <[email protected]>
5935
5936 * Thuban/Model/table.py (Table.write_record): New method to write
5937 records.
5938 (Table.__init__): Open the DBF file for writing too.
5939
5940 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5941 into the underlying table.
5942
5943 * extensions/shapelib/shapefil.h (DBFCommit),
5944 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5945 commit any changes made to the DBF file.
5946
5947 * Thuban/UI/mainwindow.py (make_check_current_tool)
5948 (_tool_command): Put the code that generates the "checked"
5949 callback into a separate function so that we can reuse it
5950 elsewhere
5951
5952 * Thuban/Model/save.py (Saver): New class to handle serializing a
5953 session into an XML file. The main reason to introduce a class is
5954 that applications built on Thuban can derive from it so that they
5955 can save additional information in a session file.
5956 (save_session): Delegate almost all the work to the Saver class.
5957 Rename the filename argument to file because it may be a file like
5958 object now.
5959
5960 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5961 code. Remove the little test code which would be executed when the
5962 module is run as a script which didn't work anymore since it can't
5963 import the other Thuban modules.
5964 (ProcessSession, load_session): Refactor the ProcessSession to
5965 have one method for each element start and end tag so that derived
5966 classes can easily override the processing of individual tags.
5967 Also, always parse with namespaces enabled because applications
5968 built on top of Thuban will likely use namespaces if they extend
5969 the session file format.
5970
5971 2002-08-21 Bernhard Herzog <[email protected]>
5972
5973 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5974 because thubaninit_contents will do it for us.
5975
5976 2002-08-16 Jan-Oliver Wagner <[email protected]>
5977
5978 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5979 tree window already open
5980
5981 2002-08-15 Bernhard Herzog <[email protected]>
5982
5983 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5984 with self.
5985
5986 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5987 when we have actually captured it.
5988
5989 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5990 shapefile and destroy the table.
5991
5992 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5993
5994 2002-08-14 Bernhard Herzog <[email protected]>
5995
5996 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5997 instance variable columns
5998 (RecordTable.GetTypeName): row and col may be negative in some
5999 cases.
6000
6001 * setup.py (InstallLocal.initialize_options)
6002 (InstallLocal.finalize_options, InstallLocal.user_options): New
6003 option create-init-file to build a thubaninit.py when running
6004 install_local
6005 (InstallLocal.run): Create the thubaninit.py module when requested
6006 (thubaninit_contents): Split the template into several parts and
6007 create a new function thubaninit_contents that creates the
6008 contents of a thubaninit module.
6009 (ThubanInstall.run): Use the new function to create the thubaninit
6010 module.
6011
6012 2002-07-30 Bernhard Herzog <[email protected]>
6013
6014 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
6015 cleanup.
6016 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
6017
6018 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
6019 direct base class' Destroy method.
6020
6021 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
6022 layers.
6023 (Map.Destroy): Destroy the label_layer as well and call the
6024 inherited Desatroymethod first so that no more messages are
6025 issued.
6026 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
6027 message if the stacking order actually has changed. Add
6028 doc-strings.
6029 (Map.BoundingBox): Correct the doc-string.
6030 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
6031 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
6032
6033 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
6034 all labels.
6035
6036 2002-07-29 Bernhard Herzog <[email protected]>
6037
6038 * Thuban/Model/map.py (Map.subscribe_layer_channels)
6039 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
6040 to a layer's channels into separate methods.
6041 (Map.RemoveLayer, Map.AddLayer): Call the new methods
6042 (Map.Destroy): Unsubscribe from a layer's channels before
6043 destroying it.
6044
6045 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
6046 selected_layer parameter to searched_layer which is the layer to
6047 search in.
6048 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
6049 search to that layer. Return the selected layer and shape.
6050
6051 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
6052 typo
6053
6054 2002-07-24 Bernhard Herzog <[email protected]>
6055
6056 * Thuban/UI/application.py (ThubanApplication.create_session):
6057 Extend the doc string.
6058 (ThubanApplication.subscribe_session)
6059 (ThubanApplication.unsubscribe_session): New methods to
6060 subscribe/unsubscribe to/from session channels.
6061 (ThubanApplication.SetSession): Call the new methods here.
6062 (ThubanApplication.maps_changed, ThubanApplication.set_map):
6063 Renamed set_map to maps_changed. Its now a subscriber for
6064 MAPS_CHANGED.
6065
6066 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
6067 x-coordinate in case of simple clicks
6068
6069 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
6070 don't pass it as a parameter
6071
6072 * Thuban/Model/session.py (Session.RemoveMap): New
6073
6074 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
6075 window size into a parameter.
6076
6077 2002-07-23 Bernhard Herzog <[email protected]>
6078
6079 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
6080 just commands.
6081
6082 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
6083 parameter list a bit to allow setting the window title and the
6084 initial message in the status bar. Update the callers.
6085
6086 * Thuban/UI/application.py (ThubanApplication.OnInit)
6087 (ThubanApplication.CreateMainWindow): Put the mainwindow
6088 instantiation into a separate method so that it can be overridden
6089 by a subclass.
6090
6091 2002-07-19 Bernhard Herzog <[email protected]>
6092
6093 * Thuban/Model/session.py: Issue a CHANGED message every time
6094 another changed message is issued to make it easier to get
6095 notified of changes.
6096 (Session): Update the doc string
6097 (Session.forward): Issue changed-events as CHANGED as well.
6098 (Session.changed): Overwrite the inherited version to issue
6099 CHANGED events as well.
6100
6101 * Thuban/UI/tree.py: We can now simply subscribe to the session's
6102 CHANGED channel to be informed of changes.
6103 (SessionTreeCtrl.session_channels): Not needed any longer.
6104 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
6105 Only have to (un)subscribe CHANGED
6106
6107 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
6108
6109 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
6110 for the wxPython locale bug to __init__.py so that it's
6111 automatically executed by anybody using UI code from Thuban.
6112
6113 2002-07-18 Bernhard Herzog <[email protected]>
6114
6115 * Thuban/UI/main.py (main): app no longer needs to be global
6116
6117 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
6118 as parameter and store it in an instance variable
6119 (MainWindow.invoke_command, MainWindow.update_command_ui)
6120 (MainWindow.save_modified_session, MainWindow.NewSession)
6121 (MainWindow.OpenSession, MainWindow.SaveSession)
6122 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
6123 application object.
6124
6125 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
6126 the main window with self.
6127
6128 * Thuban/UI/context.py: New module with the context class
6129
6130 * Thuban/UI/command.py (Command): Update doc string.
6131
6132 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
6133 MainWindow.update_command_ui): Pass an instance of the context
6134 class to the command's methods
6135 (check_current_tool, call_method): Handle the new context
6136 implementation
6137
6138 * Examples/simple_extensions/simple_tool.py (simple_tool,
6139 check_simple_tool): Handle the new context implementation
6140
6141 * Examples/simple_extensions/simple_command.py (simple_command):
6142 Handle the new context implementation. Update the comments about
6143 the context.
6144
6145 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
6146 doc-string
6147 (ThubanApplication.Session): New method to return the session
6148 object
6149
6150 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
6151 interactor's selected_layer may not be a layer of the current
6152 session when the tree is updated while a new session is being set.
6153
6154 2002-07-17 Bernhard Herzog <[email protected]>
6155
6156 * Thuban/UI/tree.py (color_string): Removed. No longer used.
6157 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
6158 update_tree into update_tree and add_items. The tree now uses a
6159 more generic way to display the contents of the tree.
6160 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
6161
6162 * Thuban/Model/layer.py (Layer.TreeInfo),
6163 Thuban/Model/extension.py (Extension.TreeInfo),
6164 Thuban/Model/map.py (Map.TreeInfo),
6165 Thuban/Model/session.py (Session.TreeInfo):
6166 Add TreeInfo methods to implement the new tree view update scheme
6167
6168 2002-07-16 Bernhard Herzog <[email protected]>
6169
6170 * Thuban/UI/application.py: Don't use "import from" for the
6171 MainWindow. It can't always be resolved.
6172 (ThubanApplication.OnInit): change reference to MainWindow
6173 accordingly.
6174
6175 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
6176 completely
6177
6178 2002-07-10 Bernhard Herzog <[email protected]>
6179
6180 * setup.py (create_init_module): New configurable variable whose
6181 default depends on the platform we're running on.
6182 (ThubanInstall.initialize_options): Initialize
6183 self.create_init_module from the global create_init_module
6184 (ThubanInstall.user_options): indictate that the options
6185 create-init-module and init-module-dir have arguments.
6186
6187 * setup.py: In the setup call change the version number to include
6188 cvs.
6189
6190 * MANIFEST.in: Add the files in Examples
6191
6192 2002-07-09 Bernhard Herzog <[email protected]>
6193
6194 * setup.py: In the setup call, use the thuban homepage as the
6195 value of the url parameter.
6196
6197 * Examples: New subdirectory for examples.
6198
6199 * Examples/simple_extensions/simple_tool.xpm,
6200 Examples/simple_extensions/simple_tool.py,
6201 Examples/simple_extensions/simple_command.py,
6202 Examples/simple_extensions/README: Simple examples showing how to
6203 add new commands and tools.
6204
6205 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
6206 bdist_rpm that we also have an install script.
6207 (bdist_inno): Add 2002 to the copyright notice.
6208
6209 * setup.py: Create a file in python's site-packages directory to
6210 make installation of Thuban as a library easier.
6211 (ThubanInstall.user_options): Add two new options,
6212 create-init-module and init-module-dir
6213 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
6214 filenames for installation in the default directories.
6215 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
6216 the inherited methods to capture some filenames before they're
6217 transformed too much by distutils.
6218 (ThubanInstall.run): Create the init module if requested.
6219 (ThubanInstall.thuban_init_filename): New method to return the
6220 full name of the init module.
6221 (ThubanInstall.get_outputs): Append the filename of the init
6222 module.
6223
6224 2002-07-08 Bernhard Herzog <[email protected]>
6225
6226 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
6227 handle the prefix properly which means that the default for the
6228 installation prefix should be /usr for RPMs and /usr/local when
6229 doing a normal source install.
6230 (bdist_rpm_install_script): Script to override the default install
6231 commands in the specfile generated by the bdist_rpm command.
6232 (thuban_bdist_rpm.user_options): Add a prefix option
6233 (thuban_bdist_rpm.initialize_options): Init the prefix option.
6234 Create the script files for the spec files as empty files here
6235 (thuban_bdist_rpm._make_spec_file): Override the inherited method
6236 to fill the script files with content.
6237
6238 * Thuban/Model/save.py (relative_filename): Wrapper around
6239 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
6240 argument. save_session now automatically uses this version,
6241 solving a problem when saving to a relative filename.
6242
6243 * setup.py: In the setup call, make sure that the library
6244 directories are under $prefix/lib not directly under $prefix.
6245
6246 2002-06-20 Jan-Oliver Wagner <[email protected]>
6247
6248 * Thuban/Model/extension.py: new module to handle extension objects.
6249 * Thuban/Model/messages.py: new messages for extensions.
6250 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
6251 Session.AddExtension): new for handling extensions.
6252 Also some other minor changes to round up extension handling.
6253 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
6254 of Extension titles and title and names of its objects.
6255
6256 2002-05-29 Bernhard Herzog <[email protected]>
6257
6258 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
6259 the events for a command.
6260 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
6261 Call bind_command_events to bind the events. add_toolbar_command
6262 can now bind events too so that it's possible to have commands
6263 that are only available through the toolbar.
6264 (MainWindow.init_ids): New instance variable events_bound to keep
6265 track of for which commands events have been bound.
6266
6267 2002-05-28 Bernhard Herzog <[email protected]>
6268
6269 * Thuban/UI/menu.py: New module to build and manage menus.
6270
6271 * Thuban/UI/mainwindow.py: Remove some unused imports.
6272 (MainWindow.__init__, main_menu): move the definition of the main
6273 menu from __init__ to the Menu instance main_menu.
6274 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
6275 build the menu bar and sub-menus from a menu description.
6276
6277 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
6278 startup file
6279 (ThubanApplication.read_startup_files): New method to run
6280 ~/.thuban/thubanstart.py
6281
6282 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
6283 Move the toolbar definition to the Menu instance main_toolbar.
6284 (MainWindow.build_toolbar): New method to build the toolbar
6285 similar to the build_menu methods
6286
6287 2002-05-23 Bernhard Herzog <[email protected]>
6288
6289 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
6290 layer_outline_color. Fix it in the definition of the command too.
6291
6292 * Thuban/UI/command.py (Command): Fix typo in doc string
6293
6294 2002-05-22 Bernhard Herzog <[email protected]>
6295
6296 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
6297 in the docstring
6298
6299 2002-05-15 Bernhard Herzog <[email protected]>
6300
6301 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
6302 when the shapefile is empty.
6303 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
6304 now return None for empty shapefiles. Update doc-strings.
6305
6306 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
6307 the layer's bbox being None.
6308
6309 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
6310 layer's bbox being None.
6311
6312 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
6313 necessary.
6314 (MapCanvas.__init__): New instance variables, last_selected_layer
6315 and last_selected_shape to determine how the selection has
6316 changed.
6317
6318 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
6319 AutoSizeColumns because it will cause a traversal of the entire
6320 table which for large .dbf files will take a very long time.
6321
6322 2002-05-14 Bernhard Herzog <[email protected]>
6323
6324 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
6325 maximum depth for the tree than shapelib does by default.
6326
6327 2002-05-10 Bernhard Herzog <[email protected]>
6328
6329 * setup.py (py_modules): The shptree modules doesn't have a
6330 wrapper, so don't include it in the py_modules
6331
6332 2002-05-08 Bernhard Herzog <[email protected]>
6333
6334 * extensions/shapelib/shptree.c (compare_ints): Make arguments
6335 const void * as in the qsort prototype
6336 (SHPTreeFindLikelyShapes): Remove some unused variables.
6337
6338 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
6339 maintains to redraw the window during a drag.
6340 (MapCanvas.unprojected_rect_around_point): New method to determine
6341 a small region around a point for hit-testing.
6342 (MapCanvas.find_shape_at): Only test the shapes in a small region
6343 around the point.
6344
6345 * setup.py: Increment the version to 0.1.2
6346
6347 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
6348 debug print and set session to None after unsubscribing
6349
6350 2002-05-07 Bernhard Herzog <[email protected]>
6351
6352 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
6353 the file to have a .thuban extension.
6354
6355 * Thuban/UI/tree.py (session_channels): New class constant with
6356 all the session channels to subscribe to to update the tree
6357 (SessionTreeCtrl.session_changed): Remember the session so that we
6358 can unsubscribe properly. Use the new class constant to
6359 unsubscribe from the old session and subscribe to the new one.
6360 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
6361 subscriptions of the SessionTreeCtrl.
6362 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
6363
6364 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
6365 Session Tree" command to the file menu.
6366
6367 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
6368 as update_region to the renderer.
6369
6370 * Thuban/UI/renderer.py
6371 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
6372 update box is now directly a tuple, not a wxRect anymore.
6373
6374 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
6375 prints.
6376
6377 2002-05-07 Bernhard Herzog <[email protected]>
6378
6379 * setup.py: Add the shptree extension module. See
6380 extensions/pyshapelib/ChangeLog for more details.
6381
6382 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
6383 extensions/shapelib/dbfopen.c: Really update to the versions of
6384 shapelib 1.2.9. For some reason it wasn't really done on
6385 2002-04-11.
6386
6387 * extensions/shapelib/shptree.c: Modified version of shptree.c of
6388 shapelib 1.2.9. The only real difference is the use of qsort
6389 instead of a bubble sort implementation
6390
6391 * Thuban/Model/layer.py (Layer.__init__): New instance variable
6392 shapetree to hold the shapelib quadtree for the shapefile
6393 (Layer.open_shapefile): Create the quad tree.
6394 (Layer.ShapesInRegion): New method to return the ids of shapes in
6395 a given region using the quad tree.
6396
6397 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
6398 comment
6399 (draw_polygon_shape): Accept both arcs and polygons.
6400 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
6401 the api.
6402
6403 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
6404 return the shape ids to be rendered in a given layer.
6405 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
6406 ids. Use draw_polygon_shape to draw arc shapes as well.
6407 (ScreenRenderer.RenderMap): New parameter for the rectangle that
6408 has to be updated
6409 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
6410 calling it's ShapesInRegion method.
6411
6412 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6413 update_region for the update region.
6414 (MapCanvas.OnPaint): Maintain the update region
6415 (MapCanvas.do_redraw): Pass the bounding box of the update_region
6416 to the renderer when drawing the bitmap. Reset the update_region.
6417
6418 2002-05-03 Bernhard Herzog <[email protected]>
6419
6420 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
6421 MainWindow.OpenSession): Change the file extension of the session
6422 files to .thuban
6423
6424 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
6425 Move the map channels to be forwarded by the session into the
6426 class constant with forwarded_channels. Also add
6427 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
6428 forwarded_channels
6429
6430 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
6431 typo and some rewording).
6432
6433 2002-05-02 Bernhard Herzog <[email protected]>
6434
6435 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
6436 around to speed up most redraws:
6437 (MapCanvas.__init__): New instance variable bitmap which holds the
6438 bitmap
6439 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
6440 self.bitmap to draw.
6441 (MapCanvas.full_redraw): New method to force a full redraw
6442 including the bitmap
6443 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
6444 make sure the bitmap is redrawn.
6445 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
6446 MapCanvas.shape_selected): Call full_redraw instead of readraw to
6447 make sure the bitmap is redrawn.
6448 (MapCanvas.OnSize): New method to handle size events so that the
6449 bitmap can be redrawn.
6450
6451 2002-04-29 Bernhard Herzog <[email protected]>
6452
6453 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
6454 canvas' VIEW_POSITION event
6455 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
6456 Update the text in the status-bar accordingly.
6457
6458 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
6459 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
6460 called.
6461 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
6462 current_position
6463 (MapCanvas.set_current_position): New method to set
6464 current_position. Issue a VIEW_POSITION event
6465 (MapCanvas.CurrentPosition): New public method to return the value
6466 of current_position. Should be called when the VIEW_POSITION event
6467 is processed.
6468 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
6469 Update the position.
6470 (MapCanvas.OnLeaveWindow): Set the position to None.
6471
6472 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
6473 position in the statusbar
6474
6475 2002-04-26 Frank Koormann <[email protected]>
6476
6477 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
6478
6479 2002-04-24 Frank Koormann <[email protected]>
6480
6481 * Resources/Bitmaps/identify.xpm: shadow added
6482
6483 * Resources/Bitmaps/fullextent.xpm: new
6484
6485 2002-04-22 Jan-Oliver Wagner <[email protected]>
6486
6487 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
6488 box
6489
6490 2002-04-21 Jan-Oliver Wagner <[email protected]>
6491
6492 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
6493
6494 * Thuban/UI/tree.py (update_tree): added added map extent
6495
6496 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
6497 icon; added map_full_extend as tool
6498
6499 2002-04-19 Jan-Oliver Wagner <[email protected]>
6500
6501 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
6502 saving _new_ sessions
6503
6504 * Thuban/Model/session.py (create_empty_session): new session
6505 don't have a filename (set to None)
6506
6507 * Thuban/UI/tree.py (update_tree): added filename and modified flag
6508
6509 * Thuban/Model/load.py (ProcessSession): convert projection
6510 parameters from unicode to regular string
6511
6512 * Data/iceland_sample.session: Added UTM Zone 26 projection.
6513
6514 2002-04-11 Bernhard Herzog <[email protected]>
6515
6516 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
6517 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
6518 1.2.9
6519
6520 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
6521 the pyshapelib directoy into the list of include dirs, so that
6522 pyshapelib_api.h can be found.
6523
6524 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
6525 holds the pyshapelib C-API
6526 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
6527 pyshapelib_api to access the shapelib functions.
6528 (initwxproj): Import the c_api from the shapelib module and
6529 initialize pyshapelib_api.
6530
6531 2002-04-04 Bernhard Herzog <[email protected]>
6532
6533 * setup.py (thuban_bdist_rpm.initialize_options): Use
6534 initialize_options to create the scripts for the rpm.
6535
6536 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
6537
6538 2002-04-03 Bernhard Herzog <[email protected]>
6539
6540 * setup.py: Increment version to 0.1.1
6541
6542 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
6543 Layer" and "Remove Layer" commands from the layer menu to the map
6544 menu
6545
6546 2002-02-15 Bernhard Herzog <[email protected]>
6547
6548 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
6549 argument (python <= 1.5.2 erroneously accepted multiuple
6550 arguments)
6551
6552 2002-02-04 Bernhard Herzog <[email protected]>
6553
6554 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
6555 RecordGrid in the identifyview.
6556 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
6557 IdentifyListCtrl. The grid allows editing of the values.
6558
6559 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
6560 implementing a grid for a single row of a thuban table.
6561
6562 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
6563 layers by default. Easier to use than the previous default of only
6564 searching through the select layer which meant that if no layer
6565 was selected, you couldn't select a shape.
6566
6567 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
6568
6569 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
6570 stroke_width attribute
6571
6572 * Thuban/Model/save.py (save_session): Write the new stroke_width
6573 attribute
6574
6575 * Thuban/Model/load.py (ProcessSession.startElement): Read the
6576 stroke_width attribute
6577
6578 * Thuban/Model/layer.py (Layer.__init__): New parameter and
6579 instance variable stroke_width
6580 (Layer.SetStrokeWidth): Set the stroke_width.
6581
6582 2002-02-01 Bernhard Herzog <[email protected]>
6583
6584 * extensions/thuban/wxproj.cpp (project_points): Fix two
6585 off-by-one errors in the last loop that joins the various parts
6586 together.
6587
6588 2002-01-14 Bernhard Herzog <[email protected]>
6589
6590 * setup.py (data_dist.make_distribution): Fix some typos
6591
6592 2001-09-18 Bernhard Herzog <[email protected]>
6593
6594 * README: Slight tweaking in preparation for the 0.1 release
6595
6596 * setup.cfg: Add section for sdist to create both tgz and zip
6597 archives
6598
6599 * setup.py: increase version number to 0.1
6600 (data_dist): New command class for data distribution
6601
6602 2001-09-14 Bernhard Herzog <[email protected]>
6603
6604 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
6605 Handle the case of no layer (i.e. layer is None) properly.
6606
6607 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
6608 Set the initial selection of the combo boxes to reflect the
6609 projection we're starting with in a way that works on windows,
6610 too.
6611
6612 * Thuban/Lib/connector.py (Connector.print_connections): Print the
6613 puiblisher's ids in hex to make it easier to compare them to the
6614 standard repr of python methods
6615
6616 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
6617 messages
6618
6619 2001-09-13 Bernhard Herzog <[email protected]>
6620
6621 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
6622 deselect the layer if no layer is selected
6623
6624 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
6625 idle time when there actually is something to draw. If there's
6626 nothing to draw simply clear the window
6627 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
6628 (MapCanvas.SetMap): force a redraw in all cases because
6629 FitMapToWindow doesn't always do it.
6630 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
6631 specify the point to move into the center of the window
6632 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
6633 dragged, zoon in/out by a factor of 2
6634 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
6635 index, i.e. reversed drawing order) so that objects appearing to
6636 be in from of others are selected first. This is probably mostly
6637 relevant for point shapes where the symbols used may overlap
6638
6639 * Thuban/Model/session.py (create_empty_session): Unset the
6640 modified bit before returning it
6641
6642 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
6643 create_empty_session session to create the new, empty session.
6644
6645 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
6646 the tool bitmaps.
6647 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
6648 the code that asks whether the session should be saved into the
6649 new method save_modified_session.
6650 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
6651 method to save modified session here too.
6652
6653 2001-09-11 Bernhard Herzog <[email protected]>
6654
6655 * setup.py (InnoIconItem): fix typo
6656
6657 (thuban_bdist_inno.run):
6658 (bdist_inno.run): Move the decision not to create symlinks on
6659 non-nt platforms to thuban_bdist_inno and do it unconditinally
6660 since we never want to create the symlinks here
6661
6662 2001-09-10 Bernhard Herzog <[email protected]>
6663
6664 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
6665 identify view immediately
6666
6667 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
6668 and SelectableRecordListCtrl that implement the code shared by the
6669 identify view and the label dialog
6670
6671 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
6672 new class RecordListCtrl
6673
6674 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
6675 return value of GetValue is None instead of using it as a boolean
6676 directly so that Zero numbers are handled properly.
6677 (LabelListCtrl): Derive from the new class
6678 SelectableRecordListCtrl
6679
6680 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
6681 (Proj4Dialog.dialogLayout): Make the window resizable and set the
6682 size of the text control explicitly to make the sizers work on
6683 both Windows and X.
6684
6685 2001-09-07 Bernhard Herzog <[email protected]>
6686
6687 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
6688 that can limit the search to the currently selected layer.
6689 (MapCanvas.SelectShapeAt): Make sure that the currently selected
6690 layer stays selected even when no shape is found
6691 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
6692 height do nothing (avoids zero division errors)
6693
6694 2001-09-06 Bernhard Herzog <[email protected]>
6695
6696 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
6697 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
6698 convenient :-)
6699 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
6700 a new instvar layer_to_item to map layers to tree items
6701 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
6702 to match the current selection in the interactor
6703
6704 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
6705 (Interactor.HasSelectedLayer): New methods to query the current
6706 selection
6707
6708 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
6709 (MainWindow.has_selected_layer): Simply call the appropriate
6710 interactor method
6711
6712 * Thuban/UI/mainwindow.py (MainWindow.__init__):
6713 (MainWindow.LayerShowTable):
6714 (MainWindow.identify_view_on_demand): Store the interactor in an
6715 instvar and use that reference instead of going through main.app
6716
6717 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
6718 * Thuban/UI/application.py (ThubanApplication.OnInit):
6719 * Thuban/UI/main.py (main): Create the session tree view in main
6720 with the new mainwindow method ShowSessionTree and not directly
6721 the application's OnInit method
6722
6723 * Thuban/UI/tree.py (myTreeCtrlPanel):
6724 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
6725 TreeCtrl isntead of a panel. This affects most method since we now
6726 refer to self instead of self.tree
6727 (SessionTreeView): New class implementing a non-modal dialog
6728 showing the session tree.
6729
6730 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
6731 layer to the tableview dialog.
6732
6733 * Thuban/UI/tableview.py: Add some doc-strings
6734 (TableGrid):
6735 (TableGrid.OnRangeSelect):
6736 (TableGrid.OnSelectCell):
6737 (TableFrame.__init__):
6738 (TableFrame.row_selected):
6739 Selecting rows in the grid view now updates the selected shapes
6740 through the TableFrame. To achieve this we derive TableGrid from
6741 Publisher and introduce the message type ROW_SELECTED which the
6742 TableFrame subscribes to and which is issued by OnRangeSelect and
6743 OnSelectCell
6744
6745 (DataTable.SelectRow): Removed because it's no longer needed in
6746 the row/shape selection scheme
6747
6748 * Thuban/UI/dialogs.py: New file implementing common classes for
6749 dialogs
6750
6751 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
6752 the SELECTED_SHAPE message anymore. This is now handled by the
6753 parent.
6754 (TableGrid.select_shape): Only update the selection if the shape
6755 is not None.
6756 (TableFrame): Inherit from the new NonModalDialog class.
6757 (TableFrame.__init__, TableFrame.select_shape): Handle the
6758 SELECT_SHAPE message.
6759 (TableFrame.OnClose): Extend the inherited method to unsubscribe
6760 SELECT_SHAPE
6761
6762 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
6763 (MainWindow.add_dialog):
6764 (MainWindow.dialog_open):
6765 (MainWindow.remove_dialog):
6766 (MainWindow.get_open_dialog): New methods to maintain a dictionary
6767 of opened non-modal dialogs.
6768
6769 (MainWindow.__init__): Initialize the new non-modal dictionary
6770 management code
6771 (MainWindow.LayerShowTable): maintain separate dialogs for each
6772 table using the non-modal dialog management code to only open a
6773 view once for each table.
6774
6775 (MainWindow.IdentifyTool):
6776 (MainWindow.__init__):
6777 (MainWindow.identify_view_on_demand): Don't open the identify view
6778 in IdentifyTool anymore. This will be done automatically by the
6779 new method identify_view_on_demand which handles the
6780 SELECTED_SHAPE message so that the identify view will be opened on
6781 demand
6782
6783 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
6784 the interactor argument. The SELECTED_SHAPE message is now handled
6785 by the parent.
6786 (IdentifyView.__init__): Add the interactor argument so that we
6787 can handle the SELECTED_SHAPE message here
6788 (IdentifyView.selected_shape): New method to handle the
6789 SELECTED_SHAPE messages
6790
6791 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
6792 NonModalDialog class
6793 (IdentifyView.OnClose): Extend the inherited version to
6794 unsubscribe SELECT_SHAPE
6795
6796 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
6797
6798 2001-09-05 Bernhard Herzog <[email protected]>
6799
6800 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6801
6802 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6803 interactor to pass through to the MapCanvas
6804
6805 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6806 argument to the MainWindow constructor to get rid of the ugly hack
6807 that made main.app available early just so that the mapcanvas
6808 could access the interactor object.
6809
6810 2001-09-04 Bernhard Herzog <[email protected]>
6811
6812 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
6813 that runs a modal message box
6814 (MainWindow.OnClose): Use the new method
6815 (MainWindow.RemoveLayer): Just do nothing in case no layer is
6816 selected. The command should be grayed out anyway, so there's no
6817 need to pop up a message box.
6818 (MainWindow.AddLayer): Pop up a message box with an error message
6819 if the shape file can't be opened
6820
6821 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
6822 immediately. This will cause an exception in case the file can't
6823 be opened and we can display an appropriate message.
6824
6825 * MANIFEST.in: Add extensions/pyprojection/LICENSE
6826
6827 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
6828 specific bdist_rpm command.
6829
6830 * Thuban/UI/main.py: Catch ImportError exceptions when importing
6831 the locale module because it may not be available on some
6832 installations.
6833
6834 * extensions/pyprojection/LICENSE: Copy of the license text in
6835 Projection.i. Having it in a separate file makes it easier to
6836 refer to license text in e.g. RPMs
6837
6838 2001-09-03 Bernhard Herzog <[email protected]>
6839
6840 * setup.py: use wx-config instead of wxgtk-config because it's
6841 more generic
6842
6843 * setup.py (ThubanInstall.get_outputs): Add the symlink in
6844 <prefix>/bin to the outputs
6845 (ThubanInstall.link_file): New method to link files. We need this
6846 because the standard copy_files refuses to link non-existing
6847 files.
6848 (ThubanInstall.run): Remove the leading install root from the
6849 script filename if an install root was specified and use the new
6850 link_file method
6851
6852 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6853 the window when the first layer is added to the map.
6854
6855 * setup.py (ThubanInstall.run): Honor the build root (self.root)
6856 when linking thuban.py to <prefix>/bin
6857
6858 2001-08-31 Bernhard Herzog <[email protected]>
6859
6860 * setup.py: In the setup call, the install parameters shouldn't
6861 have trailing slashes because distutils on non-posix platforms
6862 doesn't like that. The same applies to other directories like
6863 "Resources/Bitmaps"
6864
6865 In the configuration section for nt, move the wxWindows directory
6866 optins into the part clearly marked as editable.
6867
6868 (InstallLocal.initialize_options):
6869 (InstallLocal.user_options): remove the currently unused debug
6870 flag
6871 (thuban_build_py.find_all_modules): Add this method so that it
6872 works for our case of having packages and modules in one
6873 distribution as well.
6874 (ThubanInstall.initialize_options):
6875 (ThubanInstall.finalize_options):
6876 (ThubanInstall.user_options):
6877 (ThubanInstall.boolean_options): Add new options, do-symlink and
6878 extra files. Since these are the first ThubanInstall specific
6879 options, override user_options and boolean_options
6880 (ThubanInstall.run): Honor the new do-symlink and extra-files
6881 options.
6882 (ThubanInstall.get_outputs): Add to override the base-class's
6883 version and add the extra-files to the outputs
6884 (bdist_inno): New class for windows distributions with Inno Setup
6885 (InnoIconItem): Helper class for bdist_inno
6886 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6887 this together with the appropriate parameters, to the setup call.
6888
6889 * setup.cfg (bdist_inno): added new section for the inno setup
6890 installer
6891
6892 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
6893 changing_selection to avoid recursive selection events when
6894 modifying the selection in response to a selection event.
6895 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
6896 changing the tree's selection.
6897 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
6898 we're not being called indirectly from normalize_selection.
6899
6900 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
6901 event.Check only if the command is actuall checkable.
6902 (MainWindow.__init__): Call the toolbar's Realize method to make
6903 sure that the items are actually shown
6904
6905 2001-08-28 Bernhard Herzog <[email protected]>
6906
6907 * setup.py: Fix some doc strings
6908
6909 * ChangeLog: started
6910

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26