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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26