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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.184  
changed lines
  Added in v.1965

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26