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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1745 - (show annotations)
Tue Sep 23 15:37:45 2003 UTC (21 years, 5 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 286578 byte(s)
extended Thuban manual

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26