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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26