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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1796 - (show annotations)
Wed Oct 8 17:36:00 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 294012 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26