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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1859 - (show annotations)
Fri Oct 24 15:13:40 2003 UTC (21 years, 4 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 308019 byte(s)
improved panel for unknown projections

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26