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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1716 - (show annotations)
Fri Sep 12 08:33:23 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 283764 byte(s)
a bugfix in examples

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26