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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1965 - (hide annotations)
Wed Nov 19 19:48:59 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 330626 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26