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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1865 - (show annotations)
Fri Oct 24 17:26:04 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 308639 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26