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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1922 - (show annotations)
Mon Nov 3 18:42:35 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 320424 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26