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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1799 - (show annotations)
Thu Oct 9 10:17:59 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 294339 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26