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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2005 - (hide annotations)
Tue Dec 2 13:26:13 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 337313 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26