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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1939 - (hide annotations)
Tue Nov 11 18:17:09 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 325690 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26