/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Diff of /branches/greater-ms3/thuban/ChangeLog

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

trunk/thuban/ChangeLog revision 803 by jonathan, Wed Apr 30 17:07:01 2003 UTC branches/greater-ms3/thuban/ChangeLog revision 1414 by frank, Mon Jul 14 10:19:25 2003 UTC
# Line 1  Line 1 
1    2003-07-14  Frank Koormann   <[email protected]>
2    
3            Backport from HEAD
4    
5            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
7    
8            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
9            unicode strings from session file: session title, map title,
10            layer title and projection name.
11            
12    
13    2003-07-08  Bernhard Herzog  <[email protected]>
14    
15            Backport from HEAD
16    
17            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
18            constants in the column objects are the standard ones defined in
19            the table module.
20    
21            * test/test_transientdb.py
22            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
23            exporting transient tables as DBF works. This should catch the bug
24            just fixed in TransientTableBase.Width.
25    
26    2003-07-04  Bernhard Herzog  <[email protected]>
27    
28            Backport from HEAD
29    
30            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
31            function for table_to_dbf
32            (table_to_dbf): Deal with names longer than the 10 character limit
33    
34            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
35            doc-string
36            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
37            long column names
38    
39    2003-07-03  Bernhard Herzog  <[email protected]>
40    
41            Backport from HEAD
42    
43            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
44            Update doc-string
45            (TransientJoinedTable.create): Do not modify the column objects of
46            the input tables in place and copy all columns of the input tables
47            into the joined table after all.
48    
49            * test/test_transientdb.py
50            (TestTransientTable.test_transient_joined_table_same_column_name):
51            Update to reflect the new behavior
52            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
53            Update to reflect the new behavior
54            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
55            New test case for a bug which modified the column objects in place
56    
57    2003-07-01  Frank Koormann   <[email protected]>
58    
59            Partly backport from HEAD
60    
61            * test/test_transientdb.py
62            (TestTransientTable.test_transient_joined_table_same_column_name):
63            New. Test whether joining on columns with the same names in both
64            tables works.
65            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
66            New. Test join of two tables with partly equal column names.
67    
68            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
69            sure to use the right internal names even when joining on field
70            with the same names in both tables. Also, detect duplicate names
71            in the joined table correctly.
72            If duplicates are found, append '_' (underscores) to the name
73            until it is unique.
74            Create always new internal names for the resulting table and reference
75            columns in the join statement with <table>.<column>
76    
77    2003-07-01  Frank Koormann   <[email protected]>
78    
79            Backport from HEAD
80    
81            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
82            Reverse List of layers to render in same order as in desktop legend.
83    
84    2003-06-25  Jonathan Coles   <[email protected]>
85    
86            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
87            of the SelectPropertiesDialog should be self so the window
88            appears on top.
89            (ClassGroupPropertiesCtrl.DoEdit): The parent
90            of the SelectPropertiesDialog should be self so the window
91            appears on top.
92    
93    2003-06-18  Frank Koormann  <[email protected]>
94    
95            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
96            scale if projection is latlong to get better estimate.
97    
98    2003-06-17  Jonathan Coles   <[email protected]>
99                                                                                    
100            Backport from HEAD.
101    
102            The view should respond to layer projection
103            changed events to update the display. Changes to a projection
104            should not cause the map to be set to full extent.
105    
106            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
107            current_map_proj to remember the current map projection so that
108            when the projection changes we know what the previous projection
109            was.
110            (MapCanvas.SetMap): Unsubscribe and subscribe to
111            LAYER_PROJECTION_CHANGED events.
112            (MapCanvas.projection_changed): Split into two methods that respond
113            to map and layer projection changes.
114            (MapCanvas.map_projection_changed): New. Takes the current view and
115            projects it using the new projection. This does not cause the
116            map to be redrawn at full extent.
117            (MapCanvas.layer_projection_changed): New. Cause a redraw which
118            will draw each layer in its new projection.
119    
120    2003-06-16  Frank Koormann  <[email protected]>
121    
122            Fix problem of hidden properties dialog under windows after double
123            click on layer tree:
124            The tree control always gets an Expanded / Collapsed event after
125            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
126            raises the already displayed window.
127    
128            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
129            raiseProperties initialized to prevent endless loops
130            (LegendTree._OnItemActivated): Depending on self.raiseProperties
131            simply raise the properties or open the dialog and issue a second
132            event.
133    
134    2003-06-16  Frank Koormann  <[email protected]>
135    
136            * Thuban/UI/view.py (MapCanvas.set_view_transform): Set max_scale to
137            2147483648.0 / max_len (which is sufficient for GREAT-ER).
138            For HEAD in the future a more flexible concept has to be developed
139            determining the rendering of "large" objects.
140    
141    2003-06-16  Jonathan Coles   <[email protected]>
142    
143            Backport from HEAD.
144    
145        Fix a problem under Windows whereby if the user double-clicks on a
146        layer in the legend that tree item will expand or collapse as well
147        as open the layer properties dialog. The state of the tree item
148        should not be affected.
149    
150        * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
151        preventExpandCollapse and subscribe to expanding and collapsing
152        events.
153        (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
154        collapsing events and will veto the event if it has been triggered
155        by the user double clicking on a layer.
156        (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
157        that an expanding/collapsing event should be vetoed.
158            
159    2003-06-13  Bernhard Herzog  <[email protected]>
160    
161            Backport from HEAD.
162    
163            * Thuban/UI/classifier.py (Classifier.map_layers_removed)
164            (Classifier.layer_shapestore_replaced, Classifier.OnClose):
165            Unsubscribe the messages in OnClose and not in map_layers_removed
166            or layer_shapestore_replaced to make sure it always happens when
167            the dialog is closed.
168    
169    2003-06-13  Jonathan Coles   <[email protected]>
170    
171            [NOTE: This is a back-port from the current CVS head]
172    
173            This puts back a fix for Windows where a panel is needed so that
174            the background of the table view appears correctly.
175    
176            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
177            object that can be used by derived classes to place any
178            controls (including the grid) onto.
179            (QueryTableFrame.__init__): Use the panel as the parent window
180            for all the controls. Reparent the grid so that the panel is
181            the parent. Call UpdateStatusText() to correctly initialize
182            the status bar.
183    
184            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
185            from wxFrame (as opposed to wxDialog like the other classes)
186            but otherwise behaves like the other classes. This is needed
187            for the TableView which isn't really a dialog and needs to
188            have a status bar and control buttons.
189    
190            [NOTE: This is a back-port from the current CVS head]
191    
192            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
193            instance variable to keep track of how many rows are selected.
194            Subscribe once to the the events we are interested in.
195            (ThubanGrid.OnRangeSelect): Only handle event if event handling
196            hasn't been turned off.
197            (ThubanGrid.OnSelectCell): Only handle event if event handling
198            hasn't been turned off.
199            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
200            as an event listener (which changes the event handler stack)
201            simply set an instance variable to False. This is checked in
202            the event handlers.
203            (ThubanGrid.GetNumberSelected): Return the number of currently
204            selected rows.
205            (TableFrame): Inherit from ThubanFrame so we can have a
206            status bar and control buttons.
207            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
208            Explicitly set which items are selected in the operator choice and
209            action choice so there is always a valid selection. Fixes RTbug #1941.
210            Subscribe to grid cell selection events so we can update the
211            status bar.
212            (QueryTableFrame.UpdateStatusText): Update the status bar with
213            how many rows are in the grid, how many columns, and how many
214            rows are selected.
215            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
216            Call UpdateStatusText when cells are (de)selected.
217            (QueryTableFrame.OnQuery): Use the string value in the value
218            combo if either the selected item index is 0 or if the string
219            cannot be found in the predefined list (this happens if the
220            user changes the text). Fixes RTbug #1940.
221            Only turn off the grid event listeners if there a query comes
222            back with a none empty list of ids. in the case that the list
223            is empty this causes a grid.ClearSelection() call to actually
224            clear the grid selection which causes the selected items in
225            the map to be deselected. Fixes RTbug #1939.
226    
227    2003-06-13  Bernhard Herzog  <[email protected]>
228    
229            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
230            self.selected_shape with the current selection to make sure the
231            contents of the dialog are up to date when it's shown for the
232            first time.
233            The dialog used to work without this by luck. The recent fix to
234            the connector module 'broke' a 'feature' the identify view was
235            relying on, i.e that subscribing to a message in response to
236            receiving a message of that type would mean that the new
237            subscriber would also be called for the same message.
238    
239    2003-06-12  Jonathan Coles   <[email protected]>
240    
241            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
242            the scalebar if the current map has no projection set.
243    
244            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
245            projfilepath label to just the basename of the projection file
246            rather than include the entire path.
247    
248    2003-06-11  Frank Koormann  <[email protected]>
249    
250            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
251            update.
252    
253    2003-06-11  Frank Koormann  <[email protected]>
254    
255            * Thuban/Lib/fileutil.py (get_application_dir): New function to
256            determine the absolute .thuban/thuban directory under
257            "posix" (os.expanduser) and "nt" (read AppData registry key).
258    
259            * Thuban/Model/resource.py: Use get_application_dir
260    
261            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
262            Use get_application_dir.
263    
264    2003-06-10  Bernhard Herzog  <[email protected]>
265    
266            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
267            the messages MAP_LAYERS_REMOVED messages
268            (LayerTableFrame.OnClose): Unsubscribe from it.
269            (LayerTableFrame.map_layers_removed): New. Receiver for
270            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
271            dialog is showing is removed.
272    
273    2003-06-10  Bernhard Herzog  <[email protected]>
274    
275            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
276            of the receivers list so that unsubscribing in a receiver doesn't
277            modify it while iterating over it.
278    
279            * test/test_connector.py
280            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
281            unsubscribing in a receiver works correctly. See docstring for
282            details
283    
284    2003-06-10  Bernhard Herzog  <[email protected]>
285    
286            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
287            message.
288    
289            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
290            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
291            LAYER_CHANGED will still be sent if the classification changes.
292    
293            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
294            parameter so we can subscribe to some of its messages
295            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
296            and the layer's LAYER_SHAPESTORE_REPLACED
297            (Classifier.unsubscribe_messages): New. Unsubscribe from message
298            subscribed to in __init__
299            (Classifier.map_layers_removed)
300            (Classifier.layer_shapestore_replaced): receivers for the messages
301            subscribed to in __init__. Unsubscribe and close the dialog
302    
303            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
304            the map to the Classifier dialog
305    
306            * test/test_layer.py (SetShapeStoreTests): Derive from
307            SubscriberMixin as well so we can test messages
308            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
309            messages
310            (SetShapeStoreTests.tearDown): Clear the messages again
311            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
312            for the modified flag too
313            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
314            to check whether SetShapeStore sets the modified flag
315            (SetShapeStoreTests.test_set_shape_store_different_field_name)
316            (SetShapeStoreTests.test_set_shape_store_same_field)
317            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
318            Add tests for the messages. This checks both the new
319            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
320    
321    2003-06-06  Jan-Oliver Wagner <[email protected]>
322    
323            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
324            the menu items.
325    
326    2003-06-05  Frank Koormann  <[email protected]>
327    
328            * Thuban/UI/identifyview.py (IdentifyView.__init__):
329            Layout reimplemented without panel. Make life easier to fit the list
330            in the dialog.
331    
332    2003-06-05  Frank Koormann  <[email protected]>
333    
334            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
335            once on initialisation (Former implementation resulted in multiple
336            entries for each projection).
337            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
338            if set, select the projection found under the specified name. This
339            overwrites any other selection estimate.
340            Removed projchoice filling from this method.
341            (ProjFrame._OnSave, ProjFrame._OnAddToList):
342            Updated call of ProjFrame.__FillAvailList
343            (LCCPanel._DoLayout): Moved parameter controls in more common order.
344    
345            * Resources/Projections/defaults.proj: Extended defaults representing
346            various common European projections.
347    
348    2003-06-05  Frank Koormann  <[email protected]>
349    
350            * Thuban/UI/identifyview.py (IdentifyView.__init__):
351            Use ListCtrl instead of GridCtrl
352    
353            * Thuban/Model/resource.py:
354            Guess location of .thuban directory from tempdir parent directory.
355    
356            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
357            Guess location of .thuban directory from tempdir parent directory.
358    
359    2003-06-04  Bernhard Herzog  <[email protected]>
360    
361            Do not cache the values returned by the tree widget's
362            GetFirstChild and GetNextChild methods because it led to lots of
363            segfaults. The new way requires more brute force but is more
364            reliable.
365    
366            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
367            variable layer2id
368            (LegendTree.find_layer): New method to do with brute force what
369            layer2id tried to accomplish
370            (LegendTree._OnMsgLayerChanged)
371            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
372            Use find_layer instead of layer2id
373            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
374            update layer2id anymore
375            (LegendTree._OnMsgMapLayersRemoved)
376            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
377    
378    2003-06-03  Thomas Koester  <[email protected]>
379    
380            * Thuban/Model/classgen.py (GenQuantiles0): New function.
381    
382    2003-06-02  Bernhard Herzog  <[email protected]>
383    
384            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
385            New commands.
386            (main_menu): Add the new commands.
387            (MainWindow.TableRename): New. Implementation of the table_rename
388            command.
389            (MainWindow.RenameLayer): New. Implementation of the layer_rename
390            command.
391    
392            * Thuban/Model/session.py (Session.AddTable): call self.changed to
393            set the modified flag
394    
395            * test/test_session.py (TestSessionSimple.test_add_table): Test
396            whether the modified flag is set properly
397    
398            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
399            instead of issue so that the modified flags get updated.
400    
401            * test/test_base.py (SomeTitledObject): Derive from Modifiable
402            instead of Publisher to reflect reality better and to accomodate
403            the fact that SetTitle now calls changed instead of issue
404    
405    2003-06-02  Bernhard Herzog  <[email protected]>
406    
407            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
408            acquisition has to happen before the try in a try-finally.
409    
410    2003-06-02  Bernhard Herzog  <[email protected]>
411    
412            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
413            possible that a layer is removed that is not currently selected in
414            the legend so don't check for this.
415    
416    2003-05-30  Bernhard Herzog  <[email protected]>
417    
418            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
419            variables to None that have direct or indirect references to
420            shapefiles or dbf files to make sure that they do go away and the
421            files are closed.
422    
423    2003-05-30  Bernhard Herzog  <[email protected]>
424    
425            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
426            availImgListIndices when a new image list is created
427            
428    2003-05-30  Bernhard Herzog  <[email protected]>
429    
430            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
431            changing_selection to indicate whether the LegendTree code itself
432            is currently changing the selection
433            (LegendTree.normalize_selection): New method to normalize the
434            selection by selecting the layer item even if the user clicked on
435            the classification.
436            (LegendTree._OnSelChanged): normalize the selection. This works
437            around a bug in wx which doesn't keep track of the selection
438            properly when subtrees are deleted.
439    
440    2003-05-30  Bernhard Herzog  <[email protected]>
441    
442            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
443            maximum and minimum scale factors.
444    
445            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
446            changes in classgen.py
447    
448    2003-05-30  Jonathan Coles   <[email protected]>
449    
450            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
451            all the methods functions. Fixes RTBug #1903.
452    
453            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
454            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
455            RTBug #1907.
456    
457            * Thuban/UI/classgen.py: Use classgen functions that were part
458            of the ClassGenerator class. Put try/finally blocks around
459            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
460            RTBug #1904.
461    
462            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
463    
464            * Thuban/UI/legend.py: The legend was cleared and repopulated any
465            time something changed which caused some state to be lost such
466            as which children were expanded or collapsed. Fixes RTBug #1901.
467            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
468            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
469            the legend but not in the map.
470            (LegendTree.__FillTree): Move main functionality out into smaller
471            methods that can be used by other methods.
472            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
473            if they are available.
474            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
475            that we override the wxTreeCtrl method. Iterate over children
476            and call __RemoveLayer.
477            (LegendTree.__AddLayer): New. Add a new layer to the legend.
478            (LegendTree.__RemoveLayer): Remove a layer from the legend.
479            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
480            Should only be called with the id of a layer branch.
481            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
482            Returns the root item or creates one if necessary.
483    
484            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
485            ProjectRasterFile with tuple arguments instead of strings.
486    
487            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
488            with try/finally. Fixes RTBug #1904.
489    
490            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
491            with try/finally. Fixes RTBug #1904.
492            (MapCanvas.FitSelectedToWindow): If a single point is selected
493            simply center it on the display. Fixes RTBug #1849.
494    
495            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
496            to be compiled as a standalone app. Now the code can only be
497            called from Python which simplifies the parameter passing.
498            (ProjectRasterFile): Handle Python arguments. Remove code that
499            checks for a destination dataset. Add more clean up code.
500    
501            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
502            TestMapWithContents.test_lower_layer_bottom):
503            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
504            Fixes RTBug #1907.
505    
506            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
507            extent to the map when the legend is toggled. Fixes RTBug #1881.
508    
509    2003-05-29  Jan-Oliver Wagner <[email protected]>
510    
511            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
512            unsubscribes all that is subcribed in __init__.
513    
514    2003-05-28  Bernhard Herzog  <[email protected]>
515    
516            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
517            (MainWindow.CanDuplicateLayer): New methods to implement the
518            Layer/Duplicate command.
519            (layer_duplicate command): New.
520            (main_menu): Add layer_duplicate to the Layer menu.
521    
522    2003-05-28  Bernhard Herzog  <[email protected]>
523    
524            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
525            renderer so that NULL/None values get displayed differently (by a
526            gray rectangle).
527            (TableGrid.__init__): Override the default renderers
528    
529    2003-05-28  Bernhard Herzog  <[email protected]>
530    
531            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
532            classification to "None" if the type of the field has changed.
533    
534            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
535            test for the Layer.SetShapeStore method
536    
537    2003-05-28  Jan-Oliver Wagner <[email protected]>
538    
539            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
540            does not necessarily have a filename).
541    
542    2003-05-28  Jan-Oliver Wagner <[email protected]>
543    
544            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
545            sort the selection list for the dialog.
546    
547    2003-05-28  Frank Koormann  <[email protected]>
548    
549            * extensions/thuban/wxproj.cpp
550            (project_point): Removed cast to int for projected point coordinates.
551            (shape_centroid): Return last point if all polygon vertices fall
552            to one point.
553    
554    2003-05-28  Bernhard Herzog  <[email protected]>
555    
556            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
557            with layers that don't have shapestores, i.e. raster layers.
558    
559    2003-05-28  Bernhard Herzog  <[email protected]>
560    
561            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
562            when determining the title from the filename.
563    
564            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
565            reflect changes in the way the title is derived from the filename
566    
567    2003-05-28  Frank Koormann  <[email protected]>
568    
569            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
570            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
571    
572    2003-05-27  Bernhard Herzog  <[email protected]>
573    
574            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
575            delegate SelectedLayer.
576            (MainWindow.LayerUnjoinTable): Implement.
577            (_can_unjoin): New. Helper function for the sensitivity of the
578            layer/unjoin command.
579    
580            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
581            (DerivedShapeStore.OrigShapeStore): New. Return the original
582            shapestore. Used to figure out how to unjoin.
583            (DerivedShapeStore.Shapefile): Fix a typo.
584    
585    2003-05-27  Bernhard Herzog  <[email protected]>
586    
587            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
588            well
589            (JoinDialog.__init__): Use the layer parameter and only build the
590            left choice when a layer is given
591            (JoinDialog.OnJoin): Handle layer joins as well
592            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
593            that the user selects the "Select..." item. The sensitivitly
594            updating is now in update_sensitivity
595            (JoinDialog.y): New method to refactor the sensitivity update of
596            the join button into its own method.
597    
598            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
599    
600    2003-05-27  Bernhard Herzog  <[email protected]>
601    
602            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
603            iff there are unreferenced tables in the session
604    
605    2003-05-27  Bernhard Herzog  <[email protected]>
606    
607            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
608    
609            * Thuban/Model/session.py (Session.UnreferencedTables): New method
610            to return tables that are not referenced by other tables or shape
611            stores and can be removed.
612            (Session.RemoveTable): Issue a TABLE_REMOVED message after
613            removing the table
614    
615            * Thuban/UI/mainwindow.py: Remove unused imports
616            (MainWindow.TableClose): Implement.
617    
618            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
619            messages so that the frame will be automatically closed when a new
620            session is opened or the table is removed.
621            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
622            __init__
623            (TableFrame.close_on_session_replaced)
624            (TableFrame.close_on_table_removed): New. Subscribers that close
625            the window
626    
627            * test/test_session.py (TestSessionMessages.test_remove_table)
628            (TestSessionSimple.test_remove_table): Move the test to
629            TestSessionSimple and add test for the TABLE_REMOVED message
630            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
631            (TestSessionSimple.test_unreferenced_tables) New. Test for the
632            UnreferencedTables method.
633            (UnreferencedTablesTests): New. Class with some more sophisticated
634            tests for UnreferencedTables.
635    
636    2003-05-27  Frank Koormann  <[email protected]>
637    
638            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
639            display has some unwanted side effects. Removed again.
640    
641    2003-05-27  Frank Koormann  <[email protected]>
642    
643            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
644    
645            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
646    
647    2003-05-27  Jan-Oliver Wagner <[email protected]>
648    
649            * test/test_menu.py (MenuTest.test): Added test for
650            Menu.RemoveItem().
651    
652            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
653            the menu.
654    
655    2003-05-27  Frank Koormann  <[email protected]>
656            
657            Nonmodal dialogs without parent (i.e. they can fall behind the main
658            window)
659    
660            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
661            all dialogs in the dialogs dictionary and the canvas.
662    
663            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
664            parent, i.e. can fall behind other windows.
665            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
666            dictionary before removing it.
667    
668            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
669    
670            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
671            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
672            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
673    
674    2003-05-27  Bernhard Herzog  <[email protected]>
675    
676            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
677            tableview dialog
678            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
679            Also, don't use the table's titles as the dialog names. The titles
680            aren't guaranteed to be unique.
681            (MainWindow.TableOpen): Open a table view dialog after opening the
682            table
683    
684    2003-05-27  Bernhard Herzog  <[email protected]>
685    
686            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
687            effect can be achieved by simply closing the window showing the
688            table.
689            (MainWindow.TableHide): Removed.
690            (main_menu): Removed "table_hide"
691    
692    2003-05-27  Frank Koormann  <[email protected]>
693    
694            Fix legend tree display problems under Win32
695    
696            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
697            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
698            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
699    
700            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
701    
702    2003-05-27  Jan-Oliver Wagner <[email protected]>
703    
704            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
705            'after' now allows to insert separators almost anywhere in the menu.
706    
707    2003-05-27  Frank Koormann  <[email protected]>
708    
709            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
710            "S" of selection box label to hint on hot key (Alt-S). Works under
711            Win32 but is ignored under GTK.
712    
713    2003-05-26  Frank Koormann  <[email protected]>
714    
715            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
716            Center Choices.
717    
718    2003-05-26  Bernhard Herzog  <[email protected]>
719    
720            Remove the Precision methods again. They're too DBF specific to be
721            part of the table interface and they're only used in table_to_dbf
722            anyway.
723            
724            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
725            fixed precision of 12 for doubles.
726            (TransientTableBase.Precision): Removed
727            (AutoTransientTable.Width): Delegate to self.table.
728    
729            * Thuban/Model/table.py (DBFTable.Precision)
730            (MemoryTable.Precision): Removed.
731            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
732            (table_to_dbf): Use a fixed precision of 12 for floats unless the
733            column object specifies something else.
734    
735            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
736            test for table_to_dbf
737    
738    2003-05-26  Bernhard Herzog  <[email protected]>
739    
740            * test/test_transientdb.py
741            (TestTransientTable.run_iceland_political_tests): Fix a comment.
742    
743    2003-05-26  Bernhard Herzog  <[email protected]>
744    
745            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
746            implementation. Mark parts of the file format strings for
747            localization.
748    
749            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
750            file and add the table to the tables managed by the session
751    
752            * test/test_session.py (TestSessionSimple.test_open_table_file):
753            New. test case for OpenTableFile
754    
755    2003-05-26  Jan-Oliver Wagner <[email protected]>
756    
757            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
758            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
759            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
760            Replace the true/false of wxWindows by True/False of Python 2.2.1.
761    
762    2003-05-26  Jan-Oliver Wagner <[email protected]>
763    
764            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
765            already a selection present, update the grid accordingly.
766    
767            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
768            resizeable and increase its initial size.
769    
770    2003-05-26  Frank Koormann  <[email protected]>
771    
772            Table export functionality
773    
774            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
775            Return width (in characters) for a column.
776            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
777            (table_to_dbf): Write table to dbf file.
778            (table_to_csv): Write table to csv file.
779    
780            * Thuban/Model/transientdb.py (TransientTableBase.Width,
781            TransientTableBase.Precision): Return column width and precision.
782    
783            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
784            or table_to_csv depending on file selection.
785    
786            * test/test_dbf_table.py:
787            Test table_to_dbf (extension of former part of test).
788    
789            * test/test_csv_table.py:
790            Test table_to_csv.
791    
792    2003-05-23  Jan-Oliver Wagner <[email protected]>
793    
794            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
795            Use QueryTableFrame instead of TableFrame.
796    
797            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
798            table window with 'Layer Table:' instead of 'Table:'.
799    
800    2003-05-23  Jan-Oliver Wagner <[email protected]>
801    
802            Give all tables a title via mix-in TitledObject.LayerShowTable
803    
804            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
805            only if it exists.
806    
807            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
808            and call its init-method with a default title. Remove Title() method.
809    
810            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
811            AutoTransientTable): mix-in TitledObject and call its init-method with
812            a default title. Remove Title() method.
813    
814    2003-05-23  Bernhard Herzog  <[email protected]>
815    
816            * Thuban/Model/session.py (Session.AddShapeStore): Define
817            AddShapeStore analogously to AddTable.
818    
819            * test/test_session.py (TestSessionSimple.test_add_shapestore):
820            New. Test for AddShapeStore
821    
822    2003-05-23  Jan-Oliver Wagner <[email protected]>
823    
824            Introducing QueryTableFrame and a very coarse ShowTable implementation.
825    
826            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
827            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
828            The latter implements the selection GUI without dependency on a layer.
829            LayerTableFrame now is derived from QueryTableFrame and connects
830            to a layer.
831    
832            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
833            implementation that still needs work.
834    
835            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
836    
837    2003-05-22  Frank Koormann  <[email protected]>
838    
839            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
840            Added "outer_join = False" as optional parameter.
841            (TransientJoinedTable.create): If outer join is true, perform a
842            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
843            the left table. Records not matching are filled with 0 / None.
844    
845            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
846            (JoinDialog.OnJoin): Consider outer join check box.
847    
848    2003-05-22  Bernhard Herzog  <[email protected]>
849    
850            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
851            somewhat safer way. Storing the traceback in a local variable can
852            lead to memory leaks
853    
854    2003-05-22  Bernhard Herzog  <[email protected]>
855    
856            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
857            the wxMessageDialog's Destroy() method.
858    
859    2003-05-22  Frank Koormann  <[email protected]>
860    
861            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
862            TransientTable.Title()
863    
864    2003-05-22  Frank Koormann  <[email protected]>
865    
866            Join Dialog, initial version.
867    
868            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
869    
870            * Thuban/UI/join.py (JoinDialog): Functional implementation of
871            former framework. Renamed Table1/Table2 to LeftTable/RightTable
872            in all occurences.
873    
874            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
875            Typo fixed.
876    
877    2003-05-22  Bernhard Herzog  <[email protected]>
878    
879            Give the tables titles so that the GUI can display more meaningful
880            names. For now the titles are fixed but depend on e.g. filenames
881            or the titles of the joined tables.
882    
883            * Thuban/Model/transientdb.py (TransientTable.Title)
884            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
885    
886            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
887    
888            * test/test_transientdb.py
889            (TestTransientTable.test_auto_transient_table_title): New. Test
890            for the Title method
891            (TestTransientTable.test_transient_joined_table)
892            (TestTransientTable.test_transient_table): Add test for the Title
893            methods
894    
895            * test/test_memory_table.py (TestMemoryTable.test_title): New.
896            Test for the Title method
897    
898            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
899            the Title method
900    
901    2003-05-22  Bernhard Herzog  <[email protected]>
902    
903            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
904            Provide a better way to destroy the layers
905            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
906            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
907            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
908            the new way to destroy the layers.
909            (TestLayer.test_derived_store): New. Test for using a layer with a
910            DerivedShapeStore
911    
912            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
913            filename if the shape store actually has one.
914    
915    2003-05-22  Bernhard Herzog  <[email protected]>
916    
917            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
918            for the filename
919    
920            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
921            for the FileName method
922            (TestDBFTableWriting.test_write): Fix spelling of filename
923    
924    2003-05-22  Thomas Koester  <[email protected]>
925    
926            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
927            from SciParam that now really is immutable.
928    
929    2003-05-22  Frank Koormann  <[email protected]>
930    
931            Layer Top/Bottom placement added to legend.
932    
933            * Thuban/UI/legend.py
934            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
935            bound to tool events.
936            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
937            New, methods binding the event methods with the map methods.
938    
939            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
940            layer at top/bottom of layer stack.
941    
942            * Resources/Bitmaps/top_layer.xpm: New button icon.
943    
944            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
945    
946    2003-05-22  Bernhard Herzog  <[email protected]>
947    
948            * Thuban/Model/session.py (Session.RemoveTable): New method to
949            remove tables
950    
951            * test/test_session.py (TestSessionSimple.test_remove_table): New.
952            Test for RemoveTable
953    
954    2003-05-22  Thomas Koester  <[email protected]>
955    
956            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
957            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
958    
959    2003-05-22  Bernhard Herzog  <[email protected]>
960    
961            Implement a way to discover dependencies between tables and
962            shapestores.
963    
964            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
965            (TransientJoinedTable.Dependencies)
966            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
967            interface
968            (TransientJoinedTable.__init__): Keep tack of the original table
969            objects in addition to the corresponding transient tables.
970    
971            * Thuban/Model/table.py (DBFTable.Dependencies)
972            (MemoryTable.Dependencies): New. Implement the dependencies
973            interface
974    
975            * Thuban/Model/data.py (ShapeTable): New. Helper class for
976            ShapefileStore
977            (ShapefileStore.__init__): Use ShapeTable instead of
978            AutoTransientTable
979            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
980            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
981            methods for filename and type
982            (ShapefileStore.Dependencies): New. Implement the dependencies
983            interface
984            (DerivedShapeStore): New class to replace SimpleStore. The main
985            difference to SimpleStore is that it depends not on a shapefile
986            but another shapestore which expresses the dependencies a bit
987            better
988            (SimpleStore.__init__): Add deprecation warning.
989    
990            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
991            Test for the Dependencies method.
992    
993            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
994            New. Test for the Dependencies method.
995    
996            * test/test_transientdb.py
997            (TestTransientTable.test_auto_transient_table_dependencies): New.
998            Test for the Dependencies method.
999            (TestTransientTable.test_transient_joined_table): Add test for the
1000            Dependencies method.
1001    
1002            * test/test_session.py (TestSessionSimple.setUp)
1003            (TestSessionSimple.tearDown): New. Implement a better way to
1004            destroy the sessions.
1005            (TestSessionSimple.test_initial_state)
1006            (TestSessionSimple.test_add_table): Bind session to self.session
1007            so that it's destroyed by tearDown
1008            (TestSessionSimple.test_open_shapefile): New. Test for
1009            OpenShapefile and the object it returns
1010    
1011    2003-05-22  Bernhard Herzog  <[email protected]>
1012    
1013            * Thuban/Model/session.py (Session.AddTable): New method to
1014            register tables with the session.
1015            (Session.Tables): Return the tables registered with AddTable too.
1016    
1017            * test/test_session.py (TestSessionSimple.test_add_table): New.
1018            Test case for the AddTable method
1019    
1020    2003-05-22  Frank Koormann  <[email protected]>
1021    
1022            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1023            lower right corner, center labels for selections, initialize controls
1024            in reasonable order for keyboard navigation.
1025    
1026            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1027            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1028            using the wxListBox.FindString() method. Still a problem (#1886)
1029    
1030            * Thuban/UI/classifier.py
1031            (Classifier.__init__, SelectPropertiesDialog.__init__)
1032    
1033            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1034            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1035            different classification types from here to __init__.
1036            (GenUniquePanel.__init__): Set the column width of the first field
1037            in the Field ListCtrl to the full width.
1038    
1039            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1040            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1041            Grid.
1042            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1043            changes focus to the Selection when pressing "Alt-S".
1044    
1045            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1046            the text if not visible. The italic font sometimes exceeds the
1047            rendering area.
1048    
1049    2003-05-21  Jonathan Coles   <[email protected]>
1050    
1051            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1052            to OnClose so that Thuban closes correctly.
1053    
1054            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1055            DockFrame.OnClose, not DockFrame._OnClose.
1056    
1057    2003-05-21  Jonathan Coles   <[email protected]>
1058    
1059            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1060            references to 'inf' and use new Range __init__ to pass floats
1061            directly rather than converting them to strings first.
1062            Fixes RTBug #1876.
1063    
1064            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1065            Use new Range ___init__ to pass floats.
1066    
1067            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1068            filename is a valid image file. Throw IOError otherwise.
1069    
1070            * Thuban/Model/range.py: Brought over new Range from SciParam that
1071            is immutable and has an __init__ which can accept floats.
1072    
1073            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1074            into try block. AddLayer doesn't throw any exceptions anymore.
1075            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1076            try block.
1077    
1078            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1079            the first item in choices. Fixes RTBug #1882.
1080    
1081            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1082            has gone to 0 which is a serious problem. abort.
1083            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1084            print the error from GDAL.
1085    
1086            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1087            ToggleEventListeners to turn on listening.
1088            (TableGrid.ToggleEventListeners): New. Turns event listening on
1089            and off so as to prevent excessive messages.
1090            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1091            to suppress excessive messages when selecting many rows.
1092            Fixes RTBug #1880.
1093    
1094            * Thuban/UI/view.py: Added checks against if scale == 0. This
1095            is a serious problem that can occur when an image without
1096            geo data is loading and causes the map projection bounds to
1097            go to infinity. Right now, the solution is to simply try
1098            to recover.
1099    
1100            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1101            to set the MFILEReceiver attributes even if the data is NULL.
1102    
1103            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1104            and passed GDAL messages back up to the Python layer. Also
1105            tried to fix some memory leaks that were present in the original
1106            utility but didn't matter because the program aborted.
1107    
1108            * test/test_range.py: Copied over tests from SciParam. Removed
1109            tests against importing. Fixes RTBug #1867.
1110    
1111    2003-05-21  Bernhard Herzog  <[email protected]>
1112    
1113            * test/test_load.py: Remove unused imports and restructure the
1114            test code
1115            (LoadSessionTest): Split into one class for each test and turn
1116            LoadSessionTest itself into the base class for all such session
1117            tests.
1118            (ClassificationTest): New base class for load tests that test
1119            classifications
1120            (TestSingleLayer, TestLayerVisibility, TestClassification)
1121            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1122            for the individual tests
1123    
1124            * test/support.py (FileLoadTestCase.filename): New base class for
1125            file loading tests
1126    
1127    2003-05-21  Jan-Oliver Wagner <[email protected]>
1128    
1129            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1130            Mercator' to 'UTM Zone 32' as a more convenient example.
1131            Added 'Gauss Krueger Zone 6'.
1132    
1133            * Data/iceland_sample_raster.thuban: political polygon now
1134            filled transparent to have the raster image visible at once.
1135    
1136    2003-05-21  Frank Koormann  <[email protected]>
1137    
1138            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1139            OnClose() to keep in sync with extensions. Internally Thuban
1140            still uses "underscored" names.
1141    
1142    2003-05-20  Jonathan Coles   <[email protected]>
1143    
1144            This puts back Raster layer support. These layers support projections
1145            through the GDAL library. Currently, the CVS version is being used.
1146            There are no Debian packages available although this may change soon.
1147            A GDAL driver was extended to support writing to memory rather to
1148            files.
1149    
1150            There is still some work that needs to be done, such as some error
1151            handling when loading invalid images or when there is a problem
1152            projecting the image. This putback simply checks in the majority
1153            of the work.
1154    
1155            * setup.py: Add gdalwarp library extension.
1156    
1157            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1158            Defaults to False, but can be overridden by subclasses if they
1159            support classification.
1160            (RasterLayer): New. Defines a new layer that represents an
1161            image.
1162    
1163            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1164            tag handler.
1165            (SessionLoader.start_layer): Encode the filename.
1166            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1167            New. Supports reading a rasterlayer tag.
1168    
1169            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1170    
1171            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1172            get a string in Latin1. If we get such as string convert it to
1173            unicode first, otherwise leave if alone before encoding.
1174            (SessionSaver.write_layer): Add support for writing both Layers
1175            and RasterLayers.
1176    
1177            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1178            The right argument may not be a string, it could also be a Column.
1179    
1180            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1181            Make initial window size 600x400. Fixes RTBug #1872.
1182    
1183            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1184            the dialog is constructed so that we can support layers that
1185            do not have classifications.
1186            (Classifier._OnTry): Only build a classification if the layer
1187            supports one.
1188    
1189            * Thuban/UI/legend.py: Change all checks that a layer is an
1190            instance of Layer into checks against BaseLayer.
1191            (LegendTree.__FillTreeLayer): Only add children to a branch if
1192            the layer supports classification.
1193    
1194            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1195            MainWindow.OpenSession): Don't proceed with an action if the
1196            user chooses Cancel when they are asked to save changes.
1197            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1198            user to select an image file. Create a new RasterLayer and add
1199            it to the map.
1200    
1201            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1202            for rendering RasterLayer layers.
1203            (MapRenderer.draw_raster_layer): Actually method that calls
1204            the GDALWarp python wrapper and constructs an image from the
1205            data returned.
1206    
1207            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1208            Choices symbols to match those used in the table query method.
1209            Replace deprecated method calls on table with new method names.
1210    
1211            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1212            how small the scale can get. This still needs more testing.
1213    
1214            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1215            Provides a driver to output in .bmp format.
1216    
1217            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1218            New. Provides IO routines which write to memory, rather than a file.
1219    
1220            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1221            of the gdalwarp utility provided in GDAL. Added function calls
1222            that can be accessed from python.
1223    
1224            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1225            a raster layer.
1226    
1227            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1228            layer image data.
1229    
1230            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1231    
1232            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1233            tests associated with the raster layer code.
1234    
1235            * test/test_transientdb.py
1236            (TestTransientTable.test_auto_transient_table_query): Added a test
1237            for using a Column object as the "right" parameter to a query.
1238    
1239    2003-05-19  Frank Koormann  <[email protected]>
1240    
1241            * Thuban/version.py (get_changelog_date):
1242            Catch exceptions if ChangeLog does not exist.
1243    
1244            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1245    
1246    2003-05-19  Frank Koormann  <[email protected]>
1247    
1248            Extended version information for Thuban
1249    
1250            * Thuban/version.py: New, version information for Thuban: Last
1251            modification date and last ChangeLog entry date.
1252    
1253            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1254            information: Display Thuban, wxPython and Python version.
1255    
1256    2003-05-16  Bernhard Herzog  <[email protected]>
1257    
1258            * Thuban/Model/save.py: Remove some unused imports including the
1259            __future__ import for nested_scopes as Thuban relies on Python 2.2
1260            now.
1261            (XMLWriter.encode): Remove the special case for a None argument.
1262            In the saver encode is always called with a string argument.
1263    
1264    2003-05-16  Bernhard Herzog  <[email protected]>
1265    
1266            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1267            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1268            of the bug was that e.g. float("1.2") would fail. Thuban now
1269            requires 2.4.x.
1270            
1271    2003-05-16  Frank Koormann   <[email protected]>
1272    
1273            Printing enhancement and WMF export (under Win32)
1274    
1275            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1276            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1277            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1278            PrintRender.
1279    
1280            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1281            to fullfil information needed for PrinterRenderer.
1282            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1283            (MapCanvas.Print): Adapted to new MapPrintout.
1284            (OutputTransform): General calculations to transform from canvas
1285            coordinates to export/printing devices.
1286    
1287            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1288            new method_command to call ExportMap, with platform dependency (only
1289            __WXMSW__)
1290      
1291            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1292            of scalebar drawing area as new parameters.
1293            
1294            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1295    
1296            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1297            Update to extended scalebar.DrawScalebar header.
1298    
1299            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1300    
1301            * test/test_scalebar.py: Made test executable as standalone.
1302    
1303    2003-05-16  Bernhard Herzog  <[email protected]>
1304    
1305            * Thuban/Model/table.py (Table): Remove this compatibility alias
1306            for DBFTable.
1307    
1308            * test/test_table.py: Import DBFTable as Table because that alias
1309            doesn't exist anymore.
1310    
1311            * Thuban/UI/classgen.py: Remove some unused imports
1312    
1313    2003-05-14  Jonathan Coles   <[email protected]>
1314    
1315            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1316            Fix docstring.
1317            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1318            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1319            values of the supplied range to determine the beginning and end
1320            bounds of the generated classes.
1321    
1322            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1323            do not have a leading 0 (.5 is now accepted as well as 0.5).
1324    
1325            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1326            call to ClassGenerator.GenUniformDistribution.
1327    
1328            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1329            layout bug with the 'Projection' label.
1330    
1331            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1332    
1333            * test/test_range.py: New. Imported from SciParam.
1334    
1335    2003-05-12  Jonathan Coles   <[email protected]>
1336    
1337            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1338            to table.UniqueValues() with calls that retrieve all the values
1339            from the table. This will need to be replaced by a method on table
1340            which can simply return the list (perhaps more efficiently).
1341    
1342    2003-05-12  Jonathan Coles   <[email protected]>
1343    
1344            The return value of ClassGenerator.CalculateQuantiles has changed.
1345            Refer to the documentation for details.
1346    
1347            * test/test_classgen.py: Modified Quantile tests to use the
1348            new return values.
1349    
1350            * Thuban/Model/classgen.py
1351            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1352            use new return values from CalculateQuantiles to produce the correct
1353            range bounds in the Classification.
1354            (ClassGenerator.CalculateQuantiles): Add more comments describing
1355            the return values and parameters. Make minor adjustments to improve
1356            the legibility of the code. Fix problem with adjusted not being set
1357            in most cases.
1358    
1359    2003-05-12  Frank Koormann <[email protected]>
1360            
1361            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1362            and latin1. Fixes #1851 finally.
1363    
1364    2003-05-09  Jonathan Coles   <[email protected]>
1365    
1366            * test/test_classgen.py: New. Tests the Quantile algorithm.
1367    
1368            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1369            Clean up debugging statement, add comments, fix a small bug in the
1370            returned adjusted percentiles.
1371            
1372    2003-05-09  Jonathan Coles   <[email protected]>
1373    
1374            Introduces Range class from SciParam into the ClassGroupRange class,
1375            and such ranges can now be saved and loaded from disk.
1376    
1377            Quantiles are now available in the Classification Generator.
1378    
1379            Initial support for building Queries on a table. Doesn't do anything
1380            but run some tests.
1381    
1382            * Thuban/Model/classification.py: Explicit imports.
1383            (ClassGroupRange): Use the Range class to store the underlying
1384            range information. The interface remains the same, except for
1385            GetRange(), and you can also supply a Range object as the min
1386            parameter to SetRange or __init__.
1387    
1388            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1389            string appropriately for use in Thuban. Fixes RTbug #1851.
1390            (SessionLoader.end_projection): Handle the context of the
1391            projection tag a bit better by looking at what objects are not
1392            None. There was an assumption that a projection tag for a map
1393            could occur before any layers.
1394            (SessionLoader.start_clrange): Provide backward compatibility for
1395            reading min/max values as well as the new range parameter.
1396    
1397            * Thuban/Model/map.py: Explicit imports.
1398    
1399            * Thuban/Model/resource.py: Import _.
1400            (ProjFileSaver.write): write header using projfile.dtd.
1401    
1402            * Thuban/Model/save.py: Explicit imports.
1403            (XMLWriter.encode): New. Encode the given string from a format
1404            used by Thuban into UTF-8. Fixes RTbug #1851.
1405    
1406            * Thuban/UI/classgen.py: Explicit imports.
1407            (ClassGenDialog.__init__): Clean up the code and add support
1408            for Quantiles.
1409            (ClassGenDialog.OnOK): Add support for Quantiles.
1410            (GenQuantilesPanel): New. Input panel for Quantiles.
1411            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1412            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1413    
1414            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1415    
1416            * Thuban/UI/classifier.py: Explicit imports.
1417            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1418            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1419    
1420            * Thuban/UI/legend.py: Explicit imports.
1421    
1422            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1423            a Table menu and associated method calls.
1424            (MainWindow.choose_color): Removed. No longer needed.
1425    
1426            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1427            should be disabled if no projection is selected in the available
1428            list.
1429    
1430            * Thuban/UI/renderer.py: Explicit imports.
1431    
1432            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1433            with correctly selecting the rows and issuing the right events.
1434            Be sure to call Skip() to allow the grid to do some of its own
1435            handling which allows the rows to actually be selected.
1436            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1437            selecting multiple shapes.
1438            (LayerTableFrame): Support for building Queries.
1439            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1440    
1441            * Thuban/UI/tree.py: Explicit imports.
1442    
1443            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1444            table view can call it.
1445    
1446            * test/test_classification.py: Explicit imports.
1447            (TestClassification.test_ClassGroupRange): Fix test for new
1448            Range class.
1449    
1450            * Doc/thuban.dtd: Add range parameter for clrange.
1451    
1452            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1453            object in ClassGroupRange, and also uesd for inputting ranges in
1454            the classifer table and elsewhere.
1455    
1456            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1457            yet.
1458    
1459    2003-05-09  Frank Koormann <[email protected]>
1460    
1461            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1462    
1463    2003-05-08  Frank Koormann <[email protected]>
1464    
1465            Coding style updates
1466    
1467            * test/test_scalebar.py: Replaced tab indentation by spaces.
1468    
1469            * Thuban/UI/scalebar.py: Explicit imports.
1470    
1471    2003-05-08  Frank Koormann <[email protected]>
1472    
1473            * Thuban/UI/scalebar.py
1474            (ScaleBar.DrawScalebar): Format string bug fixed.
1475    
1476    2003-05-08  Frank Koormann <[email protected]>
1477    
1478            Reorganization of scalebar component (no wx in Thuban/Model)
1479    
1480            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1481            (deriveInterval):
1482            Calculate scalebar interval and unit which fits in width for scale.
1483            (roundInterval): Round float.
1484    
1485            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1486    
1487            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1488    
1489            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1490    
1491    2003-05-08  Frank Koormann <[email protected]>
1492    
1493            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1494            Initialize ScaleBar with canvas.map
1495    
1496            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1497            round intervals to display smarter lengths
1498            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1499            layer. If the maps has no projection applied grey the scalebar.
1500    
1501    2003-05-07  Frank Koormann <[email protected]>
1502            
1503            Basic Scalebar features added.
1504    
1505            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1506    
1507            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1508            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1509            and the renderer.
1510    
1511            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1512    
1513            * Thuban/UI/messages.py: SCALE_CHANGED added.
1514    
1515    2003-05-07  Bernhard Herzog  <[email protected]>
1516    
1517            * Thuban/Model/session.py (Session.__init__): New instance
1518            variable shapestores to hold a list of all open shapestore objects
1519            (Session.ShapeStores): New. Accessor method for the shapestores
1520            list.
1521            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1522            Internal methods to maintain the shapestores list.
1523            (Session.Tables): New. Return all tables open in the session.
1524            (Session.OpenShapefile): Insert the new ShapeStore into the
1525            shapestores list.
1526    
1527            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1528            tests for ShapeStores and Tables
1529            (TestSessionWithContent.test_shape_stores)
1530            (TestSessionWithContent.test_tables): New. Test cases for
1531            ShapeStores and Tables
1532    
1533    2003-05-07  Bernhard Herzog  <[email protected]>
1534    
1535            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1536            Add comments about the optimizations used.
1537            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1538            Implement the ReadValue table interface method.
1539    
1540            * test/test_transientdb.py
1541            (TestTransientTable.run_iceland_political_tests)
1542            (TestTransientTable.test_transient_joined_table): Add tests for
1543            ReadValue
1544    
1545    2003-05-07  Frank Koormann <[email protected]>
1546    
1547            * Resources/Bitmaps/fulllayerextent.xpm,
1548            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1549            new icons.
1550    
1551    2003-05-06  Bernhard Herzog  <[email protected]>
1552    
1553            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1554            New. Simply delegate to the transient table's version.
1555    
1556            * test/test_transientdb.py
1557            (TestTransientTable.test_auto_transient_table_query): New. Test
1558            case for AutoTransientTable's SimpleQuery
1559    
1560    2003-05-06  Bernhard Herzog  <[email protected]>
1561    
1562            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1563            Implement a simple query method for the query dialog
1564            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1565            the row index or shapeid.
1566            (TransientTable.create): Insert the right value of the row index
1567            (TransientJoinedTable.create): Copy the row index of the left
1568            table to the joined result table
1569    
1570            * test/test_transientdb.py
1571            (TestTransientTable.test_transient_table_read_twice): Fix
1572            doc-string
1573            (TestTransientTable.test_transient_table_query): New. Test for the
1574            SimpleQuery method
1575    
1576    2003-05-06  Bernhard Herzog  <[email protected]>
1577    
1578            Convert all table users to use the new table interface. This only
1579            covers Thuban itself, not GREAT-ER or other applications built on
1580            Thuban yet, so the compatibility interface stays in place for the
1581            time being but it now issues DeprecationWarnings.
1582    
1583            Finally, the new Table interface has a new method, HasColumn.
1584    
1585            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1586            issue deprecation warnings when they're. The warnings refer to the
1587            caller of the method.
1588            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1589            for the deprecation warnings
1590    
1591            * test/test_table.py: Ignore the deprecation warnings for the old
1592            table in the tests in this module. The purpose of the tests is to
1593            test the old interface, after all.
1594    
1595            * test/test_transientdb.py
1596            (TestTransientTable.run_iceland_political_tests): Use the
1597            constants for the types. Add a test for HasColumn
1598            (TestTransientTable.test_transient_joined_table): Adapt to new
1599            table interface. Add a test for HasColumn
1600            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1601            table interface
1602    
1603            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1604            Adapt to new table interface
1605    
1606            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1607            new table interface
1608    
1609            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1610            (RecordTable.SetTable): Adapt to new table interface
1611    
1612            * Thuban/UI/classifier.py (Classifier.__init__)
1613            (Classifier.__init__): Adapt to new table interface
1614    
1615            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1616            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1617            to new table interface
1618    
1619            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1620            (AutoTransientTable.HasColumn): Implement the new table interface
1621            method
1622            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1623            (AutoTransientTable.UniqueValues): Adapt to new table interface
1624    
1625            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1626            Adapt to new table interface
1627    
1628            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1629            simplify opening shapefiles a bit easier.
1630            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1631            (TestLayer.test_point_layer): Use the new helper method
1632            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1633            method
1634    
1635            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1636            the new table method
1637    
1638            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1639            Test for the new table method HasColumn
1640    
1641    2003-05-06  Jonathan Coles   <[email protected]>
1642    
1643            Addresses the "Selection Extent" wish of RTbug #1787.
1644    
1645            * Resources/Bitmaps/fulllayerextent.xpm,
1646            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1647            extent. These are just place holders for the real bitmaps.
1648    
1649            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1650            calculate the bounding box once (the first time compute_bbox() is
1651            called).
1652            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1653            the bounding box for the shapes in lat/long coordinates.
1654    
1655            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1656            option.
1657            (MainWindow.has_selected_shapes): New. Returns true if there are
1658            any selected shapes.
1659            (MainWindow.FullSelectionExtent): New. Calls
1660            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1661            (_has_selected_shapes): New. Returns true if there are any
1662            selected shapes.
1663    
1664            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1665            true if there are any selected shapes.
1666    
1667            * Thuban/UI/view.py (MapCanvas): Added delegated method
1668            HasSelectedShapes.
1669            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1670            shapes on the canvas using the map projection (if any).
1671    
1672            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1673            for Layer.ShapesBoundingBox().
1674    
1675    2003-05-06  Bernhard Herzog  <[email protected]>
1676    
1677            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1678    
1679    2003-05-05  Jonathan Coles   <[email protected]>
1680    
1681            Addresses the "Full Layer Extent" wish of RTbug #1787.
1682    
1683            * Resources/Projections/defaults.proj: Added UK National Grid.
1684    
1685            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1686            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1687            when the user selects the menu option.
1688    
1689            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1690            scales the given layer on the canvas using the map projection.
1691    
1692    2003-05-05  Bernhard Herzog  <[email protected]>
1693    
1694            Convert the table implementations to a new table interface. All
1695            tables use a common mixin class to provide backwards compatibility
1696            until all table users have been updated.
1697    
1698            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1699            provide backwards compatibility for table classes implementing the
1700            new interface
1701            (DBFTable, MemoryTable): Implement the new table interface. Use
1702            OldTableInterfaceMixin as base for compatibility
1703            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1704            and MemoryTable resp.
1705    
1706            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1707            the new table interface.
1708    
1709            * test/test_memory_table.py: New. Test cases for the MemoryTable
1710            with the new table interface.
1711    
1712            * test/test_table.py: Document the all tests in this file as only
1713            for backwards compatibility. The equivalent tests for the new
1714            interface are in test_memory_table.py and test_dbf_table.py
1715            (MemoryTableTest.test_read): field_info should be returning tuples
1716            with four items
1717            (MemoryTableTest.test_write): Make doc-string a more precise.
1718    
1719            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1720            table interface. Derive from from OldTableInterfaceMixin for
1721            compatibility.
1722            (TransientTableBase.create): New intance variable column_map to
1723            map from names and indices to column objects
1724            (TransientTable.create): Use the new table interface of the input
1725            table
1726            (AutoTransientTable): Convert to new table interface. Derive from
1727            from OldTableInterfaceMixin for compatibility.
1728            (AutoTransientTable.write_record): Removed. It's not implemented
1729            yet and we still have to decide how to handle writing with the new
1730            table and data framework.
1731    
1732            * test/test_transientdb.py
1733            (TestTransientTable.run_iceland_political_tests)
1734            (TestTransientTable.test_transient_joined_table): Use the new
1735            table interface
1736    
1737    2003-05-05  Jonathan Coles   <[email protected]>
1738    
1739            This is namely a collection of UI updates to improve user interactivity.
1740            Tabbing between controls now exists and you can use ESC to close dialog
1741            boxes; ENTER will active the default button.
1742    
1743            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1744            order that the controls are created so that tabbing works correctly.
1745            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1746            wxDialog can handle the default button correctly.
1747            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1748            same reasons as for OnOK.
1749            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1750            when we ask the table for the maximum/minimum values of a field
1751            which could take a very long time.
1752    
1753            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1754            order that the controls are created so that tabbing works correctly.
1755            (SelectPropertiesDialog.__init__): Rearrange the order that the
1756            controls are created so that tabbing works correctly.
1757    
1758            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1759            to derive from a wxDialog but behave like the original implementation
1760            which was derived from a wxFrame. wxDialog provides useful key
1761            handling functionality like ESC calling OnCancel and ENTER calling
1762            OnOK which is lost with wxFrame.
1763    
1764            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1765            new dialogs.
1766    
1767            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1768            order that the controls are created so that tabbing works correctly.
1769            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1770            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1771            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1772            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1773            can provide the "UK National Grid" as a default projection.
1774            (UTMPanel.__init__): Rearrange the order that the controls are
1775            created so that tabbing works correctly.
1776    
1777    2003-05-05  Bernhard Herzog  <[email protected]>
1778    
1779            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1780            (project_point): If a map projection but no layer projection is
1781            given, convert degrees to radians before applying the map
1782            projection.
1783    
1784            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1785            (TableGrid.allow_messages): New methods to make it possible to
1786            inhibit message sending.
1787            (TableGrid.issue): Only send the message if not inhibited.
1788            (LayerTableGrid.select_shape): Use the new methods to make sure
1789            that no ROW_SELECTED message is sent while we're updating the
1790            selected rows to match the selected shapes.
1791    
1792    2003-05-02  Jan-Oliver Wagner <[email protected]>
1793    
1794            Implementation of MemoryTable.
1795    
1796            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1797            implementation that operates on a list of tuples. All of the data
1798            are kept in the memory.
1799    
1800            * test/test_table.py (MemoryTableTest): New.
1801    
1802            * test/test_transientdb.py (SimpleTable): Removed.
1803            (TestTransientTable.test_transient_joined_table,
1804            (TestTransientTable.test_transient_table_read_twice): Replaced
1805            SimpleTable by MemoryTable.
1806    
1807  2003-04-30  Jonathan Coles   <[email protected]>  2003-04-30  Jonathan Coles   <[email protected]>
1808    
1809          * Data/iceland_sample.thuban: Now contains correct projections          * Data/iceland_sample.thuban: Now contains correct projections

Legend:
Removed from v.803  
changed lines
  Added in v.1414

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26