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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1929 - (hide annotations)
Mon Nov 10 16:57:54 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 322523 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26