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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1925 - (show annotations)
Fri Nov 7 12:07:38 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 321300 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26