/[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 1112 by bh, Fri May 30 09:55:04 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]>  2003-05-30  Bernhard Herzog  <[email protected]>
536    
537          * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the          * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26