/[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 644 by jonathan, Thu Apr 10 17:56:52 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]>
1808    
1809            * Data/iceland_sample.thuban: Now contains correct projections
1810            for each of the layers.
1811    
1812            * Resources/Projections/defaults.proj: Geographic projection
1813            contains unit conversion parameter.
1814    
1815    2003-04-30  Jonathan Coles   <[email protected]>
1816    
1817            The most important part of this putback is the projection changes.
1818            It should now be possible to specify the projection that a layer
1819            is in and then specify a different projection for the map. The
1820            projection dialog has an extra parameter for a geographic projection
1821            which lets the user select if the input is in degrees or radians.
1822    
1823            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1824            to say that the parameter is a tuple of unprojected
1825            points (which is what the callers to this method were assuming).
1826            Also, since the points are unprojected we need to projected them.
1827    
1828            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1829            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1830            groups are selected, move the layer up/down. Fixes RTbug #1833.
1831    
1832            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1833    
1834            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1835            parameter in call to SetClientData.
1836            (GeoPanel): Add support for selecting the units that the
1837            source data is in (Radians or Degrees).
1838    
1839            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1840            the rendering loop by reducing the number of if's, removing the
1841            unnecessary try/except block, and checking if the old group
1842            is the same as the new one (which happens a lot if there is
1843            no classification, or lots of shapes are in the same group).
1844    
1845            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1846            around the redraw routine to try to catch problems that the user
1847            may create by selecting invalid projections for the data set and
1848            map. Clears the display if there are any problems and prints the
1849            error.
1850            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1851            rectangle.
1852    
1853            * extensions/thuban/wxproj.cpp (project_point): First invert the
1854            supplied point (which should be in projected coordinates) using
1855            the layer's projection and then project the point using the
1856            map's projection.
1857            (project_points): Use project_point() to project each point.
1858    
1859    2003-04-30  Jan-Oliver Wagner <[email protected]>
1860    
1861            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1862            don't set the Classification to None if the classfication field
1863            is None (ie only a DEFAULT).
1864    
1865    2003-04-30  Bernhard Herzog  <[email protected]>
1866    
1867            * Thuban/UI/view.py: Fix some typos.
1868    
1869            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1870            not pop up the dialog if the selection becomes empty (this could
1871            happen if e.g. a new selection is opened while the identify tool
1872            is active and dialog had been closed)
1873    
1874    2003-04-30  Bernhard Herzog  <[email protected]>
1875    
1876            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1877            instance variable read_record_last_result
1878            (TransientTableBase.read_record): Make sure reading the same
1879            record twice works. The implementation uses the new instance
1880            variable read_record_last_result
1881    
1882            * test/test_transientdb.py
1883            (TestTransientTable.test_transient_table_read_twice): New test
1884            case for the above bug-fix.
1885    
1886    2003-04-29  Jonathan Coles   <[email protected]>
1887    
1888            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1889    
1890            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1891    
1892            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1893            (ClassTable.SetValueAsCustom): Rename keyword argument in
1894            ClassGroup* constructors to match argument name.
1895    
1896    2003-04-29  Bernhard Herzog  <[email protected]>
1897    
1898            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1899            transient DB if it exists to make sure it doesn't leave a journal
1900            file in the temp directory.
1901    
1902            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1903            self.conn to None after closing the connection to make sure it's
1904            not closed twice
1905    
1906    2003-04-29  Jonathan Coles   <[email protected]>
1907    
1908            Add a visible parameter in the layer XML tag. The default value is
1909            "true". If anything other than "false" is specified we also assume
1910            "true". Addresses RTbug #1025.
1911    
1912            * Doc/thuban.dtd: Add visible parameter to a layer.
1913    
1914            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1915            of visible from 1 to True.
1916            (Layer.__init__): Change default value of visible from 1 to True.
1917    
1918            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1919            parameter.
1920    
1921            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1922            parameter.
1923    
1924            * test/test_load.py: Add new test data contents_test_visible.
1925            (LoadSessionTest.setUp): save test data.
1926            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1927            is loaded correctly.
1928    
1929            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1930            for saving an invisible layer.
1931    
1932    2003-04-29  Jonathan Coles   <[email protected]>
1933    
1934            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1935            legend dialog box and tell it to change its map to the one
1936            supplied to SetMap(). Fixes RTbug #1770.
1937    
1938    2003-04-29  Bernhard Herzog  <[email protected]>
1939    
1940            Next step of table implementation. Introduce a transient database
1941            using SQLite that some of the data is copied to on demand. This
1942            allows us to do joins and other operations that require an index
1943            for good performance with reasonable efficiency. Thuban now needs
1944            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1945            haven't tested that.
1946            
1947            * Thuban/Model/transientdb.py: New. Transient database
1948            implementation.
1949    
1950            * test/test_transientdb.py: New. Tests for the transient DB
1951            classes.
1952    
1953            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1954            classes to help automatically remove temporary files and
1955            directories.
1956            (Session.__init__): New instance variables temp_dir for the
1957            temporary directory and transient_db for the SQLite database
1958            (Session.temp_directory): New. Create a temporary directory if not
1959            yet done and return its name. Use AutoRemoveDir to have it
1960            automatically deleted
1961            (Session.TransientDB): Instantiate the transient database if not
1962            done yet and return it.
1963    
1964            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1965            AutoTransientTable so that data is copied to the transient DB on
1966            demand.
1967            (SimpleStore): New class that simply combines a table and a
1968            shapefile
1969    
1970            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1971            DBFTable and update its doc-string to reflect the fact that this
1972            is only the table interface to a DBF file. Table is now an alias
1973            for DBFTable for temporary backwards compatibility.
1974    
1975            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1976            the last reference to the session goes away so that the temporary
1977            files are removed properly.
1978    
1979            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1980            reference to the session to make sure the temporary files are
1981            removed.
1982    
1983    2003-04-29  Bernhard Herzog  <[email protected]>
1984    
1985            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1986            the __parser instance variable into a normal local variable in
1987            read. It's only used there and read will never be called more than
1988            once. Plus it introduces a reference cycle that keeps can keep the
1989            session object alive for a long time.
1990    
1991    2003-04-29  Jonathan Coles   <[email protected]>
1992    
1993            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1994            Projection an immutable item. Fixes RTbug #1825.
1995            (Projection.__init__): Initialize instance variables here.
1996            (ProjFile.Replace): New. Replace the given projection object with
1997            the new projection object. This solves the problem of needing the
1998            mutator Projection.SetProjection() in the ProjFrame class and
1999            allows a projection to change parameters without changing its
2000            location in the file.
2001    
2002            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
2003            be of type wxSAVE and should verify overwriting a file.
2004    
2005            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
2006            ProjFile.Replace() method instead of the mutator
2007            Projection.SetProjection(). Also requires that we reassign the
2008            client data to the new projection.
2009    
2010            * test/test_proj.py (TestProjection.test): Test GetName() and
2011            GetAllParameters()
2012            (TestProjFile.test): Remove tests for Set*() methods. Add tests
2013            for Replace().
2014    
2015    2003-04-25  Jonathan Coles   <[email protected]>
2016    
2017            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2018            to save the name of the projection.
2019    
2020            * test/test_save.py (SaveSessionTest.testLayerProjection): New
2021            test to verify layer projections are saved correctly.
2022    
2023    2003-04-25  Jonathan Coles   <[email protected]>
2024    
2025            * Thuban/Model/proj.py (Projection.SetName): Set the name
2026            to "Unknown" if name is None.
2027            (Projection.SetAllParameters): New. Set the projection's
2028            parameter list to the one supplied.
2029            (Projection.SetProjection): New. Set the projection's
2030            properties to those of the supplied Projection.
2031    
2032            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2033            the dialog title to include the map's title.
2034            (MainWindow.LayerProjection): Set the dialog title to include
2035            the layer's title.
2036    
2037            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2038            error dialogs into a single method call.
2039            (ProjFrame.__VerifyButtons): Add more states to check.
2040            (ProjFrame.__GetProjection): Return the current state of an
2041            edited projection or None.
2042            (ProjFrame.__FillAvailList): Remove checks for states that
2043            shouldn't exist.
2044            (ProjFrame._OnNew): Clear all selected items and supply
2045            a projection panel if necessary.
2046    
2047            * test/test_proj.py (TestProjFile.test): Add tests for
2048            ProjFile.SetAllParameters, ProjFile.SetProjection,
2049            ProjFile.SetName.
2050    
2051    2003-04-25  Jonathan Coles   <[email protected]>
2052    
2053            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2054            takes an optional argument to select the current projection.
2055            This does not guarantee that the item is visible due to
2056            limited wxWindows functionality. Fixes RTBug #1821.
2057    
2058    2003-04-25  Jonathan Coles   <[email protected]>
2059    
2060            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2061            the projection name and use it when constructing the Projection
2062            object.
2063    
2064            * Thuban/Model/proj.py (Projection.__init__): Change the default
2065            value for 'name' to None and then test if name is equal to None
2066            in the body of the constructor. This way the caller doesn't have to
2067            know what the default value should be. Namely, useful in load.py
2068            where we have to pick a default value if the 'name' parameter
2069            doesn't exist in the XML file.
2070    
2071            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2072            Tests a file where a layer has a projection.
2073    
2074    2003-04-25  Jonathan Coles   <[email protected]>
2075    
2076            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2077            tree for projection information.
2078    
2079            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2080            XMLReader.GetFileName.
2081            (SessionLoader): Added support for loading projection tags that
2082            appear inside a layer.
2083    
2084            * Thuban/Model/proj.py (ProjFile): Document the class. Move
2085            back to using a list because the order of the projections in
2086            the file is important to maintain. Fixes RTbug #1817.
2087    
2088            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2089            to ProjFile.GetFilename.
2090    
2091            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2092            information.
2093    
2094            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2095            ProjFrame._OnSaveAs. Removed old dead code from previous
2096            implementation.
2097            (ProjFrame._OnExport): Add support for exporting more than one
2098            projection to a single file.
2099            (ProjFrame.__FillAvailList): use string formatting (% operator)
2100            to build strings that are (partly) translated. Fixes RTbug #1818.
2101    
2102            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2103            class.
2104    
2105    2003-04-24  Bernhard Herzog  <[email protected]>
2106    
2107            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2108    
2109            * po/fr.po: New. French translation by Daniel Calvelo Aros
2110    
2111            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2112            empty strings.
2113    
2114    2003-04-24  Jonathan Coles   <[email protected]>
2115    
2116            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2117            implement the interface that the ProjFrame dialog expects.
2118    
2119            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2120            name of the projection to be changed.
2121            (ProjFile): Use a dictionary instead of a list so that removing
2122            projections is easier and we are sure about uniqueness.
2123            (ProjFile.Remove): Remove the given projection object.
2124    
2125            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2126            Return a list with only one projection file instead of searching for
2127            any projection file. This simplifies many things if the user can
2128            only have one system file and one user file.
2129    
2130            * Thuban/UI/classgen.py: Change all references to
2131            genCombo to genChoice.
2132    
2133            * Thuban/UI/mainwindow.py: Add a Projection option under the
2134            layer menu.
2135            (MainWindow.LayerProjection): New. Open up a projection window
2136            for a layer.
2137    
2138            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2139            laid out. Use three panels instead of one. One for the list of
2140            projections, one for the edit controls, and one for the buttons.
2141            Fixed resizing problems so that the dialog resizes correctly
2142            when the projection panel changes. Added import/export, save, and
2143            new buttons/functionality.
2144    
2145    2003-04-24  Bernhard Herzog  <[email protected]>
2146    
2147            First step towards table management. Introduce a simple data
2148            abstraction so that we replace the data a layer uses more easily
2149            in the next step.
2150    
2151            * Thuban/Model/data.py: New file with a simple data abstraction
2152            that bundles shapefile and dbffile into one object.
2153    
2154            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2155            open shapefiles and return a shape store object
2156    
2157            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2158            object instead of a shapefile filename. This introduces a new
2159            instance variable store holding the datastore. For intermediate
2160            backwards compatibility keep the old instance variables.
2161            (open_shapefile): Removed. No longer needed with the shape store.
2162            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2163            get the shape store used by a layer.
2164            (Layer.Destroy): No need to explicitly destroy the shapefile or
2165            table anymore.
2166    
2167            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2168            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2169            open shapefiles
2170    
2171            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2172            session's OpenShapefile method to open shapefiles
2173    
2174            * test/test_classification.py
2175            (TestClassification.test_classification): Use the session's
2176            OpenShapefile method to open shapefiles and build the filename in
2177            a more platform independed way
2178    
2179            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2180            Implement to have a session to use in the tests
2181            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2182            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2183            session's OpenShapefile method to open shapefiles
2184            (TestLayerLegend.setUp): Instantiate a session so that we can use
2185            it to open shapefiles.
2186            (TestLayerLegend.tearDown): Make sure that all references to
2187            layers and session are removed otherwise we may get a resource
2188            leak
2189    
2190            * test/test_map.py (TestMapAddLayer.test_add_layer)
2191            (TestMapWithContents.setUp): Instantiate a session so that we can
2192            use it to open shapefiles.
2193            (TestMapWithContents.tearDown): Make sure that all references to
2194            layers, maps and sessions are removed otherwise we may get a
2195            resource leak
2196            ("__main__"): use support.run_tests() so that more info about
2197            uncollected garbage is printed
2198    
2199            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2200            session's OpenShapefile method to open shapefiles
2201            ("__main__"): use support.run_tests() so that more info about
2202            uncollected garbage is printed
2203    
2204            * test/test_selection.py (TestSelection.tearDown): Make sure that
2205            all references to the session and the selection are removed
2206            otherwise we may get a resource leak
2207            (TestSelection.get_layer): Instantiate a session so that we can
2208            use it to open shapefiles.
2209            ("__main__"): use support.run_tests() so that more info about
2210            uncollected garbage is printed
2211    
2212            * test/test_session.py (TestSessionBase.tearDown)
2213            (TestSessionWithContent.tearDown): Make sure that all references
2214            to the session and layers are removed otherwise we may get a
2215            resource leak
2216            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2217            method to open shapefiles
2218    
2219    2003-04-24  Jonathan Coles   <[email protected]>
2220    
2221            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2222            if the file_or_filename object had the 'read' attribute.
2223    
2224    2003-04-23  Jonathan Coles   <[email protected]>
2225    
2226            * Thuban/Model/resource.py: Fixes RTbug #1813.
2227            (ReadProjFile): Add documentation about which exceptions are raised.
2228            Always pass the exceptions up to the caller.
2229            (GetProjFiles): If the directory can't be read return an empty list.
2230            If any of the proj files can't be read skip that file and go
2231            on to the next one.
2232    
2233            * test/test_proj.py: Added test cases to handle nonexistent files,
2234            unreadable files, and files that don't parse correctly.
2235    
2236    2003-04-23  Jonathan Coles   <[email protected]>
2237    
2238            Projection dialog. Allows the user to select from a list
2239            of projection templates and optionally edit them and save new ones.
2240    
2241            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2242            (ProjPanel): Base class for projection specific panels.
2243            (TMPanel): Projection panel for Transverse Mercartor.
2244            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2245            (LCCPanel): Projection panel for Lambert Conic Conformal.
2246            (GeoPanel): Projetion panel for Geographic Projection.
2247    
2248    2003-04-23  Jonathan Coles   <[email protected]>
2249    
2250            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2251            promote symmetry. There now exists XMLReader and XMLWriter.
2252            (XMLReader.read): New. Call to read the given file descriptor or
2253            filename.
2254            (XMLReader.close): New. Make sure the file is closed.
2255            (XMLReader.GetFileName): New. Return just the file name that is being
2256            read from.
2257            (XMLReader.GetDirectory): New. Return just the directory of the file
2258            that is being read.
2259            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2260            the names of functions to call as the XML tree is parsed.
2261            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2262            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2263            (SessionLoader): Removed class variables start_dispatcher and
2264            end_dispatcher since this functionality is now part of a class
2265            instance. Fixes RTbug #1808.
2266            (SessionLoader.__init__): Add dispatcher functions.
2267            (load_xmlfile): Code was moved into the XMLReader.read().
2268            (load_session): Use modified SessionLoader.
2269    
2270            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2271            map's projection.
2272    
2273            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2274            GetAllParameters.
2275            (Projection.GetParameter): Returns the value for the given parameter.
2276    
2277            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2278            (GetProjFiles): Renamed from GetProjections. Now returns a list
2279            of ProjFile objects.
2280            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2281            a list of ProjFile objects whose files are not user defined.
2282            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2283            list of ProjFile objects whose files are user defined.
2284            (ProjFileReader): Extend new XMLReader.
2285    
2286            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2287            promote symmetry.
2288    
2289            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2290            control instead of a wxComboBox. wxChoice controls do not generate
2291            events as the uses highlights possible choices which fixes problems
2292            with resizing the dialog when the use selects an option.
2293    
2294            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2295            control instead of a wxComboBox.
2296    
2297            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2298            dialog.
2299    
2300            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2301            method.
2302    
2303    2003-04-22  Bernhard Herzog  <[email protected]>
2304    
2305            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2306            constants
2307    
2308            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2309            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2310    
2311    2003-04-17  Bernhard Herzog  <[email protected]>
2312    
2313            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2314            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2315            anymore.
2316            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2317            (Layer.ShapeType, Layer.Shape): No need to call
2318            self.open_shapefile since it's always called in __init__
2319    
2320            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2321            In wxPython 2.4 there's no need to extend MainLoop anymore since
2322            wxPython itself makes sure OnExit is called.
2323    
2324    2003-04-16  Jonathan Coles   <[email protected]>
2325    
2326            Initial putback of projection management code. Includes new
2327            classes to read and write projection files. The current load
2328            and save classes were abstracted a bit so they could be reused.
2329            The Projection class was extended to provide new methods and
2330            have a name.
2331    
2332            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2333            general XML reading methods that were part of ProcessSession.
2334    
2335            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2336            name.
2337            (ProjFile): New. Represents a file that contains projection
2338            information.
2339    
2340            * Thuban/Model/resource.py: New. Contains general utilities
2341            for read and writing projection files.
2342    
2343            * Thuban/Model/save.py (XMLSaver): New. Contains all the
2344            general XML writing methods that were part of SessionSaver.
2345            (SessionSaver): Renamed from Saver.
2346    
2347            * test/test_proj.py: New test cases for the projection
2348            file read and write functions.
2349    
2350    2003-04-16  Jonathan Coles   <[email protected]>
2351    
2352            * Thuban/Model/classification.py: Use repr() around values
2353            in the ClassGroup*.__repr__() methods so it is clearer when
2354            a value is a string and when it is a number.
2355    
2356            * test/test_load.py: Rework the classification test to test
2357            that we can load old files.
2358            (testLabels): Test a file where the groups have labels.
2359    
2360    2003-04-16  Bernhard Herzog  <[email protected]>
2361    
2362            Safer implementation of the performance enhancements of the
2363            low-level renderer:
2364            
2365            * extensions/thuban/wxproj.cpp (extract_projection)
2366            (extract_pointer): Rename extract_projection to extract_pointer
2367            and redefine its purpose to return the pointer stored in a CObject
2368            returned by the object's cobject method. Update all callers.
2369            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2370            handling of these low-level parameters so that each s_draw_info
2371            instance is handled as a CObject at python level that also
2372            contains real references to the actual python objects which
2373            contain the values in the struct. Add free_draw_info as the
2374            destructor.
2375            (draw_polygon_shape): Add the py_draw_info parameter which must a
2376            cobject containing an s_draw_info pointer.
2377    
2378            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2379            method to instantiat the low-level render parameter
2380            (MapRenderer.draw_shape_layer): Use the new method. Remove some
2381            commented out code.
2382            (MapRenderer.draw_polygon_shape): Make the first parameter not the
2383            layer but the low-level render parameter
2384            (ScreenRenderer.draw_shape_layer): Use the low-level render
2385            parameter.
2386    
2387    2003-04-15  Jonathan Coles   <[email protected]>
2388    
2389            * Thuban/Model/classification.py: Implemented __repr__ for
2390            the ClassGroup* classes to make debugging a bit easier.
2391            (ClassGroup.SetLabel): Check that the string is an instance
2392            of StringTypes not StringType. Accounts for Unicode strings.
2393    
2394            * Thuban/Model/color.py: Implemented __repr__ to make
2395            debugging a bit easier.
2396    
2397            * Thuban/Model/save.py (Saver.write_classification): Need to
2398            save the group label.
2399    
2400            * test/test_load.py (testClassification): New. Loads the
2401            iceland_sample_test.thuban file and checks if it was loaded
2402            correctly.
2403    
2404    2003-04-15  Jonathan Coles   <[email protected]>
2405    
2406            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2407            to improve rendering performance by initializing the variables
2408            that are not change each time draw_polygon_shape() is called.
2409            The values are stored in a global struct draw_info.
2410            (draw_polygon_shape): Removed initialization code that is
2411            now in draw_polygon_init().
2412    
2413            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2414            drawing initialization call to draw_polygon_init()
2415            (MapRenderer.draw_polygon_shape): Use new signature of
2416            draw_polygon_shape.
2417    
2418            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2419            weirdness by setting the range to (1, maxint).
2420    
2421            * Thuban/Model/classification.py (ClassGroupProperties): Make
2422            instance variables private and optimize comparison operator
2423            by first checking if the color references are the same.
2424            (ClassGroupSingleton): Make instance variables private.
2425            (ClassGroupRange): Make instance variables private.
2426    
2427            * HOWTO-Release: Filled in missing steps for releasing packages.
2428    
2429    2003-04-15  Bernhard Herzog  <[email protected]>
2430    
2431            First stab at internationalized messages:
2432    
2433            * Thuban/__init__.py (_): Implement the translation function for
2434            real using the python gettext module.
2435    
2436            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2437            translate empty strings.
2438    
2439            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2440            Add a missing space to a warning message
2441    
2442            * po/README: New. Notes about the management of the translation
2443            files.
2444    
2445            * po/Makefile: New. Makefile to help manage the translation files.
2446    
2447            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2448    
2449            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2450            translations and support files in po/
2451    
2452            * setup.py (data_files): Add the *.mo files to the data_files too
2453    
2454            * README: Add note about the translations when building from CVS
2455    
2456    2003-04-14  Jonathan Coles   <[email protected]>
2457    
2458            * Thuban/UI/dock.py: Fixes some window resizing problems most
2459            noticable under windows. Always assume the button bitmaps will
2460            be there. Code clean up.
2461            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2462            images for the dock/undock button to the same images.
2463            Work around for RTbug #1801.
2464    
2465            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2466            be allowed to grow within the sizer. Fixes a bug under Windows
2467            where the toolbar wasn't being drawn.
2468    
2469    2003-04-14  Frank Koormann   <[email protected]>
2470    
2471            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2472            Updated design to try to make the button functionality more
2473            transparent.
2474    
2475    2003-04-14  Jonathan Coles   <[email protected]>
2476    
2477            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2478            finalize the intialization of the panel.
2479    
2480            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2481            creation of the panel. Should be the last thing called in the
2482            initializer of a subclass.
2483    
2484            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2485            set the current selections in the combo boxes. This is needed
2486            under Windows.
2487    
2488            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2489            level panel to the dialog so that the background colors are
2490            consistent under Windows.
2491    
2492    2003-04-11  Jonathan Coles   <[email protected]>
2493    
2494            * Thuban/UI/classgen.py: Change color ramps to start at white
2495            not black.
2496    
2497            * Thuban/UI/legend.py: Enable/disable the legend buttons when
2498            the legend changes. Fixes RTbug #1793.
2499    
2500            * test/test_classification.py: Added test for copying of
2501            classifications.
2502    
2503    2003-04-11  Jonathan Coles   <[email protected]>
2504    
2505            * Thuban/UI/resource.py: New. Centralize the loading of resources
2506            such as bitmaps.
2507    
2508            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2509            added images to the move buttons, added 'reverse' button.
2510            (CustomRampPanel.__init__): Added images to the move buttons.
2511            (GreyRamp): New. Generates a ramp from white to black.
2512            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2513    
2514            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2515            ID_PROPERTY_*.
2516            (Classifier.__init__): Minor changes to the layout.
2517            (Classifier._OnTitleChanged): Listen for when the user edits the
2518            title and update the dialog's title and the layer's title.
2519    
2520            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2521    
2522            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2523            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2524            if the layer's title changes.
2525    
2526            * Thuban/UI/mainwindow.py: Added new menu item and associated code
2527            to open a dialog to rename the map.
2528            (MainWindow): Use new resource class to import bitmaps.
2529    
2530    2003-04-11  Jonathan Coles   <[email protected]>
2531    
2532            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2533            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2534            Resources/Bitmaps/group_use_none.xpm,
2535            Resources/Bitmaps/group_use_not.xpm,
2536            Resources/Bitmaps/hide_layer.xpm,
2537            Resources/Bitmaps/layer_properties.xpm,
2538            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2539            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2540            New.
2541    
2542  2003-04-10  Jonathan Coles   <[email protected]>  2003-04-10  Jonathan Coles   <[email protected]>
2543    
2544          * Thuban/Model/classification.py: (ClassGroupRange.__init__):          * Thuban/Model/classification.py: (ClassGroupRange.__init__):

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26