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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1651 - (show annotations)
Mon Aug 25 15:05:56 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 269420 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26