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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1807 - (show annotations)
Fri Oct 10 10:36:43 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 295636 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26