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

Legend:
Removed from v.897  
changed lines
  Added in v.1487

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26