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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1803 - (show annotations)
Thu Oct 9 15:19:23 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 294974 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26