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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1954 - (hide annotations)
Tue Nov 18 13:19:19 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 328652 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26