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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1743 - (show annotations)
Tue Sep 23 12:27:31 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 286360 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26