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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1783 - (show annotations)
Mon Oct 6 17:32:31 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 291227 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26