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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1707 - (show annotations)
Wed Sep 3 08:31:50 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 283047 byte(s)
Fix/workaround for bug #2019:
https://intevation.de/rt/webrt?serial_num=2019

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26