/[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 46 by bh, Fri Sep 7 15:00:33 2001 UTC branches/greater-ms3/thuban/ChangeLog revision 1366 by bh, Thu Jul 3 13:24:28 2003 UTC
# Line 1  Line 1 
1    2003-07-03  Bernhard Herzog  <[email protected]>
2    
3            Backport from HEAD
4    
5            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6            Update doc-string
7            (TransientJoinedTable.create): Do not modify the column objects of
8            the input tables in place and copy all columns of the input tables
9            into the joined table after all.
10    
11            * test/test_transientdb.py
12            (TestTransientTable.test_transient_joined_table_same_column_name):
13            Update to reflect the new behavior
14            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
15            Update to reflect the new behavior
16            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
17            New test case for a bug which modified the column objects in place
18    
19    2003-07-01  Frank Koormann   <[email protected]>
20    
21            Backport from HEAD
22    
23            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
24            Reverse List of layers to render in same order as in desktop legend.
25    
26    2003-06-25  Jonathan Coles   <[email protected]>
27    
28            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
29            of the SelectPropertiesDialog should be self so the window
30            appears on top.
31            (ClassGroupPropertiesCtrl.DoEdit): The parent
32            of the SelectPropertiesDialog should be self so the window
33            appears on top.
34    
35    2003-06-18  Frank Koormann  <[email protected]>
36    
37            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
38            scale if projection is latlong to get better estimate.
39    
40    2003-06-17  Jonathan Coles   <[email protected]>
41                                                                                    
42            Backport from HEAD.
43    
44            The view should respond to layer projection
45            changed events to update the display. Changes to a projection
46            should not cause the map to be set to full extent.
47    
48            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
49            current_map_proj to remember the current map projection so that
50            when the projection changes we know what the previous projection
51            was.
52            (MapCanvas.SetMap): Unsubscribe and subscribe to
53            LAYER_PROJECTION_CHANGED events.
54            (MapCanvas.projection_changed): Split into two methods that respond
55            to map and layer projection changes.
56            (MapCanvas.map_projection_changed): New. Takes the current view and
57            projects it using the new projection. This does not cause the
58            map to be redrawn at full extent.
59            (MapCanvas.layer_projection_changed): New. Cause a redraw which
60            will draw each layer in its new projection.
61    
62    2003-06-16  Frank Koormann  <[email protected]>
63    
64            Fix problem of hidden properties dialog under windows after double
65            click on layer tree:
66            The tree control always gets an Expanded / Collapsed event after
67            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
68            raises the already displayed window.
69    
70            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
71            raiseProperties initialized to prevent endless loops
72            (LegendTree._OnItemActivated): Depending on self.raiseProperties
73            simply raise the properties or open the dialog and issue a second
74            event.
75    
76    2003-06-16  Frank Koormann  <[email protected]>
77    
78            * Thuban/UI/view.py (MapCanvas.set_view_transform): Set max_scale to
79            2147483648.0 / max_len (which is sufficient for GREAT-ER).
80            For HEAD in the future a more flexible concept has to be developed
81            determining the rendering of "large" objects.
82    
83    2003-06-16  Jonathan Coles   <[email protected]>
84    
85            Backport from HEAD.
86    
87        Fix a problem under Windows whereby if the user double-clicks on a
88        layer in the legend that tree item will expand or collapse as well
89        as open the layer properties dialog. The state of the tree item
90        should not be affected.
91    
92        * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
93        preventExpandCollapse and subscribe to expanding and collapsing
94        events.
95        (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
96        collapsing events and will veto the event if it has been triggered
97        by the user double clicking on a layer.
98        (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
99        that an expanding/collapsing event should be vetoed.
100            
101    2003-06-13  Bernhard Herzog  <[email protected]>
102    
103            Backport from HEAD.
104    
105            * Thuban/UI/classifier.py (Classifier.map_layers_removed)
106            (Classifier.layer_shapestore_replaced, Classifier.OnClose):
107            Unsubscribe the messages in OnClose and not in map_layers_removed
108            or layer_shapestore_replaced to make sure it always happens when
109            the dialog is closed.
110    
111    2003-06-13  Jonathan Coles   <[email protected]>
112    
113            [NOTE: This is a back-port from the current CVS head]
114    
115            This puts back a fix for Windows where a panel is needed so that
116            the background of the table view appears correctly.
117    
118            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
119            object that can be used by derived classes to place any
120            controls (including the grid) onto.
121            (QueryTableFrame.__init__): Use the panel as the parent window
122            for all the controls. Reparent the grid so that the panel is
123            the parent. Call UpdateStatusText() to correctly initialize
124            the status bar.
125    
126            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
127            from wxFrame (as opposed to wxDialog like the other classes)
128            but otherwise behaves like the other classes. This is needed
129            for the TableView which isn't really a dialog and needs to
130            have a status bar and control buttons.
131    
132            [NOTE: This is a back-port from the current CVS head]
133    
134            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
135            instance variable to keep track of how many rows are selected.
136            Subscribe once to the the events we are interested in.
137            (ThubanGrid.OnRangeSelect): Only handle event if event handling
138            hasn't been turned off.
139            (ThubanGrid.OnSelectCell): Only handle event if event handling
140            hasn't been turned off.
141            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
142            as an event listener (which changes the event handler stack)
143            simply set an instance variable to False. This is checked in
144            the event handlers.
145            (ThubanGrid.GetNumberSelected): Return the number of currently
146            selected rows.
147            (TableFrame): Inherit from ThubanFrame so we can have a
148            status bar and control buttons.
149            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
150            Explicitly set which items are selected in the operator choice and
151            action choice so there is always a valid selection. Fixes RTbug #1941.
152            Subscribe to grid cell selection events so we can update the
153            status bar.
154            (QueryTableFrame.UpdateStatusText): Update the status bar with
155            how many rows are in the grid, how many columns, and how many
156            rows are selected.
157            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
158            Call UpdateStatusText when cells are (de)selected.
159            (QueryTableFrame.OnQuery): Use the string value in the value
160            combo if either the selected item index is 0 or if the string
161            cannot be found in the predefined list (this happens if the
162            user changes the text). Fixes RTbug #1940.
163            Only turn off the grid event listeners if there a query comes
164            back with a none empty list of ids. in the case that the list
165            is empty this causes a grid.ClearSelection() call to actually
166            clear the grid selection which causes the selected items in
167            the map to be deselected. Fixes RTbug #1939.
168    
169    2003-06-13  Bernhard Herzog  <[email protected]>
170    
171            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
172            self.selected_shape with the current selection to make sure the
173            contents of the dialog are up to date when it's shown for the
174            first time.
175            The dialog used to work without this by luck. The recent fix to
176            the connector module 'broke' a 'feature' the identify view was
177            relying on, i.e that subscribing to a message in response to
178            receiving a message of that type would mean that the new
179            subscriber would also be called for the same message.
180    
181    2003-06-12  Jonathan Coles   <[email protected]>
182    
183            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
184            the scalebar if the current map has no projection set.
185    
186            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
187            projfilepath label to just the basename of the projection file
188            rather than include the entire path.
189    
190    2003-06-11  Frank Koormann  <[email protected]>
191    
192            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
193            update.
194    
195    2003-06-11  Frank Koormann  <[email protected]>
196    
197            * Thuban/Lib/fileutil.py (get_application_dir): New function to
198            determine the absolute .thuban/thuban directory under
199            "posix" (os.expanduser) and "nt" (read AppData registry key).
200    
201            * Thuban/Model/resource.py: Use get_application_dir
202    
203            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
204            Use get_application_dir.
205    
206    2003-06-10  Bernhard Herzog  <[email protected]>
207    
208            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
209            the messages MAP_LAYERS_REMOVED messages
210            (LayerTableFrame.OnClose): Unsubscribe from it.
211            (LayerTableFrame.map_layers_removed): New. Receiver for
212            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
213            dialog is showing is removed.
214    
215    2003-06-10  Bernhard Herzog  <[email protected]>
216    
217            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
218            of the receivers list so that unsubscribing in a receiver doesn't
219            modify it while iterating over it.
220    
221            * test/test_connector.py
222            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
223            unsubscribing in a receiver works correctly. See docstring for
224            details
225    
226    2003-06-10  Bernhard Herzog  <[email protected]>
227    
228            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
229            message.
230    
231            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
232            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
233            LAYER_CHANGED will still be sent if the classification changes.
234    
235            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
236            parameter so we can subscribe to some of its messages
237            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
238            and the layer's LAYER_SHAPESTORE_REPLACED
239            (Classifier.unsubscribe_messages): New. Unsubscribe from message
240            subscribed to in __init__
241            (Classifier.map_layers_removed)
242            (Classifier.layer_shapestore_replaced): receivers for the messages
243            subscribed to in __init__. Unsubscribe and close the dialog
244    
245            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
246            the map to the Classifier dialog
247    
248            * test/test_layer.py (SetShapeStoreTests): Derive from
249            SubscriberMixin as well so we can test messages
250            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
251            messages
252            (SetShapeStoreTests.tearDown): Clear the messages again
253            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
254            for the modified flag too
255            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
256            to check whether SetShapeStore sets the modified flag
257            (SetShapeStoreTests.test_set_shape_store_different_field_name)
258            (SetShapeStoreTests.test_set_shape_store_same_field)
259            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
260            Add tests for the messages. This checks both the new
261            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
262    
263    2003-06-06  Jan-Oliver Wagner <[email protected]>
264    
265            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
266            the menu items.
267    
268    2003-06-05  Frank Koormann  <[email protected]>
269    
270            * Thuban/UI/identifyview.py (IdentifyView.__init__):
271            Layout reimplemented without panel. Make life easier to fit the list
272            in the dialog.
273    
274    2003-06-05  Frank Koormann  <[email protected]>
275    
276            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
277            once on initialisation (Former implementation resulted in multiple
278            entries for each projection).
279            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
280            if set, select the projection found under the specified name. This
281            overwrites any other selection estimate.
282            Removed projchoice filling from this method.
283            (ProjFrame._OnSave, ProjFrame._OnAddToList):
284            Updated call of ProjFrame.__FillAvailList
285            (LCCPanel._DoLayout): Moved parameter controls in more common order.
286    
287            * Resources/Projections/defaults.proj: Extended defaults representing
288            various common European projections.
289    
290    2003-06-05  Frank Koormann  <[email protected]>
291    
292            * Thuban/UI/identifyview.py (IdentifyView.__init__):
293            Use ListCtrl instead of GridCtrl
294    
295            * Thuban/Model/resource.py:
296            Guess location of .thuban directory from tempdir parent directory.
297    
298            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
299            Guess location of .thuban directory from tempdir parent directory.
300    
301    2003-06-04  Bernhard Herzog  <[email protected]>
302    
303            Do not cache the values returned by the tree widget's
304            GetFirstChild and GetNextChild methods because it led to lots of
305            segfaults. The new way requires more brute force but is more
306            reliable.
307    
308            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
309            variable layer2id
310            (LegendTree.find_layer): New method to do with brute force what
311            layer2id tried to accomplish
312            (LegendTree._OnMsgLayerChanged)
313            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
314            Use find_layer instead of layer2id
315            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
316            update layer2id anymore
317            (LegendTree._OnMsgMapLayersRemoved)
318            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
319    
320    2003-06-03  Thomas Koester  <[email protected]>
321    
322            * Thuban/Model/classgen.py (GenQuantiles0): New function.
323    
324    2003-06-02  Bernhard Herzog  <[email protected]>
325    
326            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
327            New commands.
328            (main_menu): Add the new commands.
329            (MainWindow.TableRename): New. Implementation of the table_rename
330            command.
331            (MainWindow.RenameLayer): New. Implementation of the layer_rename
332            command.
333    
334            * Thuban/Model/session.py (Session.AddTable): call self.changed to
335            set the modified flag
336    
337            * test/test_session.py (TestSessionSimple.test_add_table): Test
338            whether the modified flag is set properly
339    
340            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
341            instead of issue so that the modified flags get updated.
342    
343            * test/test_base.py (SomeTitledObject): Derive from Modifiable
344            instead of Publisher to reflect reality better and to accomodate
345            the fact that SetTitle now calls changed instead of issue
346    
347    2003-06-02  Bernhard Herzog  <[email protected]>
348    
349            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
350            acquisition has to happen before the try in a try-finally.
351    
352    2003-06-02  Bernhard Herzog  <[email protected]>
353    
354            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
355            possible that a layer is removed that is not currently selected in
356            the legend so don't check for this.
357    
358    2003-05-30  Bernhard Herzog  <[email protected]>
359    
360            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
361            variables to None that have direct or indirect references to
362            shapefiles or dbf files to make sure that they do go away and the
363            files are closed.
364    
365    2003-05-30  Bernhard Herzog  <[email protected]>
366    
367            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
368            availImgListIndices when a new image list is created
369            
370    2003-05-30  Bernhard Herzog  <[email protected]>
371    
372            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
373            changing_selection to indicate whether the LegendTree code itself
374            is currently changing the selection
375            (LegendTree.normalize_selection): New method to normalize the
376            selection by selecting the layer item even if the user clicked on
377            the classification.
378            (LegendTree._OnSelChanged): normalize the selection. This works
379            around a bug in wx which doesn't keep track of the selection
380            properly when subtrees are deleted.
381    
382    2003-05-30  Bernhard Herzog  <[email protected]>
383    
384            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
385            maximum and minimum scale factors.
386    
387            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
388            changes in classgen.py
389    
390    2003-05-30  Jonathan Coles   <[email protected]>
391    
392            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
393            all the methods functions. Fixes RTBug #1903.
394    
395            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
396            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
397            RTBug #1907.
398    
399            * Thuban/UI/classgen.py: Use classgen functions that were part
400            of the ClassGenerator class. Put try/finally blocks around
401            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
402            RTBug #1904.
403    
404            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
405    
406            * Thuban/UI/legend.py: The legend was cleared and repopulated any
407            time something changed which caused some state to be lost such
408            as which children were expanded or collapsed. Fixes RTBug #1901.
409            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
410            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
411            the legend but not in the map.
412            (LegendTree.__FillTree): Move main functionality out into smaller
413            methods that can be used by other methods.
414            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
415            if they are available.
416            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
417            that we override the wxTreeCtrl method. Iterate over children
418            and call __RemoveLayer.
419            (LegendTree.__AddLayer): New. Add a new layer to the legend.
420            (LegendTree.__RemoveLayer): Remove a layer from the legend.
421            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
422            Should only be called with the id of a layer branch.
423            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
424            Returns the root item or creates one if necessary.
425    
426            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
427            ProjectRasterFile with tuple arguments instead of strings.
428    
429            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
430            with try/finally. Fixes RTBug #1904.
431    
432            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
433            with try/finally. Fixes RTBug #1904.
434            (MapCanvas.FitSelectedToWindow): If a single point is selected
435            simply center it on the display. Fixes RTBug #1849.
436    
437            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
438            to be compiled as a standalone app. Now the code can only be
439            called from Python which simplifies the parameter passing.
440            (ProjectRasterFile): Handle Python arguments. Remove code that
441            checks for a destination dataset. Add more clean up code.
442    
443            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
444            TestMapWithContents.test_lower_layer_bottom):
445            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
446            Fixes RTBug #1907.
447    
448            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
449            extent to the map when the legend is toggled. Fixes RTBug #1881.
450    
451    2003-05-29  Jan-Oliver Wagner <[email protected]>
452    
453            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
454            unsubscribes all that is subcribed in __init__.
455    
456    2003-05-28  Bernhard Herzog  <[email protected]>
457    
458            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
459            (MainWindow.CanDuplicateLayer): New methods to implement the
460            Layer/Duplicate command.
461            (layer_duplicate command): New.
462            (main_menu): Add layer_duplicate to the Layer menu.
463    
464    2003-05-28  Bernhard Herzog  <[email protected]>
465    
466            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
467            renderer so that NULL/None values get displayed differently (by a
468            gray rectangle).
469            (TableGrid.__init__): Override the default renderers
470    
471    2003-05-28  Bernhard Herzog  <[email protected]>
472    
473            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
474            classification to "None" if the type of the field has changed.
475    
476            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
477            test for the Layer.SetShapeStore method
478    
479    2003-05-28  Jan-Oliver Wagner <[email protected]>
480    
481            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
482            does not necessarily have a filename).
483    
484    2003-05-28  Jan-Oliver Wagner <[email protected]>
485    
486            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
487            sort the selection list for the dialog.
488    
489    2003-05-28  Frank Koormann  <[email protected]>
490    
491            * extensions/thuban/wxproj.cpp
492            (project_point): Removed cast to int for projected point coordinates.
493            (shape_centroid): Return last point if all polygon vertices fall
494            to one point.
495    
496    2003-05-28  Bernhard Herzog  <[email protected]>
497    
498            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
499            with layers that don't have shapestores, i.e. raster layers.
500    
501    2003-05-28  Bernhard Herzog  <[email protected]>
502    
503            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
504            when determining the title from the filename.
505    
506            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
507            reflect changes in the way the title is derived from the filename
508    
509    2003-05-28  Frank Koormann  <[email protected]>
510    
511            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
512            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
513    
514    2003-05-27  Bernhard Herzog  <[email protected]>
515    
516            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
517            delegate SelectedLayer.
518            (MainWindow.LayerUnjoinTable): Implement.
519            (_can_unjoin): New. Helper function for the sensitivity of the
520            layer/unjoin command.
521    
522            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
523            (DerivedShapeStore.OrigShapeStore): New. Return the original
524            shapestore. Used to figure out how to unjoin.
525            (DerivedShapeStore.Shapefile): Fix a typo.
526    
527    2003-05-27  Bernhard Herzog  <[email protected]>
528    
529            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
530            well
531            (JoinDialog.__init__): Use the layer parameter and only build the
532            left choice when a layer is given
533            (JoinDialog.OnJoin): Handle layer joins as well
534            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
535            that the user selects the "Select..." item. The sensitivitly
536            updating is now in update_sensitivity
537            (JoinDialog.y): New method to refactor the sensitivity update of
538            the join button into its own method.
539    
540            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
541    
542    2003-05-27  Bernhard Herzog  <[email protected]>
543    
544            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
545            iff there are unreferenced tables in the session
546    
547    2003-05-27  Bernhard Herzog  <[email protected]>
548    
549            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
550    
551            * Thuban/Model/session.py (Session.UnreferencedTables): New method
552            to return tables that are not referenced by other tables or shape
553            stores and can be removed.
554            (Session.RemoveTable): Issue a TABLE_REMOVED message after
555            removing the table
556    
557            * Thuban/UI/mainwindow.py: Remove unused imports
558            (MainWindow.TableClose): Implement.
559    
560            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
561            messages so that the frame will be automatically closed when a new
562            session is opened or the table is removed.
563            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
564            __init__
565            (TableFrame.close_on_session_replaced)
566            (TableFrame.close_on_table_removed): New. Subscribers that close
567            the window
568    
569            * test/test_session.py (TestSessionMessages.test_remove_table)
570            (TestSessionSimple.test_remove_table): Move the test to
571            TestSessionSimple and add test for the TABLE_REMOVED message
572            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
573            (TestSessionSimple.test_unreferenced_tables) New. Test for the
574            UnreferencedTables method.
575            (UnreferencedTablesTests): New. Class with some more sophisticated
576            tests for UnreferencedTables.
577    
578    2003-05-27  Frank Koormann  <[email protected]>
579    
580            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
581            display has some unwanted side effects. Removed again.
582    
583    2003-05-27  Frank Koormann  <[email protected]>
584    
585            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
586    
587            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
588    
589    2003-05-27  Jan-Oliver Wagner <[email protected]>
590    
591            * test/test_menu.py (MenuTest.test): Added test for
592            Menu.RemoveItem().
593    
594            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
595            the menu.
596    
597    2003-05-27  Frank Koormann  <[email protected]>
598            
599            Nonmodal dialogs without parent (i.e. they can fall behind the main
600            window)
601    
602            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
603            all dialogs in the dialogs dictionary and the canvas.
604    
605            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
606            parent, i.e. can fall behind other windows.
607            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
608            dictionary before removing it.
609    
610            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
611    
612            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
613            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
614            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
615    
616    2003-05-27  Bernhard Herzog  <[email protected]>
617    
618            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
619            tableview dialog
620            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
621            Also, don't use the table's titles as the dialog names. The titles
622            aren't guaranteed to be unique.
623            (MainWindow.TableOpen): Open a table view dialog after opening the
624            table
625    
626    2003-05-27  Bernhard Herzog  <[email protected]>
627    
628            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
629            effect can be achieved by simply closing the window showing the
630            table.
631            (MainWindow.TableHide): Removed.
632            (main_menu): Removed "table_hide"
633    
634    2003-05-27  Frank Koormann  <[email protected]>
635    
636            Fix legend tree display problems under Win32
637    
638            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
639            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
640            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
641    
642            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
643    
644    2003-05-27  Jan-Oliver Wagner <[email protected]>
645    
646            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
647            'after' now allows to insert separators almost anywhere in the menu.
648    
649    2003-05-27  Frank Koormann  <[email protected]>
650    
651            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
652            "S" of selection box label to hint on hot key (Alt-S). Works under
653            Win32 but is ignored under GTK.
654    
655    2003-05-26  Frank Koormann  <[email protected]>
656    
657            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
658            Center Choices.
659    
660    2003-05-26  Bernhard Herzog  <[email protected]>
661    
662            Remove the Precision methods again. They're too DBF specific to be
663            part of the table interface and they're only used in table_to_dbf
664            anyway.
665            
666            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
667            fixed precision of 12 for doubles.
668            (TransientTableBase.Precision): Removed
669            (AutoTransientTable.Width): Delegate to self.table.
670    
671            * Thuban/Model/table.py (DBFTable.Precision)
672            (MemoryTable.Precision): Removed.
673            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
674            (table_to_dbf): Use a fixed precision of 12 for floats unless the
675            column object specifies something else.
676    
677            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
678            test for table_to_dbf
679    
680    2003-05-26  Bernhard Herzog  <[email protected]>
681    
682            * test/test_transientdb.py
683            (TestTransientTable.run_iceland_political_tests): Fix a comment.
684    
685    2003-05-26  Bernhard Herzog  <[email protected]>
686    
687            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
688            implementation. Mark parts of the file format strings for
689            localization.
690    
691            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
692            file and add the table to the tables managed by the session
693    
694            * test/test_session.py (TestSessionSimple.test_open_table_file):
695            New. test case for OpenTableFile
696    
697    2003-05-26  Jan-Oliver Wagner <[email protected]>
698    
699            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
700            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
701            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
702            Replace the true/false of wxWindows by True/False of Python 2.2.1.
703    
704    2003-05-26  Jan-Oliver Wagner <[email protected]>
705    
706            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
707            already a selection present, update the grid accordingly.
708    
709            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
710            resizeable and increase its initial size.
711    
712    2003-05-26  Frank Koormann  <[email protected]>
713    
714            Table export functionality
715    
716            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
717            Return width (in characters) for a column.
718            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
719            (table_to_dbf): Write table to dbf file.
720            (table_to_csv): Write table to csv file.
721    
722            * Thuban/Model/transientdb.py (TransientTableBase.Width,
723            TransientTableBase.Precision): Return column width and precision.
724    
725            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
726            or table_to_csv depending on file selection.
727    
728            * test/test_dbf_table.py:
729            Test table_to_dbf (extension of former part of test).
730    
731            * test/test_csv_table.py:
732            Test table_to_csv.
733    
734    2003-05-23  Jan-Oliver Wagner <[email protected]>
735    
736            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
737            Use QueryTableFrame instead of TableFrame.
738    
739            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
740            table window with 'Layer Table:' instead of 'Table:'.
741    
742    2003-05-23  Jan-Oliver Wagner <[email protected]>
743    
744            Give all tables a title via mix-in TitledObject.LayerShowTable
745    
746            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
747            only if it exists.
748    
749            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
750            and call its init-method with a default title. Remove Title() method.
751    
752            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
753            AutoTransientTable): mix-in TitledObject and call its init-method with
754            a default title. Remove Title() method.
755    
756    2003-05-23  Bernhard Herzog  <[email protected]>
757    
758            * Thuban/Model/session.py (Session.AddShapeStore): Define
759            AddShapeStore analogously to AddTable.
760    
761            * test/test_session.py (TestSessionSimple.test_add_shapestore):
762            New. Test for AddShapeStore
763    
764    2003-05-23  Jan-Oliver Wagner <[email protected]>
765    
766            Introducing QueryTableFrame and a very coarse ShowTable implementation.
767    
768            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
769            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
770            The latter implements the selection GUI without dependency on a layer.
771            LayerTableFrame now is derived from QueryTableFrame and connects
772            to a layer.
773    
774            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
775            implementation that still needs work.
776    
777            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
778    
779    2003-05-22  Frank Koormann  <[email protected]>
780    
781            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
782            Added "outer_join = False" as optional parameter.
783            (TransientJoinedTable.create): If outer join is true, perform a
784            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
785            the left table. Records not matching are filled with 0 / None.
786    
787            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
788            (JoinDialog.OnJoin): Consider outer join check box.
789    
790    2003-05-22  Bernhard Herzog  <[email protected]>
791    
792            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
793            somewhat safer way. Storing the traceback in a local variable can
794            lead to memory leaks
795    
796    2003-05-22  Bernhard Herzog  <[email protected]>
797    
798            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
799            the wxMessageDialog's Destroy() method.
800    
801    2003-05-22  Frank Koormann  <[email protected]>
802    
803            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
804            TransientTable.Title()
805    
806    2003-05-22  Frank Koormann  <[email protected]>
807    
808            Join Dialog, initial version.
809    
810            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
811    
812            * Thuban/UI/join.py (JoinDialog): Functional implementation of
813            former framework. Renamed Table1/Table2 to LeftTable/RightTable
814            in all occurences.
815    
816            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
817            Typo fixed.
818    
819    2003-05-22  Bernhard Herzog  <[email protected]>
820    
821            Give the tables titles so that the GUI can display more meaningful
822            names. For now the titles are fixed but depend on e.g. filenames
823            or the titles of the joined tables.
824    
825            * Thuban/Model/transientdb.py (TransientTable.Title)
826            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
827    
828            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
829    
830            * test/test_transientdb.py
831            (TestTransientTable.test_auto_transient_table_title): New. Test
832            for the Title method
833            (TestTransientTable.test_transient_joined_table)
834            (TestTransientTable.test_transient_table): Add test for the Title
835            methods
836    
837            * test/test_memory_table.py (TestMemoryTable.test_title): New.
838            Test for the Title method
839    
840            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
841            the Title method
842    
843    2003-05-22  Bernhard Herzog  <[email protected]>
844    
845            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
846            Provide a better way to destroy the layers
847            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
848            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
849            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
850            the new way to destroy the layers.
851            (TestLayer.test_derived_store): New. Test for using a layer with a
852            DerivedShapeStore
853    
854            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
855            filename if the shape store actually has one.
856    
857    2003-05-22  Bernhard Herzog  <[email protected]>
858    
859            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
860            for the filename
861    
862            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
863            for the FileName method
864            (TestDBFTableWriting.test_write): Fix spelling of filename
865    
866    2003-05-22  Thomas Koester  <[email protected]>
867    
868            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
869            from SciParam that now really is immutable.
870    
871    2003-05-22  Frank Koormann  <[email protected]>
872    
873            Layer Top/Bottom placement added to legend.
874    
875            * Thuban/UI/legend.py
876            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
877            bound to tool events.
878            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
879            New, methods binding the event methods with the map methods.
880    
881            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
882            layer at top/bottom of layer stack.
883    
884            * Resources/Bitmaps/top_layer.xpm: New button icon.
885    
886            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
887    
888    2003-05-22  Bernhard Herzog  <[email protected]>
889    
890            * Thuban/Model/session.py (Session.RemoveTable): New method to
891            remove tables
892    
893            * test/test_session.py (TestSessionSimple.test_remove_table): New.
894            Test for RemoveTable
895    
896    2003-05-22  Thomas Koester  <[email protected]>
897    
898            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
899            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
900    
901    2003-05-22  Bernhard Herzog  <[email protected]>
902    
903            Implement a way to discover dependencies between tables and
904            shapestores.
905    
906            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
907            (TransientJoinedTable.Dependencies)
908            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
909            interface
910            (TransientJoinedTable.__init__): Keep tack of the original table
911            objects in addition to the corresponding transient tables.
912    
913            * Thuban/Model/table.py (DBFTable.Dependencies)
914            (MemoryTable.Dependencies): New. Implement the dependencies
915            interface
916    
917            * Thuban/Model/data.py (ShapeTable): New. Helper class for
918            ShapefileStore
919            (ShapefileStore.__init__): Use ShapeTable instead of
920            AutoTransientTable
921            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
922            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
923            methods for filename and type
924            (ShapefileStore.Dependencies): New. Implement the dependencies
925            interface
926            (DerivedShapeStore): New class to replace SimpleStore. The main
927            difference to SimpleStore is that it depends not on a shapefile
928            but another shapestore which expresses the dependencies a bit
929            better
930            (SimpleStore.__init__): Add deprecation warning.
931    
932            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
933            Test for the Dependencies method.
934    
935            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
936            New. Test for the Dependencies method.
937    
938            * test/test_transientdb.py
939            (TestTransientTable.test_auto_transient_table_dependencies): New.
940            Test for the Dependencies method.
941            (TestTransientTable.test_transient_joined_table): Add test for the
942            Dependencies method.
943    
944            * test/test_session.py (TestSessionSimple.setUp)
945            (TestSessionSimple.tearDown): New. Implement a better way to
946            destroy the sessions.
947            (TestSessionSimple.test_initial_state)
948            (TestSessionSimple.test_add_table): Bind session to self.session
949            so that it's destroyed by tearDown
950            (TestSessionSimple.test_open_shapefile): New. Test for
951            OpenShapefile and the object it returns
952    
953    2003-05-22  Bernhard Herzog  <[email protected]>
954    
955            * Thuban/Model/session.py (Session.AddTable): New method to
956            register tables with the session.
957            (Session.Tables): Return the tables registered with AddTable too.
958    
959            * test/test_session.py (TestSessionSimple.test_add_table): New.
960            Test case for the AddTable method
961    
962    2003-05-22  Frank Koormann  <[email protected]>
963    
964            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
965            lower right corner, center labels for selections, initialize controls
966            in reasonable order for keyboard navigation.
967    
968            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
969            (ProjFrame.__DoOnProjAvail): Determine position of current projection
970            using the wxListBox.FindString() method. Still a problem (#1886)
971    
972            * Thuban/UI/classifier.py
973            (Classifier.__init__, SelectPropertiesDialog.__init__)
974    
975            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
976            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
977            different classification types from here to __init__.
978            (GenUniquePanel.__init__): Set the column width of the first field
979            in the Field ListCtrl to the full width.
980    
981            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
982            Button to 'Export'. Center Buttons in Selection Box, set Focus to
983            Grid.
984            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
985            changes focus to the Selection when pressing "Alt-S".
986    
987            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
988            the text if not visible. The italic font sometimes exceeds the
989            rendering area.
990    
991    2003-05-21  Jonathan Coles   <[email protected]>
992    
993            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
994            to OnClose so that Thuban closes correctly.
995    
996            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
997            DockFrame.OnClose, not DockFrame._OnClose.
998    
999    2003-05-21  Jonathan Coles   <[email protected]>
1000    
1001            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1002            references to 'inf' and use new Range __init__ to pass floats
1003            directly rather than converting them to strings first.
1004            Fixes RTBug #1876.
1005    
1006            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1007            Use new Range ___init__ to pass floats.
1008    
1009            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1010            filename is a valid image file. Throw IOError otherwise.
1011    
1012            * Thuban/Model/range.py: Brought over new Range from SciParam that
1013            is immutable and has an __init__ which can accept floats.
1014    
1015            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1016            into try block. AddLayer doesn't throw any exceptions anymore.
1017            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1018            try block.
1019    
1020            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1021            the first item in choices. Fixes RTBug #1882.
1022    
1023            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1024            has gone to 0 which is a serious problem. abort.
1025            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1026            print the error from GDAL.
1027    
1028            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1029            ToggleEventListeners to turn on listening.
1030            (TableGrid.ToggleEventListeners): New. Turns event listening on
1031            and off so as to prevent excessive messages.
1032            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1033            to suppress excessive messages when selecting many rows.
1034            Fixes RTBug #1880.
1035    
1036            * Thuban/UI/view.py: Added checks against if scale == 0. This
1037            is a serious problem that can occur when an image without
1038            geo data is loading and causes the map projection bounds to
1039            go to infinity. Right now, the solution is to simply try
1040            to recover.
1041    
1042            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1043            to set the MFILEReceiver attributes even if the data is NULL.
1044    
1045            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1046            and passed GDAL messages back up to the Python layer. Also
1047            tried to fix some memory leaks that were present in the original
1048            utility but didn't matter because the program aborted.
1049    
1050            * test/test_range.py: Copied over tests from SciParam. Removed
1051            tests against importing. Fixes RTBug #1867.
1052    
1053    2003-05-21  Bernhard Herzog  <[email protected]>
1054    
1055            * test/test_load.py: Remove unused imports and restructure the
1056            test code
1057            (LoadSessionTest): Split into one class for each test and turn
1058            LoadSessionTest itself into the base class for all such session
1059            tests.
1060            (ClassificationTest): New base class for load tests that test
1061            classifications
1062            (TestSingleLayer, TestLayerVisibility, TestClassification)
1063            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1064            for the individual tests
1065    
1066            * test/support.py (FileLoadTestCase.filename): New base class for
1067            file loading tests
1068    
1069    2003-05-21  Jan-Oliver Wagner <[email protected]>
1070    
1071            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1072            Mercator' to 'UTM Zone 32' as a more convenient example.
1073            Added 'Gauss Krueger Zone 6'.
1074    
1075            * Data/iceland_sample_raster.thuban: political polygon now
1076            filled transparent to have the raster image visible at once.
1077    
1078    2003-05-21  Frank Koormann  <[email protected]>
1079    
1080            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1081            OnClose() to keep in sync with extensions. Internally Thuban
1082            still uses "underscored" names.
1083    
1084    2003-05-20  Jonathan Coles   <[email protected]>
1085    
1086            This puts back Raster layer support. These layers support projections
1087            through the GDAL library. Currently, the CVS version is being used.
1088            There are no Debian packages available although this may change soon.
1089            A GDAL driver was extended to support writing to memory rather to
1090            files.
1091    
1092            There is still some work that needs to be done, such as some error
1093            handling when loading invalid images or when there is a problem
1094            projecting the image. This putback simply checks in the majority
1095            of the work.
1096    
1097            * setup.py: Add gdalwarp library extension.
1098    
1099            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1100            Defaults to False, but can be overridden by subclasses if they
1101            support classification.
1102            (RasterLayer): New. Defines a new layer that represents an
1103            image.
1104    
1105            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1106            tag handler.
1107            (SessionLoader.start_layer): Encode the filename.
1108            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1109            New. Supports reading a rasterlayer tag.
1110    
1111            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1112    
1113            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1114            get a string in Latin1. If we get such as string convert it to
1115            unicode first, otherwise leave if alone before encoding.
1116            (SessionSaver.write_layer): Add support for writing both Layers
1117            and RasterLayers.
1118    
1119            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1120            The right argument may not be a string, it could also be a Column.
1121    
1122            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1123            Make initial window size 600x400. Fixes RTBug #1872.
1124    
1125            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1126            the dialog is constructed so that we can support layers that
1127            do not have classifications.
1128            (Classifier._OnTry): Only build a classification if the layer
1129            supports one.
1130    
1131            * Thuban/UI/legend.py: Change all checks that a layer is an
1132            instance of Layer into checks against BaseLayer.
1133            (LegendTree.__FillTreeLayer): Only add children to a branch if
1134            the layer supports classification.
1135    
1136            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1137            MainWindow.OpenSession): Don't proceed with an action if the
1138            user chooses Cancel when they are asked to save changes.
1139            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1140            user to select an image file. Create a new RasterLayer and add
1141            it to the map.
1142    
1143            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1144            for rendering RasterLayer layers.
1145            (MapRenderer.draw_raster_layer): Actually method that calls
1146            the GDALWarp python wrapper and constructs an image from the
1147            data returned.
1148    
1149            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1150            Choices symbols to match those used in the table query method.
1151            Replace deprecated method calls on table with new method names.
1152    
1153            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1154            how small the scale can get. This still needs more testing.
1155    
1156            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1157            Provides a driver to output in .bmp format.
1158    
1159            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1160            New. Provides IO routines which write to memory, rather than a file.
1161    
1162            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1163            of the gdalwarp utility provided in GDAL. Added function calls
1164            that can be accessed from python.
1165    
1166            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1167            a raster layer.
1168    
1169            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1170            layer image data.
1171    
1172            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1173    
1174            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1175            tests associated with the raster layer code.
1176    
1177            * test/test_transientdb.py
1178            (TestTransientTable.test_auto_transient_table_query): Added a test
1179            for using a Column object as the "right" parameter to a query.
1180    
1181    2003-05-19  Frank Koormann  <[email protected]>
1182    
1183            * Thuban/version.py (get_changelog_date):
1184            Catch exceptions if ChangeLog does not exist.
1185    
1186            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1187    
1188    2003-05-19  Frank Koormann  <[email protected]>
1189    
1190            Extended version information for Thuban
1191    
1192            * Thuban/version.py: New, version information for Thuban: Last
1193            modification date and last ChangeLog entry date.
1194    
1195            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1196            information: Display Thuban, wxPython and Python version.
1197    
1198    2003-05-16  Bernhard Herzog  <[email protected]>
1199    
1200            * Thuban/Model/save.py: Remove some unused imports including the
1201            __future__ import for nested_scopes as Thuban relies on Python 2.2
1202            now.
1203            (XMLWriter.encode): Remove the special case for a None argument.
1204            In the saver encode is always called with a string argument.
1205    
1206    2003-05-16  Bernhard Herzog  <[email protected]>
1207    
1208            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1209            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1210            of the bug was that e.g. float("1.2") would fail. Thuban now
1211            requires 2.4.x.
1212            
1213    2003-05-16  Frank Koormann   <[email protected]>
1214    
1215            Printing enhancement and WMF export (under Win32)
1216    
1217            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1218            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1219            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1220            PrintRender.
1221    
1222            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1223            to fullfil information needed for PrinterRenderer.
1224            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1225            (MapCanvas.Print): Adapted to new MapPrintout.
1226            (OutputTransform): General calculations to transform from canvas
1227            coordinates to export/printing devices.
1228    
1229            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1230            new method_command to call ExportMap, with platform dependency (only
1231            __WXMSW__)
1232      
1233            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1234            of scalebar drawing area as new parameters.
1235            
1236            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1237    
1238            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1239            Update to extended scalebar.DrawScalebar header.
1240    
1241            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1242    
1243            * test/test_scalebar.py: Made test executable as standalone.
1244    
1245    2003-05-16  Bernhard Herzog  <[email protected]>
1246    
1247            * Thuban/Model/table.py (Table): Remove this compatibility alias
1248            for DBFTable.
1249    
1250            * test/test_table.py: Import DBFTable as Table because that alias
1251            doesn't exist anymore.
1252    
1253            * Thuban/UI/classgen.py: Remove some unused imports
1254    
1255    2003-05-14  Jonathan Coles   <[email protected]>
1256    
1257            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1258            Fix docstring.
1259            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1260            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1261            values of the supplied range to determine the beginning and end
1262            bounds of the generated classes.
1263    
1264            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1265            do not have a leading 0 (.5 is now accepted as well as 0.5).
1266    
1267            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1268            call to ClassGenerator.GenUniformDistribution.
1269    
1270            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1271            layout bug with the 'Projection' label.
1272    
1273            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1274    
1275            * test/test_range.py: New. Imported from SciParam.
1276    
1277    2003-05-12  Jonathan Coles   <[email protected]>
1278    
1279            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1280            to table.UniqueValues() with calls that retrieve all the values
1281            from the table. This will need to be replaced by a method on table
1282            which can simply return the list (perhaps more efficiently).
1283    
1284    2003-05-12  Jonathan Coles   <[email protected]>
1285    
1286            The return value of ClassGenerator.CalculateQuantiles has changed.
1287            Refer to the documentation for details.
1288    
1289            * test/test_classgen.py: Modified Quantile tests to use the
1290            new return values.
1291    
1292            * Thuban/Model/classgen.py
1293            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1294            use new return values from CalculateQuantiles to produce the correct
1295            range bounds in the Classification.
1296            (ClassGenerator.CalculateQuantiles): Add more comments describing
1297            the return values and parameters. Make minor adjustments to improve
1298            the legibility of the code. Fix problem with adjusted not being set
1299            in most cases.
1300    
1301    2003-05-12  Frank Koormann <[email protected]>
1302            
1303            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1304            and latin1. Fixes #1851 finally.
1305    
1306    2003-05-09  Jonathan Coles   <[email protected]>
1307    
1308            * test/test_classgen.py: New. Tests the Quantile algorithm.
1309    
1310            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1311            Clean up debugging statement, add comments, fix a small bug in the
1312            returned adjusted percentiles.
1313            
1314    2003-05-09  Jonathan Coles   <[email protected]>
1315    
1316            Introduces Range class from SciParam into the ClassGroupRange class,
1317            and such ranges can now be saved and loaded from disk.
1318    
1319            Quantiles are now available in the Classification Generator.
1320    
1321            Initial support for building Queries on a table. Doesn't do anything
1322            but run some tests.
1323    
1324            * Thuban/Model/classification.py: Explicit imports.
1325            (ClassGroupRange): Use the Range class to store the underlying
1326            range information. The interface remains the same, except for
1327            GetRange(), and you can also supply a Range object as the min
1328            parameter to SetRange or __init__.
1329    
1330            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1331            string appropriately for use in Thuban. Fixes RTbug #1851.
1332            (SessionLoader.end_projection): Handle the context of the
1333            projection tag a bit better by looking at what objects are not
1334            None. There was an assumption that a projection tag for a map
1335            could occur before any layers.
1336            (SessionLoader.start_clrange): Provide backward compatibility for
1337            reading min/max values as well as the new range parameter.
1338    
1339            * Thuban/Model/map.py: Explicit imports.
1340    
1341            * Thuban/Model/resource.py: Import _.
1342            (ProjFileSaver.write): write header using projfile.dtd.
1343    
1344            * Thuban/Model/save.py: Explicit imports.
1345            (XMLWriter.encode): New. Encode the given string from a format
1346            used by Thuban into UTF-8. Fixes RTbug #1851.
1347    
1348            * Thuban/UI/classgen.py: Explicit imports.
1349            (ClassGenDialog.__init__): Clean up the code and add support
1350            for Quantiles.
1351            (ClassGenDialog.OnOK): Add support for Quantiles.
1352            (GenQuantilesPanel): New. Input panel for Quantiles.
1353            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1354            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1355    
1356            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1357    
1358            * Thuban/UI/classifier.py: Explicit imports.
1359            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1360            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1361    
1362            * Thuban/UI/legend.py: Explicit imports.
1363    
1364            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1365            a Table menu and associated method calls.
1366            (MainWindow.choose_color): Removed. No longer needed.
1367    
1368            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1369            should be disabled if no projection is selected in the available
1370            list.
1371    
1372            * Thuban/UI/renderer.py: Explicit imports.
1373    
1374            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1375            with correctly selecting the rows and issuing the right events.
1376            Be sure to call Skip() to allow the grid to do some of its own
1377            handling which allows the rows to actually be selected.
1378            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1379            selecting multiple shapes.
1380            (LayerTableFrame): Support for building Queries.
1381            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1382    
1383            * Thuban/UI/tree.py: Explicit imports.
1384    
1385            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1386            table view can call it.
1387    
1388            * test/test_classification.py: Explicit imports.
1389            (TestClassification.test_ClassGroupRange): Fix test for new
1390            Range class.
1391    
1392            * Doc/thuban.dtd: Add range parameter for clrange.
1393    
1394            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1395            object in ClassGroupRange, and also uesd for inputting ranges in
1396            the classifer table and elsewhere.
1397    
1398            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1399            yet.
1400    
1401    2003-05-09  Frank Koormann <[email protected]>
1402    
1403            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1404    
1405    2003-05-08  Frank Koormann <[email protected]>
1406    
1407            Coding style updates
1408    
1409            * test/test_scalebar.py: Replaced tab indentation by spaces.
1410    
1411            * Thuban/UI/scalebar.py: Explicit imports.
1412    
1413    2003-05-08  Frank Koormann <[email protected]>
1414    
1415            * Thuban/UI/scalebar.py
1416            (ScaleBar.DrawScalebar): Format string bug fixed.
1417    
1418    2003-05-08  Frank Koormann <[email protected]>
1419    
1420            Reorganization of scalebar component (no wx in Thuban/Model)
1421    
1422            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1423            (deriveInterval):
1424            Calculate scalebar interval and unit which fits in width for scale.
1425            (roundInterval): Round float.
1426    
1427            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1428    
1429            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1430    
1431            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1432    
1433    2003-05-08  Frank Koormann <[email protected]>
1434    
1435            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1436            Initialize ScaleBar with canvas.map
1437    
1438            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1439            round intervals to display smarter lengths
1440            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1441            layer. If the maps has no projection applied grey the scalebar.
1442    
1443    2003-05-07  Frank Koormann <[email protected]>
1444            
1445            Basic Scalebar features added.
1446    
1447            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1448    
1449            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1450            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1451            and the renderer.
1452    
1453            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1454    
1455            * Thuban/UI/messages.py: SCALE_CHANGED added.
1456    
1457    2003-05-07  Bernhard Herzog  <[email protected]>
1458    
1459            * Thuban/Model/session.py (Session.__init__): New instance
1460            variable shapestores to hold a list of all open shapestore objects
1461            (Session.ShapeStores): New. Accessor method for the shapestores
1462            list.
1463            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1464            Internal methods to maintain the shapestores list.
1465            (Session.Tables): New. Return all tables open in the session.
1466            (Session.OpenShapefile): Insert the new ShapeStore into the
1467            shapestores list.
1468    
1469            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1470            tests for ShapeStores and Tables
1471            (TestSessionWithContent.test_shape_stores)
1472            (TestSessionWithContent.test_tables): New. Test cases for
1473            ShapeStores and Tables
1474    
1475    2003-05-07  Bernhard Herzog  <[email protected]>
1476    
1477            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1478            Add comments about the optimizations used.
1479            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1480            Implement the ReadValue table interface method.
1481    
1482            * test/test_transientdb.py
1483            (TestTransientTable.run_iceland_political_tests)
1484            (TestTransientTable.test_transient_joined_table): Add tests for
1485            ReadValue
1486    
1487    2003-05-07  Frank Koormann <[email protected]>
1488    
1489            * Resources/Bitmaps/fulllayerextent.xpm,
1490            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1491            new icons.
1492    
1493    2003-05-06  Bernhard Herzog  <[email protected]>
1494    
1495            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1496            New. Simply delegate to the transient table's version.
1497    
1498            * test/test_transientdb.py
1499            (TestTransientTable.test_auto_transient_table_query): New. Test
1500            case for AutoTransientTable's SimpleQuery
1501    
1502    2003-05-06  Bernhard Herzog  <[email protected]>
1503    
1504            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1505            Implement a simple query method for the query dialog
1506            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1507            the row index or shapeid.
1508            (TransientTable.create): Insert the right value of the row index
1509            (TransientJoinedTable.create): Copy the row index of the left
1510            table to the joined result table
1511    
1512            * test/test_transientdb.py
1513            (TestTransientTable.test_transient_table_read_twice): Fix
1514            doc-string
1515            (TestTransientTable.test_transient_table_query): New. Test for the
1516            SimpleQuery method
1517    
1518    2003-05-06  Bernhard Herzog  <[email protected]>
1519    
1520            Convert all table users to use the new table interface. This only
1521            covers Thuban itself, not GREAT-ER or other applications built on
1522            Thuban yet, so the compatibility interface stays in place for the
1523            time being but it now issues DeprecationWarnings.
1524    
1525            Finally, the new Table interface has a new method, HasColumn.
1526    
1527            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1528            issue deprecation warnings when they're. The warnings refer to the
1529            caller of the method.
1530            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1531            for the deprecation warnings
1532    
1533            * test/test_table.py: Ignore the deprecation warnings for the old
1534            table in the tests in this module. The purpose of the tests is to
1535            test the old interface, after all.
1536    
1537            * test/test_transientdb.py
1538            (TestTransientTable.run_iceland_political_tests): Use the
1539            constants for the types. Add a test for HasColumn
1540            (TestTransientTable.test_transient_joined_table): Adapt to new
1541            table interface. Add a test for HasColumn
1542            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1543            table interface
1544    
1545            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1546            Adapt to new table interface
1547    
1548            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1549            new table interface
1550    
1551            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1552            (RecordTable.SetTable): Adapt to new table interface
1553    
1554            * Thuban/UI/classifier.py (Classifier.__init__)
1555            (Classifier.__init__): Adapt to new table interface
1556    
1557            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1558            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1559            to new table interface
1560    
1561            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1562            (AutoTransientTable.HasColumn): Implement the new table interface
1563            method
1564            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1565            (AutoTransientTable.UniqueValues): Adapt to new table interface
1566    
1567            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1568            Adapt to new table interface
1569    
1570            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1571            simplify opening shapefiles a bit easier.
1572            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1573            (TestLayer.test_point_layer): Use the new helper method
1574            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1575            method
1576    
1577            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1578            the new table method
1579    
1580            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1581            Test for the new table method HasColumn
1582    
1583    2003-05-06  Jonathan Coles   <[email protected]>
1584    
1585            Addresses the "Selection Extent" wish of RTbug #1787.
1586    
1587            * Resources/Bitmaps/fulllayerextent.xpm,
1588            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1589            extent. These are just place holders for the real bitmaps.
1590    
1591            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1592            calculate the bounding box once (the first time compute_bbox() is
1593            called).
1594            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1595            the bounding box for the shapes in lat/long coordinates.
1596    
1597            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1598            option.
1599            (MainWindow.has_selected_shapes): New. Returns true if there are
1600            any selected shapes.
1601            (MainWindow.FullSelectionExtent): New. Calls
1602            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1603            (_has_selected_shapes): New. Returns true if there are any
1604            selected shapes.
1605    
1606            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1607            true if there are any selected shapes.
1608    
1609            * Thuban/UI/view.py (MapCanvas): Added delegated method
1610            HasSelectedShapes.
1611            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1612            shapes on the canvas using the map projection (if any).
1613    
1614            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1615            for Layer.ShapesBoundingBox().
1616    
1617    2003-05-06  Bernhard Herzog  <[email protected]>
1618    
1619            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1620    
1621    2003-05-05  Jonathan Coles   <[email protected]>
1622    
1623            Addresses the "Full Layer Extent" wish of RTbug #1787.
1624    
1625            * Resources/Projections/defaults.proj: Added UK National Grid.
1626    
1627            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1628            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1629            when the user selects the menu option.
1630    
1631            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1632            scales the given layer on the canvas using the map projection.
1633    
1634    2003-05-05  Bernhard Herzog  <[email protected]>
1635    
1636            Convert the table implementations to a new table interface. All
1637            tables use a common mixin class to provide backwards compatibility
1638            until all table users have been updated.
1639    
1640            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1641            provide backwards compatibility for table classes implementing the
1642            new interface
1643            (DBFTable, MemoryTable): Implement the new table interface. Use
1644            OldTableInterfaceMixin as base for compatibility
1645            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1646            and MemoryTable resp.
1647    
1648            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1649            the new table interface.
1650    
1651            * test/test_memory_table.py: New. Test cases for the MemoryTable
1652            with the new table interface.
1653    
1654            * test/test_table.py: Document the all tests in this file as only
1655            for backwards compatibility. The equivalent tests for the new
1656            interface are in test_memory_table.py and test_dbf_table.py
1657            (MemoryTableTest.test_read): field_info should be returning tuples
1658            with four items
1659            (MemoryTableTest.test_write): Make doc-string a more precise.
1660    
1661            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1662            table interface. Derive from from OldTableInterfaceMixin for
1663            compatibility.
1664            (TransientTableBase.create): New intance variable column_map to
1665            map from names and indices to column objects
1666            (TransientTable.create): Use the new table interface of the input
1667            table
1668            (AutoTransientTable): Convert to new table interface. Derive from
1669            from OldTableInterfaceMixin for compatibility.
1670            (AutoTransientTable.write_record): Removed. It's not implemented
1671            yet and we still have to decide how to handle writing with the new
1672            table and data framework.
1673    
1674            * test/test_transientdb.py
1675            (TestTransientTable.run_iceland_political_tests)
1676            (TestTransientTable.test_transient_joined_table): Use the new
1677            table interface
1678    
1679    2003-05-05  Jonathan Coles   <[email protected]>
1680    
1681            This is namely a collection of UI updates to improve user interactivity.
1682            Tabbing between controls now exists and you can use ESC to close dialog
1683            boxes; ENTER will active the default button.
1684    
1685            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1686            order that the controls are created so that tabbing works correctly.
1687            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1688            wxDialog can handle the default button correctly.
1689            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1690            same reasons as for OnOK.
1691            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1692            when we ask the table for the maximum/minimum values of a field
1693            which could take a very long time.
1694    
1695            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1696            order that the controls are created so that tabbing works correctly.
1697            (SelectPropertiesDialog.__init__): Rearrange the order that the
1698            controls are created so that tabbing works correctly.
1699    
1700            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1701            to derive from a wxDialog but behave like the original implementation
1702            which was derived from a wxFrame. wxDialog provides useful key
1703            handling functionality like ESC calling OnCancel and ENTER calling
1704            OnOK which is lost with wxFrame.
1705    
1706            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1707            new dialogs.
1708    
1709            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1710            order that the controls are created so that tabbing works correctly.
1711            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1712            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1713            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1714            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1715            can provide the "UK National Grid" as a default projection.
1716            (UTMPanel.__init__): Rearrange the order that the controls are
1717            created so that tabbing works correctly.
1718    
1719    2003-05-05  Bernhard Herzog  <[email protected]>
1720    
1721            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1722            (project_point): If a map projection but no layer projection is
1723            given, convert degrees to radians before applying the map
1724            projection.
1725    
1726            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1727            (TableGrid.allow_messages): New methods to make it possible to
1728            inhibit message sending.
1729            (TableGrid.issue): Only send the message if not inhibited.
1730            (LayerTableGrid.select_shape): Use the new methods to make sure
1731            that no ROW_SELECTED message is sent while we're updating the
1732            selected rows to match the selected shapes.
1733    
1734    2003-05-02  Jan-Oliver Wagner <[email protected]>
1735    
1736            Implementation of MemoryTable.
1737    
1738            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1739            implementation that operates on a list of tuples. All of the data
1740            are kept in the memory.
1741    
1742            * test/test_table.py (MemoryTableTest): New.
1743    
1744            * test/test_transientdb.py (SimpleTable): Removed.
1745            (TestTransientTable.test_transient_joined_table,
1746            (TestTransientTable.test_transient_table_read_twice): Replaced
1747            SimpleTable by MemoryTable.
1748    
1749    2003-04-30  Jonathan Coles   <[email protected]>
1750    
1751            * Data/iceland_sample.thuban: Now contains correct projections
1752            for each of the layers.
1753    
1754            * Resources/Projections/defaults.proj: Geographic projection
1755            contains unit conversion parameter.
1756    
1757    2003-04-30  Jonathan Coles   <[email protected]>
1758    
1759            The most important part of this putback is the projection changes.
1760            It should now be possible to specify the projection that a layer
1761            is in and then specify a different projection for the map. The
1762            projection dialog has an extra parameter for a geographic projection
1763            which lets the user select if the input is in degrees or radians.
1764    
1765            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1766            to say that the parameter is a tuple of unprojected
1767            points (which is what the callers to this method were assuming).
1768            Also, since the points are unprojected we need to projected them.
1769    
1770            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1771            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1772            groups are selected, move the layer up/down. Fixes RTbug #1833.
1773    
1774            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1775    
1776            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1777            parameter in call to SetClientData.
1778            (GeoPanel): Add support for selecting the units that the
1779            source data is in (Radians or Degrees).
1780    
1781            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1782            the rendering loop by reducing the number of if's, removing the
1783            unnecessary try/except block, and checking if the old group
1784            is the same as the new one (which happens a lot if there is
1785            no classification, or lots of shapes are in the same group).
1786    
1787            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1788            around the redraw routine to try to catch problems that the user
1789            may create by selecting invalid projections for the data set and
1790            map. Clears the display if there are any problems and prints the
1791            error.
1792            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1793            rectangle.
1794    
1795            * extensions/thuban/wxproj.cpp (project_point): First invert the
1796            supplied point (which should be in projected coordinates) using
1797            the layer's projection and then project the point using the
1798            map's projection.
1799            (project_points): Use project_point() to project each point.
1800    
1801    2003-04-30  Jan-Oliver Wagner <[email protected]>
1802    
1803            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1804            don't set the Classification to None if the classfication field
1805            is None (ie only a DEFAULT).
1806    
1807    2003-04-30  Bernhard Herzog  <[email protected]>
1808    
1809            * Thuban/UI/view.py: Fix some typos.
1810    
1811            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1812            not pop up the dialog if the selection becomes empty (this could
1813            happen if e.g. a new selection is opened while the identify tool
1814            is active and dialog had been closed)
1815    
1816    2003-04-30  Bernhard Herzog  <[email protected]>
1817    
1818            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1819            instance variable read_record_last_result
1820            (TransientTableBase.read_record): Make sure reading the same
1821            record twice works. The implementation uses the new instance
1822            variable read_record_last_result
1823    
1824            * test/test_transientdb.py
1825            (TestTransientTable.test_transient_table_read_twice): New test
1826            case for the above bug-fix.
1827    
1828    2003-04-29  Jonathan Coles   <[email protected]>
1829    
1830            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1831    
1832            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1833    
1834            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1835            (ClassTable.SetValueAsCustom): Rename keyword argument in
1836            ClassGroup* constructors to match argument name.
1837    
1838    2003-04-29  Bernhard Herzog  <[email protected]>
1839    
1840            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1841            transient DB if it exists to make sure it doesn't leave a journal
1842            file in the temp directory.
1843    
1844            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1845            self.conn to None after closing the connection to make sure it's
1846            not closed twice
1847    
1848    2003-04-29  Jonathan Coles   <[email protected]>
1849    
1850            Add a visible parameter in the layer XML tag. The default value is
1851            "true". If anything other than "false" is specified we also assume
1852            "true". Addresses RTbug #1025.
1853    
1854            * Doc/thuban.dtd: Add visible parameter to a layer.
1855    
1856            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1857            of visible from 1 to True.
1858            (Layer.__init__): Change default value of visible from 1 to True.
1859    
1860            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1861            parameter.
1862    
1863            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1864            parameter.
1865    
1866            * test/test_load.py: Add new test data contents_test_visible.
1867            (LoadSessionTest.setUp): save test data.
1868            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1869            is loaded correctly.
1870    
1871            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1872            for saving an invisible layer.
1873    
1874    2003-04-29  Jonathan Coles   <[email protected]>
1875    
1876            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1877            legend dialog box and tell it to change its map to the one
1878            supplied to SetMap(). Fixes RTbug #1770.
1879    
1880    2003-04-29  Bernhard Herzog  <[email protected]>
1881    
1882            Next step of table implementation. Introduce a transient database
1883            using SQLite that some of the data is copied to on demand. This
1884            allows us to do joins and other operations that require an index
1885            for good performance with reasonable efficiency. Thuban now needs
1886            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1887            haven't tested that.
1888            
1889            * Thuban/Model/transientdb.py: New. Transient database
1890            implementation.
1891    
1892            * test/test_transientdb.py: New. Tests for the transient DB
1893            classes.
1894    
1895            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1896            classes to help automatically remove temporary files and
1897            directories.
1898            (Session.__init__): New instance variables temp_dir for the
1899            temporary directory and transient_db for the SQLite database
1900            (Session.temp_directory): New. Create a temporary directory if not
1901            yet done and return its name. Use AutoRemoveDir to have it
1902            automatically deleted
1903            (Session.TransientDB): Instantiate the transient database if not
1904            done yet and return it.
1905    
1906            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1907            AutoTransientTable so that data is copied to the transient DB on
1908            demand.
1909            (SimpleStore): New class that simply combines a table and a
1910            shapefile
1911    
1912            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1913            DBFTable and update its doc-string to reflect the fact that this
1914            is only the table interface to a DBF file. Table is now an alias
1915            for DBFTable for temporary backwards compatibility.
1916    
1917            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1918            the last reference to the session goes away so that the temporary
1919            files are removed properly.
1920    
1921            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1922            reference to the session to make sure the temporary files are
1923            removed.
1924    
1925    2003-04-29  Bernhard Herzog  <[email protected]>
1926    
1927            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1928            the __parser instance variable into a normal local variable in
1929            read. It's only used there and read will never be called more than
1930            once. Plus it introduces a reference cycle that keeps can keep the
1931            session object alive for a long time.
1932    
1933    2003-04-29  Jonathan Coles   <[email protected]>
1934    
1935            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1936            Projection an immutable item. Fixes RTbug #1825.
1937            (Projection.__init__): Initialize instance variables here.
1938            (ProjFile.Replace): New. Replace the given projection object with
1939            the new projection object. This solves the problem of needing the
1940            mutator Projection.SetProjection() in the ProjFrame class and
1941            allows a projection to change parameters without changing its
1942            location in the file.
1943    
1944            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1945            be of type wxSAVE and should verify overwriting a file.
1946    
1947            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1948            ProjFile.Replace() method instead of the mutator
1949            Projection.SetProjection(). Also requires that we reassign the
1950            client data to the new projection.
1951    
1952            * test/test_proj.py (TestProjection.test): Test GetName() and
1953            GetAllParameters()
1954            (TestProjFile.test): Remove tests for Set*() methods. Add tests
1955            for Replace().
1956    
1957    2003-04-25  Jonathan Coles   <[email protected]>
1958    
1959            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1960            to save the name of the projection.
1961    
1962            * test/test_save.py (SaveSessionTest.testLayerProjection): New
1963            test to verify layer projections are saved correctly.
1964    
1965    2003-04-25  Jonathan Coles   <[email protected]>
1966    
1967            * Thuban/Model/proj.py (Projection.SetName): Set the name
1968            to "Unknown" if name is None.
1969            (Projection.SetAllParameters): New. Set the projection's
1970            parameter list to the one supplied.
1971            (Projection.SetProjection): New. Set the projection's
1972            properties to those of the supplied Projection.
1973    
1974            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1975            the dialog title to include the map's title.
1976            (MainWindow.LayerProjection): Set the dialog title to include
1977            the layer's title.
1978    
1979            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1980            error dialogs into a single method call.
1981            (ProjFrame.__VerifyButtons): Add more states to check.
1982            (ProjFrame.__GetProjection): Return the current state of an
1983            edited projection or None.
1984            (ProjFrame.__FillAvailList): Remove checks for states that
1985            shouldn't exist.
1986            (ProjFrame._OnNew): Clear all selected items and supply
1987            a projection panel if necessary.
1988    
1989            * test/test_proj.py (TestProjFile.test): Add tests for
1990            ProjFile.SetAllParameters, ProjFile.SetProjection,
1991            ProjFile.SetName.
1992    
1993    2003-04-25  Jonathan Coles   <[email protected]>
1994    
1995            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1996            takes an optional argument to select the current projection.
1997            This does not guarantee that the item is visible due to
1998            limited wxWindows functionality. Fixes RTBug #1821.
1999    
2000    2003-04-25  Jonathan Coles   <[email protected]>
2001    
2002            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2003            the projection name and use it when constructing the Projection
2004            object.
2005    
2006            * Thuban/Model/proj.py (Projection.__init__): Change the default
2007            value for 'name' to None and then test if name is equal to None
2008            in the body of the constructor. This way the caller doesn't have to
2009            know what the default value should be. Namely, useful in load.py
2010            where we have to pick a default value if the 'name' parameter
2011            doesn't exist in the XML file.
2012    
2013            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2014            Tests a file where a layer has a projection.
2015    
2016    2003-04-25  Jonathan Coles   <[email protected]>
2017    
2018            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2019            tree for projection information.
2020    
2021            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2022            XMLReader.GetFileName.
2023            (SessionLoader): Added support for loading projection tags that
2024            appear inside a layer.
2025    
2026            * Thuban/Model/proj.py (ProjFile): Document the class. Move
2027            back to using a list because the order of the projections in
2028            the file is important to maintain. Fixes RTbug #1817.
2029    
2030            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2031            to ProjFile.GetFilename.
2032    
2033            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2034            information.
2035    
2036            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2037            ProjFrame._OnSaveAs. Removed old dead code from previous
2038            implementation.
2039            (ProjFrame._OnExport): Add support for exporting more than one
2040            projection to a single file.
2041            (ProjFrame.__FillAvailList): use string formatting (% operator)
2042            to build strings that are (partly) translated. Fixes RTbug #1818.
2043    
2044            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2045            class.
2046    
2047    2003-04-24  Bernhard Herzog  <[email protected]>
2048    
2049            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2050    
2051            * po/fr.po: New. French translation by Daniel Calvelo Aros
2052    
2053            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2054            empty strings.
2055    
2056    2003-04-24  Jonathan Coles   <[email protected]>
2057    
2058            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2059            implement the interface that the ProjFrame dialog expects.
2060    
2061            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2062            name of the projection to be changed.
2063            (ProjFile): Use a dictionary instead of a list so that removing
2064            projections is easier and we are sure about uniqueness.
2065            (ProjFile.Remove): Remove the given projection object.
2066    
2067            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2068            Return a list with only one projection file instead of searching for
2069            any projection file. This simplifies many things if the user can
2070            only have one system file and one user file.
2071    
2072            * Thuban/UI/classgen.py: Change all references to
2073            genCombo to genChoice.
2074    
2075            * Thuban/UI/mainwindow.py: Add a Projection option under the
2076            layer menu.
2077            (MainWindow.LayerProjection): New. Open up a projection window
2078            for a layer.
2079    
2080            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2081            laid out. Use three panels instead of one. One for the list of
2082            projections, one for the edit controls, and one for the buttons.
2083            Fixed resizing problems so that the dialog resizes correctly
2084            when the projection panel changes. Added import/export, save, and
2085            new buttons/functionality.
2086    
2087    2003-04-24  Bernhard Herzog  <[email protected]>
2088    
2089            First step towards table management. Introduce a simple data
2090            abstraction so that we replace the data a layer uses more easily
2091            in the next step.
2092    
2093            * Thuban/Model/data.py: New file with a simple data abstraction
2094            that bundles shapefile and dbffile into one object.
2095    
2096            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2097            open shapefiles and return a shape store object
2098    
2099            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2100            object instead of a shapefile filename. This introduces a new
2101            instance variable store holding the datastore. For intermediate
2102            backwards compatibility keep the old instance variables.
2103            (open_shapefile): Removed. No longer needed with the shape store.
2104            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2105            get the shape store used by a layer.
2106            (Layer.Destroy): No need to explicitly destroy the shapefile or
2107            table anymore.
2108    
2109            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2110            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2111            open shapefiles
2112    
2113            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2114            session's OpenShapefile method to open shapefiles
2115    
2116            * test/test_classification.py
2117            (TestClassification.test_classification): Use the session's
2118            OpenShapefile method to open shapefiles and build the filename in
2119            a more platform independed way
2120    
2121            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2122            Implement to have a session to use in the tests
2123            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2124            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2125            session's OpenShapefile method to open shapefiles
2126            (TestLayerLegend.setUp): Instantiate a session so that we can use
2127            it to open shapefiles.
2128            (TestLayerLegend.tearDown): Make sure that all references to
2129            layers and session are removed otherwise we may get a resource
2130            leak
2131    
2132            * test/test_map.py (TestMapAddLayer.test_add_layer)
2133            (TestMapWithContents.setUp): Instantiate a session so that we can
2134            use it to open shapefiles.
2135            (TestMapWithContents.tearDown): Make sure that all references to
2136            layers, maps and sessions are removed otherwise we may get a
2137            resource leak
2138            ("__main__"): use support.run_tests() so that more info about
2139            uncollected garbage is printed
2140    
2141            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2142            session's OpenShapefile method to open shapefiles
2143            ("__main__"): use support.run_tests() so that more info about
2144            uncollected garbage is printed
2145    
2146            * test/test_selection.py (TestSelection.tearDown): Make sure that
2147            all references to the session and the selection are removed
2148            otherwise we may get a resource leak
2149            (TestSelection.get_layer): Instantiate a session so that we can
2150            use it to open shapefiles.
2151            ("__main__"): use support.run_tests() so that more info about
2152            uncollected garbage is printed
2153    
2154            * test/test_session.py (TestSessionBase.tearDown)
2155            (TestSessionWithContent.tearDown): Make sure that all references
2156            to the session and layers are removed otherwise we may get a
2157            resource leak
2158            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2159            method to open shapefiles
2160    
2161    2003-04-24  Jonathan Coles   <[email protected]>
2162    
2163            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2164            if the file_or_filename object had the 'read' attribute.
2165    
2166    2003-04-23  Jonathan Coles   <[email protected]>
2167    
2168            * Thuban/Model/resource.py: Fixes RTbug #1813.
2169            (ReadProjFile): Add documentation about which exceptions are raised.
2170            Always pass the exceptions up to the caller.
2171            (GetProjFiles): If the directory can't be read return an empty list.
2172            If any of the proj files can't be read skip that file and go
2173            on to the next one.
2174    
2175            * test/test_proj.py: Added test cases to handle nonexistent files,
2176            unreadable files, and files that don't parse correctly.
2177    
2178    2003-04-23  Jonathan Coles   <[email protected]>
2179    
2180            Projection dialog. Allows the user to select from a list
2181            of projection templates and optionally edit them and save new ones.
2182    
2183            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2184            (ProjPanel): Base class for projection specific panels.
2185            (TMPanel): Projection panel for Transverse Mercartor.
2186            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2187            (LCCPanel): Projection panel for Lambert Conic Conformal.
2188            (GeoPanel): Projetion panel for Geographic Projection.
2189    
2190    2003-04-23  Jonathan Coles   <[email protected]>
2191    
2192            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2193            promote symmetry. There now exists XMLReader and XMLWriter.
2194            (XMLReader.read): New. Call to read the given file descriptor or
2195            filename.
2196            (XMLReader.close): New. Make sure the file is closed.
2197            (XMLReader.GetFileName): New. Return just the file name that is being
2198            read from.
2199            (XMLReader.GetDirectory): New. Return just the directory of the file
2200            that is being read.
2201            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2202            the names of functions to call as the XML tree is parsed.
2203            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2204            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2205            (SessionLoader): Removed class variables start_dispatcher and
2206            end_dispatcher since this functionality is now part of a class
2207            instance. Fixes RTbug #1808.
2208            (SessionLoader.__init__): Add dispatcher functions.
2209            (load_xmlfile): Code was moved into the XMLReader.read().
2210            (load_session): Use modified SessionLoader.
2211    
2212            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2213            map's projection.
2214    
2215            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2216            GetAllParameters.
2217            (Projection.GetParameter): Returns the value for the given parameter.
2218    
2219            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2220            (GetProjFiles): Renamed from GetProjections. Now returns a list
2221            of ProjFile objects.
2222            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2223            a list of ProjFile objects whose files are not user defined.
2224            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2225            list of ProjFile objects whose files are user defined.
2226            (ProjFileReader): Extend new XMLReader.
2227    
2228            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2229            promote symmetry.
2230    
2231            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2232            control instead of a wxComboBox. wxChoice controls do not generate
2233            events as the uses highlights possible choices which fixes problems
2234            with resizing the dialog when the use selects an option.
2235    
2236            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2237            control instead of a wxComboBox.
2238    
2239            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2240            dialog.
2241    
2242            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2243            method.
2244    
2245    2003-04-22  Bernhard Herzog  <[email protected]>
2246    
2247            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2248            constants
2249    
2250            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2251            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2252    
2253    2003-04-17  Bernhard Herzog  <[email protected]>
2254    
2255            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2256            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2257            anymore.
2258            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2259            (Layer.ShapeType, Layer.Shape): No need to call
2260            self.open_shapefile since it's always called in __init__
2261    
2262            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2263            In wxPython 2.4 there's no need to extend MainLoop anymore since
2264            wxPython itself makes sure OnExit is called.
2265    
2266    2003-04-16  Jonathan Coles   <[email protected]>
2267    
2268            Initial putback of projection management code. Includes new
2269            classes to read and write projection files. The current load
2270            and save classes were abstracted a bit so they could be reused.
2271            The Projection class was extended to provide new methods and
2272            have a name.
2273    
2274            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2275            general XML reading methods that were part of ProcessSession.
2276    
2277            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2278            name.
2279            (ProjFile): New. Represents a file that contains projection
2280            information.
2281    
2282            * Thuban/Model/resource.py: New. Contains general utilities
2283            for read and writing projection files.
2284    
2285            * Thuban/Model/save.py (XMLSaver): New. Contains all the
2286            general XML writing methods that were part of SessionSaver.
2287            (SessionSaver): Renamed from Saver.
2288    
2289            * test/test_proj.py: New test cases for the projection
2290            file read and write functions.
2291    
2292    2003-04-16  Jonathan Coles   <[email protected]>
2293    
2294            * Thuban/Model/classification.py: Use repr() around values
2295            in the ClassGroup*.__repr__() methods so it is clearer when
2296            a value is a string and when it is a number.
2297    
2298            * test/test_load.py: Rework the classification test to test
2299            that we can load old files.
2300            (testLabels): Test a file where the groups have labels.
2301    
2302    2003-04-16  Bernhard Herzog  <[email protected]>
2303    
2304            Safer implementation of the performance enhancements of the
2305            low-level renderer:
2306            
2307            * extensions/thuban/wxproj.cpp (extract_projection)
2308            (extract_pointer): Rename extract_projection to extract_pointer
2309            and redefine its purpose to return the pointer stored in a CObject
2310            returned by the object's cobject method. Update all callers.
2311            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2312            handling of these low-level parameters so that each s_draw_info
2313            instance is handled as a CObject at python level that also
2314            contains real references to the actual python objects which
2315            contain the values in the struct. Add free_draw_info as the
2316            destructor.
2317            (draw_polygon_shape): Add the py_draw_info parameter which must a
2318            cobject containing an s_draw_info pointer.
2319    
2320            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2321            method to instantiat the low-level render parameter
2322            (MapRenderer.draw_shape_layer): Use the new method. Remove some
2323            commented out code.
2324            (MapRenderer.draw_polygon_shape): Make the first parameter not the
2325            layer but the low-level render parameter
2326            (ScreenRenderer.draw_shape_layer): Use the low-level render
2327            parameter.
2328    
2329    2003-04-15  Jonathan Coles   <[email protected]>
2330    
2331            * Thuban/Model/classification.py: Implemented __repr__ for
2332            the ClassGroup* classes to make debugging a bit easier.
2333            (ClassGroup.SetLabel): Check that the string is an instance
2334            of StringTypes not StringType. Accounts for Unicode strings.
2335    
2336            * Thuban/Model/color.py: Implemented __repr__ to make
2337            debugging a bit easier.
2338    
2339            * Thuban/Model/save.py (Saver.write_classification): Need to
2340            save the group label.
2341    
2342            * test/test_load.py (testClassification): New. Loads the
2343            iceland_sample_test.thuban file and checks if it was loaded
2344            correctly.
2345    
2346    2003-04-15  Jonathan Coles   <[email protected]>
2347    
2348            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2349            to improve rendering performance by initializing the variables
2350            that are not change each time draw_polygon_shape() is called.
2351            The values are stored in a global struct draw_info.
2352            (draw_polygon_shape): Removed initialization code that is
2353            now in draw_polygon_init().
2354    
2355            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2356            drawing initialization call to draw_polygon_init()
2357            (MapRenderer.draw_polygon_shape): Use new signature of
2358            draw_polygon_shape.
2359    
2360            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2361            weirdness by setting the range to (1, maxint).
2362    
2363            * Thuban/Model/classification.py (ClassGroupProperties): Make
2364            instance variables private and optimize comparison operator
2365            by first checking if the color references are the same.
2366            (ClassGroupSingleton): Make instance variables private.
2367            (ClassGroupRange): Make instance variables private.
2368    
2369            * HOWTO-Release: Filled in missing steps for releasing packages.
2370    
2371    2003-04-15  Bernhard Herzog  <[email protected]>
2372    
2373            First stab at internationalized messages:
2374    
2375            * Thuban/__init__.py (_): Implement the translation function for
2376            real using the python gettext module.
2377    
2378            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2379            translate empty strings.
2380    
2381            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2382            Add a missing space to a warning message
2383    
2384            * po/README: New. Notes about the management of the translation
2385            files.
2386    
2387            * po/Makefile: New. Makefile to help manage the translation files.
2388    
2389            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2390    
2391            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2392            translations and support files in po/
2393    
2394            * setup.py (data_files): Add the *.mo files to the data_files too
2395    
2396            * README: Add note about the translations when building from CVS
2397    
2398    2003-04-14  Jonathan Coles   <[email protected]>
2399    
2400            * Thuban/UI/dock.py: Fixes some window resizing problems most
2401            noticable under windows. Always assume the button bitmaps will
2402            be there. Code clean up.
2403            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2404            images for the dock/undock button to the same images.
2405            Work around for RTbug #1801.
2406    
2407            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2408            be allowed to grow within the sizer. Fixes a bug under Windows
2409            where the toolbar wasn't being drawn.
2410    
2411    2003-04-14  Frank Koormann   <[email protected]>
2412    
2413            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2414            Updated design to try to make the button functionality more
2415            transparent.
2416    
2417    2003-04-14  Jonathan Coles   <[email protected]>
2418    
2419            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2420            finalize the intialization of the panel.
2421    
2422            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2423            creation of the panel. Should be the last thing called in the
2424            initializer of a subclass.
2425    
2426            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2427            set the current selections in the combo boxes. This is needed
2428            under Windows.
2429    
2430            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2431            level panel to the dialog so that the background colors are
2432            consistent under Windows.
2433    
2434    2003-04-11  Jonathan Coles   <[email protected]>
2435    
2436            * Thuban/UI/classgen.py: Change color ramps to start at white
2437            not black.
2438    
2439            * Thuban/UI/legend.py: Enable/disable the legend buttons when
2440            the legend changes. Fixes RTbug #1793.
2441    
2442            * test/test_classification.py: Added test for copying of
2443            classifications.
2444    
2445    2003-04-11  Jonathan Coles   <[email protected]>
2446    
2447            * Thuban/UI/resource.py: New. Centralize the loading of resources
2448            such as bitmaps.
2449    
2450            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2451            added images to the move buttons, added 'reverse' button.
2452            (CustomRampPanel.__init__): Added images to the move buttons.
2453            (GreyRamp): New. Generates a ramp from white to black.
2454            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2455    
2456            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2457            ID_PROPERTY_*.
2458            (Classifier.__init__): Minor changes to the layout.
2459            (Classifier._OnTitleChanged): Listen for when the user edits the
2460            title and update the dialog's title and the layer's title.
2461    
2462            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2463    
2464            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2465            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2466            if the layer's title changes.
2467    
2468            * Thuban/UI/mainwindow.py: Added new menu item and associated code
2469            to open a dialog to rename the map.
2470            (MainWindow): Use new resource class to import bitmaps.
2471    
2472    2003-04-11  Jonathan Coles   <[email protected]>
2473    
2474            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2475            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2476            Resources/Bitmaps/group_use_none.xpm,
2477            Resources/Bitmaps/group_use_not.xpm,
2478            Resources/Bitmaps/hide_layer.xpm,
2479            Resources/Bitmaps/layer_properties.xpm,
2480            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2481            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2482            New.
2483    
2484    2003-04-10  Jonathan Coles   <[email protected]>
2485    
2486            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2487            Should pass group to ClassGroup constructor.
2488    
2489    2003-04-10  Jonathan Coles   <[email protected]>
2490    
2491            * Thuban/Model/classification.py: (ClassGroup): Move all the common
2492            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2493            here. Implement SetVisible(), IsVisible().
2494            (ClassGroup.__init__): Add group parameter which acts as a copy
2495            constructor.
2496    
2497            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2498            "Visible" check boxes.
2499            (Classifier): Rename the buttons and refactor the code to match
2500            the new labels.
2501    
2502            * Thuban/UI/legend.py: Classify button is now called "Properties".
2503            Refactored the code to change variable names.
2504            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2505    
2506            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2507            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2508            renamed to MainWindow.LayerEditProperties.
2509            (MainWindow.ToggleLegend): Don't include map name in legend title.
2510            (MainWindow.SetMap): Added the map name to the window title.
2511            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2512            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2513            Functionality is found in the layer properties dialog.
2514    
2515            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2516            draw visible groups.
2517    
2518    2003-04-09  Jonathan Coles   <[email protected]>
2519    
2520            * Thuban/UI/classgen.py: Modifications to allow simple
2521            addition and selection of new color schemes.
2522            (MonochromaticRamp): New. Generates a ramp between two colors.
2523            (RedRamp): New. Generates a ramp of all red.
2524            (GreenRamp): New. Generates a ramp of all green.
2525            (BlueRamp): New. Generates a ramp of all blue.
2526    
2527    2003-04-09  Jonathan Coles   <[email protected]>
2528    
2529            * Thuban/Model/classification.py (Classification.__deepcopy__):
2530            Need to copy over field and fieldType attributes.
2531    
2532            * Thuban/Model/table.py (Table.field_range): New. Retrive the
2533            maximum and minimum values over the entire table for a given
2534            field.
2535            (Table.GetUniqueValues): New. Retrieve all the unique values
2536            in the table for a given field.
2537    
2538            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2539            (GenUniquePanel): New. Controls to allow the user to select
2540            which unique field values they would like in the classification.
2541            (CustomRampPanel): Code that was in ClassGenDialog that allows
2542            the user to select the properties for a custom ramp.
2543            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2544    
2545            * Thuban/UI/classifier.py: Removed a lot of debugging code.
2546            (Classifier._SetClassification): Callback method so that the
2547            class generator can set the classification in the grid.
2548            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2549            editing of a group properties class into a wxWindows control.
2550    
2551            * Thuban/UI/dock.py: It was decided that if the user closes
2552            a dockable window the window should simply hide itself. That
2553            way if the user wants to show the dock again it appears in the
2554            same place as it was when it was closed.
2555            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2556            (DockableWindow._OnButtonClose): Hide the window instead of
2557            destroying it.
2558            (DockableWindow._OnClose): Hide the window instead of
2559            destroying it.
2560    
2561            * Thuban/UI/legend.py (LegendTree): Use a private method to
2562            consistently set the font and style of the text. Fixes RTbug #1786.
2563    
2564            * Thuban/UI/mainwindow.py: Import just the Classifier class.
2565    
2566    2003-04-07  Bernhard Herzog  <[email protected]>
2567    
2568            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2569            to the map module
2570    
2571    2003-04-07  Bernhard Herzog  <[email protected]>
2572    
2573            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2574            favor of ToggleSessionTree
2575            (MainWindow.ToggleSessionTree): New method to toggle visibility of
2576            the session tree.
2577            (MainWindow.SessionTreeShown): New method to return whether the
2578            session tree is currently shown.
2579            (MainWindow.ToggleLegend): New method to toggle visibility of the
2580            legend
2581            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2582            LegendShown
2583            (MainWindow.LegendShown): New method to return whether the legend
2584            is currently shown.
2585            (_method_command): Add checked parameter so we can define check
2586            menu items
2587            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2588            mainwindow methods.
2589            (show_session_tree, show_legend commands): Removed.
2590            (toggle_session_tree, toggle_legend commands): New commands to
2591            toggle the visibility of the dialogs
2592    
2593    2003-04-07  Jonathan Coles   <[email protected]>
2594    
2595            * Thuban/UI/classgen.py: Fix Windows problem.
2596    
2597            * Thuban/UI/dock.py: Fix Windows problem.
2598    
2599            * Thuban/UI/mainwindow.py: Use False instead of false.
2600            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2601    
2602    2003-04-07  Jonathan Coles   <[email protected]>
2603    
2604            Since we now say that the order of the groups in a classification
2605            matters, it makes sense to be able to manipulate that order. Most
2606            of the changes to Thuban/Model/classification.py are to that end.
2607    
2608            * Thuban/Model/classification.py (Classification.AppendGroup,
2609            Classification.InsertGroup, Classification.ReplaceGroup,
2610            Classification.RemoveGroup, Classification.GetGroup): Do as the
2611            names imply.
2612            (Classification.FindGroup): This was called GetGroup, but GetGroup
2613            takes an index, while FindGroup takes a value.
2614            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2615            REFERENCE. Currently there is a cyclic reference between the layer
2616            and its classification. If the classification doesn't need to know
2617            its owning layer we can change this, since it may make sense to be
2618            able to use the same classification with different layers.
2619    
2620            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2621    
2622            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2623            not AddGroup()
2624    
2625            * Thuban/UI/classifier.py: Now that we can depend on the order in
2626            a Classification and have methods to manipulate that order we don't
2627            need to use our own data structures in the grid. We can simply make
2628            the grid/table access the information they need from a copy of
2629            the classification object.
2630            (Classifier._OnCloseBtn): Event handler for when the user clicks
2631            'Close'. This is needed so if the user applies changes and then
2632            continues to change the table the user has the option of discarding
2633            the most recent changes and keeping what they applied.
2634    
2635            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2636            into the same group.
2637    
2638            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2639            with a really old version of proj, PJ_VERSION won't even be defined.
2640            If it isn't defined then just compile so that the function always
2641            returns Py_False.
2642    
2643            * test/test_classification.py: Fix tests to use the renamed methods.
2644            Still need to write tests for the new methods.
2645    
2646    2003-04-04  Jonathan Coles   <[email protected]>
2647    
2648            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2649            call to SetSelection out of the method and before the call
2650            to __SelectField in __init__. This prevents a recursion of events
2651            when _OnFieldSelect is triggered by the user.
2652    
2653    2003-04-04  Jonathan Coles   <[email protected]>
2654    
2655            * Thuban/Model/classification.py: Rename Color.None to
2656            Color.Transparent.
2657            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2658            Don't bother copying the color, since Colors are immutable.
2659    
2660            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2661            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2662            Thuban/UI/renderer.py, Thuban/UI/view.py:
2663            Rename Color.None to Color.Transparent.
2664        
2665            * test/test_classification.py, test/test_load.py: Rename Color.None
2666            to Color.Transparent.
2667    
2668    2003-04-04  Jonathan Coles   <[email protected]>
2669    
2670            * Thuban/Model/classification.py: Fix assert calls.
2671            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2672            Copy the color parameter rather than hold onto a reference.
2673    
2674            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2675            the color object.
2676            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2677            are sure there exists only one refernce to Color.None in the system.
2678            This allows us to use 'is' rather than the comparision functions.
2679            
2680            * Thuban/Model/save.py: Fix assert calls.
2681            
2682            * Thuban/UI/classifier.py: Fix assert calls.
2683            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2684            dialog to edit the groups properties.
2685            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2686            correctly if a cell is resized.
2687            (ClassTable.SetClassification): New. Changes the classification
2688            that is in the table.
2689            (ClassTable.__SetRow): Allow groups to be prepended.
2690            (Classifier): New code for opening the EditProperties and
2691            GenerateRanges dialogs.
2692            (SelectPropertiesDialog.__GetColor): Only set the color in the
2693            color dialog if the current color is not None.
2694            
2695            * Thuban/UI/dock.py: Fix assert calls.
2696            
2697            * Thuban/UI/legend.py: Fix assert calls.
2698            
2699            * Thuban/UI/renderer.py: Fix assert calls.
2700            
2701            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2702            classifications.
2703            (GenRangePanel): Panel specific to range generation.
2704            (GenSingletonPanel): Panel specific to singleton generation.
2705            (ClassGenerator): Class responsible for actually generating
2706            the classification from the data gathered in the dialog box.
2707            (PropertyRamp): Generates properties whose values range from
2708            a starting property to an ending property.
2709    
2710    2003-04-03  Bernhard Herzog  <[email protected]>
2711    
2712            * test/support.py (print_garbage_information): New function that
2713            prints information about still connected messages and memory
2714            leaks.
2715            (run_suite): Removed.
2716            (run_tests): New function for use as a replacement of
2717            unittest.main in the test_* files. This one calls
2718            print_garbage_information at the end.
2719    
2720            * test/runtests.py (main): Use support.print_garbage_information
2721    
2722            * test/test_layer.py: Use support.run_tests instead of
2723            unittest.main so we get memory leak information
2724            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2725            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2726            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2727            to fix a memory leak.
2728    
2729            * test/test_classification.py: Use support.run_tests instead of
2730            unittest.main so we get memory leak information
2731            (TestClassification.test_classification): Call the layer's Destroy
2732            method to fix a memory leak.
2733    
2734    2003-04-02  Bernhard Herzog  <[email protected]>
2735    
2736            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2737            Handle the reference counts of the return value and errors in
2738            PyArg_ParseTuple correctly.
2739    
2740            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2741            sure the filename is absolute to avoid problems when saving the
2742            session again
2743    
2744            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2745    
2746    2003-04-01  Jonathan Coles   <[email protected]>
2747    
2748            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2749            that there actually are points in the returned list of points
2750            before trying to index into the list. The list may be empty if
2751            the shape is a Null Shape.
2752    
2753    2003-04-01  Bernhard Herzog  <[email protected]>
2754    
2755            * test/test_map.py: Don't use from <module> import *
2756    
2757    2003-04-01  Jonathan Coles   <[email protected]>
2758    
2759            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2760            LAYER_LEGEND_CHANGED
2761    
2762            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2763            self.Destroy() to close the window after yesterday's changes.
2764    
2765            * test/test_map.py, test/test_session.py: Fix messages that
2766            are sent from maps and layers.
2767    
2768    2003-03-31  Jonathan Coles   <[email protected]>
2769    
2770            * Thuban/UI/classifier.py: Commented out some debugging statements.
2771            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2772            RTbug #1769.
2773    
2774            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2775            position (although position doesn't work yet under GTK).
2776            (DockableWindow.Destroy): New. Called when the window must be
2777            closed. Namely needed when the DockFrame closes and must close
2778            its children.
2779            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2780    
2781            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2782            when then window is told to close.
2783            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2784            comment in source for more info.
2785    
2786            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2787    
2788            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2789            symmetry with other such methods.
2790            (MainWindow.ShowLegend): Show the legend docked by default.
2791    
2792    2003-03-28  Jonathan Coles   <[email protected]>
2793    
2794            * Thuban/UI/classifier.py: Support for highlighting a specific
2795            group within the grid when the classification dialog is opened.
2796            Also contains a lot of debugging printouts which will later
2797            be removed.
2798    
2799            * Thuban/UI/dock.py: Complete rework on the dock code so that
2800            that it is fairly removed from the rest of the Thuban application.
2801            It is easy to add new docks which the rest of the program having
2802            to be aware of them.
2803    
2804            * Thuban/UI/legend.py: Modifications to support selecting a
2805            specific group in the classification dialog. Changed how layers
2806            are drawn when the layer is visible/invisible.
2807    
2808            * Thuban/UI/mainwindow.py: Removed legend specific code and
2809            replaced it with calls to the new dock code.
2810    
2811            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2812            to check if scale > 0. Trying to track down a divide by zero.
2813    
2814    2003-03-26  Jonathan Coles   <[email protected]>
2815    
2816            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2817            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2818            now part of DockableWindow.
2819            (LegendPanel.DoOnSelChanged): Select the current layer in the
2820            map.
2821            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2822            with the selected layer and/or group.
2823    
2824    2003-03-26  Jonathan Coles   <[email protected]>
2825    
2826            This putback contains the code for dockable windows. There is
2827            no support in wxWindows as of this date for windows that can
2828            attach themselves to other windows.
2829    
2830            The current model contains a DockableWindow which has a parent
2831            window for when it is detached and a dock window that it puts
2832            its contents in when it is docked. The contents of a DockableWindow
2833            must be a DockPanel. DockPanel itself derives from wxPanel.
2834    
2835            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2836            message, not a LAYER_LEGEND_CHANGED message.
2837    
2838            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2839    
2840            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2841            as one of the style properties for the fieldTypeText item to
2842            be sure that its size is correct when the text changes.
2843    
2844            * Thuban/UI/dock.py: New. Classes for the DockPanel and
2845            DockableWindow.
2846    
2847            * Thuban/UI/legend.py: Added some more buttons and made the
2848            LegendPanel a DockPanel.
2849    
2850            * Thuban/UI/mainwindow.py: Added sash windows to the main window
2851            and supporting functions for manipulating the sashes.
2852            (MainWindow.ShowLegend): Create a DockableWindow with the
2853            LegendPanel as the contents.
2854    
2855            * Thuban/UI/messages.py: Added DOCKABLE_* messages
2856    
2857            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2858            not LAYER_LEGEND_CHANGED, messages.
2859    
2860    2003-03-25  Jonathan Coles   <[email protected]>
2861    
2862            * setup.py: Added custom script bdist_rpm_build_script so that
2863            when the rpm is built the path to wx-config is correct.
2864    
2865            * setup.cfg: Added line saying to use the custom build script
2866    
2867    2003-03-20  Jonathan Coles   <[email protected]>
2868    
2869            Initial implementation of the Legend.
2870    
2871            * Thuban/UI/legend.py: New. Creates a window that shows the map's
2872            Legend information and allows the user to add/modify classifications
2873            and how the layers are drawn on the map.
2874    
2875            * setup.py: New command 'build_docs' which currently uses
2876            happydoc to generate html documentation for Thuban.
2877    
2878            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2879            Returns a string which is appropriately describes the group.
2880    
2881            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2882            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2883    
2884            * Thuban/Model/map.py (Map): Rename messages and use new, more
2885            specific, messages.
2886    
2887            * Thuban/Model/messages.py: New message to indicate that a layer's
2888            data has changed (LAYER_CHANGED). New map messages to indicate
2889            when layers have been added/removed/changed or if the stacking order
2890            of the layers has changed.
2891    
2892            * Thuban/Model/session.py: Rename and use new messages.
2893    
2894            * Thuban/UI/classifier.py: Remember if any changes have actually
2895            been applied so that if the dialog is cancelled without an application
2896            of changes we don't have to set a new classification.
2897            (ClassDataPreviewer): Pulled out the window specific code and put it
2898            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2899            symbols on any DC.
2900            
2901            * Thuban/UI/mainwindow.py: New code to open the legend.
2902    
2903            * Thuban/UI/view.py: Use new message names.
2904    
2905    2003-03-19  Jonathan Coles   <[email protected]>
2906    
2907            * Thuban/UI/main.py (verify_versions): New. Checks the versions
2908            of Python, wxPython, and some other libraries.
2909    
2910            * extensions/thuban/wxproj.cpp (check_version): Checks the given
2911            version against what wxproj was compiled with.
2912            (check_version_gtk): If wxproj was compiled with gtk then check
2913            the given version against the version of the gtk library
2914            currently being used.
2915    
2916    2003-03-14  Bernhard Herzog  <[email protected]>
2917    
2918            * test/test_command.py: Run the tests when the module is run as a
2919            script
2920    
2921    2003-03-14  Bernhard Herzog  <[email protected]>
2922    
2923            Implement selection of multiple selected shapes in the same layer:
2924    
2925            - Introduce a new class to hold the selection. This basically
2926              replaces the interactor which was nothing more than the
2927              selection anyway. A major difference is of course that the new
2928              selection class supports multiple selected shapes in one layer
2929            
2930            - Move the object that represents the selection from the
2931              application to the canvas. The canvas is a better place than the
2932              application because the selection represents which shapes and
2933              layer of the map displayed by the canvas are selected and
2934              affects how the map is drawn.
2935    
2936            - Make the selection and its messages publicly available through
2937              the mainwindow.
2938    
2939            - The non-modal dialogs do not get a reference to the interactor
2940              anymore as they can simply refer to their parent, the
2941              mainwindow, for the what the interactor had to offer.
2942    
2943            * Thuban/UI/selection.py: New module with a class to represent the
2944            selection.
2945    
2946            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2947            these unused messages
2948    
2949            * Thuban/UI/application.py (ThubanApplication.OnInit)
2950            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
2951            interactor is gone now.
2952            (ThubanApplication.CreateMainWindow): There is no interactor
2953            anymore so we pass None as the interactor argument for now for
2954            compatibility.
2955    
2956            * Thuban/UI/view.py (MapCanvas.delegated_messages)
2957            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
2958            Unsubscribe, delegate messages according to the delegated_messages
2959            class variable.
2960            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
2961            attributes from instance variables as described with the
2962            delegated_methods class variable.
2963            (MapCanvas.__init__): New instance variable selection holding the
2964            current selection
2965            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
2966            pass them on to the renderer
2967            (MapCanvas.SetMap): Clear the selection when a different map is
2968            selected.
2969            (MapCanvas.shape_selected): Simple force a complete redraw. The
2970            selection class now takes care of only issueing SHAPES_SELECTED
2971            messages when the set of selected shapes actually does change.
2972            (MapCanvas.SelectShapeAt): The selection is now managed in
2973            self.selection
2974    
2975            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
2976            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
2977            Unsubscribe, delegate messages according to the delegated_messages
2978            class variable.
2979            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
2980            attributes from instance variables as described with the
2981            delegated_methods class variable.
2982            (MainWindow.__init__): The interactor as ivar is gone. The
2983            parameter is still there for compatibility. The selection messages
2984            now come from the canvas.
2985            (MainWindow.current_layer, MainWindow.has_selected_layer):
2986            Delegate to the the canvas.
2987            (MainWindow.LayerShowTable, MainWindow.Classify)
2988            (MainWindow.identify_view_on_demand): The dialogs don't need the
2989            interactor parameter anymore.
2990    
2991            * Thuban/UI/tableview.py (TableFrame.__init__)
2992            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
2993            (LayerTableFrame.row_selected): The interactor is gone. It's job
2994            from the dialog's point of view is now done by the mainwindow,
2995            i.e. the parent. Subscribe to SHAPES_SELECTED instead
2996            of SELECTED_SHAPE
2997            
2998            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
2999            is gone. It's job from the dialog's point of view is now done by
3000            the mainwindow, i.e. the parent.
3001            
3002            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3003            gone. It's job from the dialog's point of view is now done by the
3004            mainwindow, i.e. the parent.
3005    
3006            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3007            gone. It's job from the dialog's point of view is now done by the
3008            mainwindow, i.e. the parent.
3009            (SessionTreeCtrl.__init__): New parameter mainwindow which is
3010            stored as self.mainwindow. The mainwindow is need so that the tree
3011            can still subscribe to the selection messages.
3012            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3013            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3014            selection is now accessible through the mainwindow. Subscribe to
3015            SHAPES_SELECTED instead of SELECTED_SHAPE
3016    
3017            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3018            SHAPES_SELECTED message now.
3019            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3020            so deal with multiple shapes
3021            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3022            gone. It's job from the dialog's point of view is now done by the
3023            mainwindow, i.e. the parent.
3024    
3025            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3026            parameter is now a list of shape ids.
3027            (RecordTable.SetTable): The second parameter is now a list of
3028            indices.
3029    
3030            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3031            selected_shape parameter and ivar to selected_shapes. It's now a
3032            list of shape ids.
3033            (MapRenderer.draw_label_layer): Deal with multiple selected
3034            shapes. Rearrange the code a bit so that the setup and shape type
3035            distinctions are only executed once.
3036    
3037            * test/test_selection.py: Test cases for the selection class
3038    
3039    2003-03-11  Jonathan Coles   <[email protected]>
3040    
3041            * Thuban/Model/load.py: Temporary fix so that the xml reader
3042            doesn't cause Thuban to crash.
3043    
3044            * Thuban/Model/layer.py: Handle the cyclic references between
3045            a layer and its classification better, and be sure to disconnect
3046            the classification from the layer when the layer is destroyed
3047            so that we don't maintain a cyclic reference that may not be
3048            garbage collected.
3049    
3050            * Thuban/Model/classification.py: See comment for layer.py.
3051    
3052    2003-03-12  Jan-Oliver Wagner <[email protected]>
3053    
3054            * HOWTO-Release: New. Information on the steps for releasing
3055            a new version of Thuban.
3056    
3057    2003-03-11  Jonathan Coles   <[email protected]>
3058    
3059            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3060            Use True instead of true.
3061            (Classifier): Should have a single panel in which all the controls lie.
3062    
3063            * Thuban/UI/proj4dialog.py: Add normal border.
3064    
3065            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3066    
3067            * Thuban/UI/mainwindow.py: Use True instead of true.
3068    
3069            * setup.py: Update some definitions to use wxWindows2.4 files
3070    
3071            * Data/iceland_sample_class.thuban: Fixed file so that the
3072            field_type information is present.
3073    
3074    2003-03-10  Jonathan Coles   <[email protected]>
3075    
3076            * Thuban/UI/classifier.py (Classifier.__init__): Make the
3077            field type label grow so that when the text changes the
3078            size is updated correctly. This may be a wxWindows bug.
3079    
3080    2003-03-10  Jonathan Coles   <[email protected]>
3081    
3082            * Thuban/UI/application.py: Changed SESSION_CHANGED to
3083            SESSION_REPLACED.
3084    
3085            * Thuban/UI/classifier.py: Wrap text with _().
3086            (ClassGrid.CreateTable): Set dimensions and size hints here,
3087            instead of in Reset, so we only set the size once.
3088    
3089            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3090    
3091            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3092            Call Close() instead of Shutdown().
3093    
3094            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3095    
3096            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3097            Go back to using OnClose() instead of Shutdown().
3098    
3099    2003-03-10  Jonathan Coles   <[email protected]>
3100    
3101            * Thuban/UI/classifier.py (Classifier): SelectField() needed
3102            to know the old field index as well as the new one.
3103    
3104    2003-03-10  Jonathan Coles   <[email protected]>
3105    
3106            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3107            to correctly set the table information and call this from
3108            __init__ and from _OnFieldSelect so that all the information
3109            is up to date when the dialog opens and when a field is changed.
3110    
3111    2003-03-10  Jonathan Coles   <[email protected]>
3112    
3113            * Thuban/Model/classification.py (Classification): Don't use
3114            layer's message function directly, use the ClassChanged() method
3115            when then classification changes. SetField/SetFieldType/SetLayer
3116            must keep the information about field name and field type in
3117            sync when an owning layer is set or removed.
3118    
3119            * Thuban/Model/layer.py: Added ClassChanged() so that the
3120            classification can tell the layer when its data has changed.
3121            (Layer.SetClassification): Accepts None as an arguement to
3122            remove the current classification and correctly handles
3123            adding a new classification.
3124    
3125            * Thuban/Model/load.py: Comment out print statement
3126    
3127            * test/test_classification.py, test/test_save.py: New and
3128            improved tests.
3129    
3130    2003-03-07  Jonathan Coles   <[email protected]>
3131    
3132            * Thuban/Model/classification.py: Implemented __copy__ and
3133            __deepcopy__ for ClassGroup* and ClassGroupProperites so
3134            they can easily be copied by the classifier dialog.
3135            (ClassGroupProperites.__init__): The default line color should
3136            have been Color.Black.
3137    
3138            * Thuban/UI/classifier.py: Setting and Getting table values now
3139            uses a consistent set of functions.
3140            (Classifier): Now non-modal. Has field type label which changes
3141            as the field changes. Keep track of buttons in a list so that
3142            we can enable/disable the buttons when the None field is selected.
3143            (SelectPropertiesDialog): Add buttons to make the colors transparent.
3144    
3145            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3146            does what OnClose did, but can be called by the application to
3147            close a window. Needed when a session changes, and we have to
3148            close the classifier windows.
3149    
3150            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3151            Shuts down open dialogs. Used when a new session is created
3152            or a session is opened.
3153            (MainWindow.SaveSession): Should only call application.SaveSession()
3154            if we don't call SaveSessionAs first.
3155            (MainWindow.Classify): Allow different classifier dialogs for
3156            different layers.
3157    
3158            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3159            the parent class handle it. Add Shutdown() to unsubscibe from
3160            event notification and call the parent Shutdown(). This was
3161            necessary so the application can close the tree window.
3162    
3163    2003-03-06  Jonathan Coles   <[email protected]>
3164    
3165            * Thuban/Model/classification.py: Minor documentation changes,
3166            Addition of __eq__ and __ne__ methods.
3167            (Classification.SetLayer): prevent recursion between this method
3168            and Layer.SetClassification().
3169    
3170            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3171    
3172            * Thuban/Model/layer.py (SetClassification): prevent recursion
3173            between this method and Classification.SetLayer().
3174    
3175            * test/test_classification.py, test/test_load.py,
3176            test/test_session.py: Fixed and added tests for the classification
3177            classes.
3178    
3179    2003-03-06  Bernhard Herzog  <[email protected]>
3180    
3181            * Thuban/UI/classifier.py (ClassGrid.__init__)
3182            (ClassGrid.CreateTable): Move the SetSelectionMode call to
3183            CreateTable because otherwise it triggers an assertion in
3184            wxPython/wxGTK 2.4.
3185    
3186    2003-03-05  Jonathan Coles   <[email protected]>
3187    
3188            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3189    
3190            * Thuban/Model/load.py: import FIELDTYPE constants from table.
3191    
3192            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3193    
3194            * Thuban/Model/table.py: Put FIELDTYPE constants back.
3195    
3196    2003-03-05  Jonathan Coles   <[email protected]>
3197    
3198            * Thuban/UI/classifier.py: Added class documentation.
3199            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3200            Store just the groups in the table and generate the other
3201            column information when it is requested. Add "None" field
3202            to pull-down to select no classification.
3203    
3204            * Thuban/common.py: Moved FIELDTYPE constants from table.py
3205            (Str2Num): Only catch ValueError exceptions.
3206    
3207            * Thuban/Model/classification.py: Class documentation. Renaming
3208            of methods with Stroke to Line. Groups are stored in a single
3209            list with the default as the first element. Groups are searched
3210            in the order they appear in the list.
3211    
3212            * Thuban/Model/color.py: Documentation.
3213    
3214            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3215            the kind of data represented by a field.
3216    
3217            * Thuban/Model/load.py (ProcessSession): Use proper string
3218            conversion function; fixes RTbug #1713.
3219    
3220            * Thuban/Model/save.py (Saver): Store field type information.
3221    
3222            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3223            (Table): Add field_info_by_name() to retrieve field information
3224            by specifying the field name, not the number.
3225    
3226            * Thuban/UI/mainwindow.py: Function name changes.
3227    
3228            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3229            get the layer classification once. Don't try to classify
3230            values when the field is None: just use the default properties.
3231    
3232            * Thuban/UI/view.py: Function name changes.
3233    
3234            * Doc/thuban.dtd: Add field_type attribute to a classification.
3235    
3236    2003-03-04  Bernhard Herzog  <[email protected]>
3237    
3238            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3239            the fill and stroke layer attributes optional with suitable
3240            default values. Add the stroke_width layer attribute. Use correct
3241            syntax for empty elements. Make the attribute list for labels
3242            refer to the label element.
3243    
3244    2003-03-04  Bernhard Herzog  <[email protected]>
3245    
3246            * setup.py (thuban_build_py.build): Add a comment about distutils in
3247            Python 2.3 containing some of the functionality we implement in
3248            setup.py ourselves.
3249    
3250            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3251            before the selection mode. Doing it the other way round triggers
3252            an assertion in wxWindows.
3253    
3254            * Thuban/Model/save.py (escape): Fix typo in doc-string
3255    
3256            * Thuban/Model/classification.py: Remove unnecessary wxPython
3257            import
3258    
3259    2003-03-04  Jonathan Coles   <[email protected]>
3260    
3261            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3262            Parameter 'value' should default to None.
3263    
3264            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3265            the class attribute __classification is now private.
3266    
3267            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3268            Classifier to ClassGrid. Added support for removing selected rows,
3269            which including code for keeping track of when cells are selected,
3270            and deselected.
3271            (ClassTable): Support for added/removing rows. Fixed a problem
3272            with __ParseInput whereby it would not allow strings (only numbers)
3273            to be entered.
3274            (Classifier): Added button and supporting code for removing
3275            selected rows.
3276    
3277    2003-02-27  Jonathan Coles   <[email protected]>
3278    
3279            * Thuban/common.py: Moved color conversion functions into
3280            Thuban/UI/common.py.
3281            (Str2Num): Now converts the float (not the string) to a long/int
3282            so that an exception isn't thrown.
3283    
3284            * Thuban/UI/common.py: Common functions used in several UI modules
3285    
3286            * Thuban/Model/classification.py: Changed the class hierarchy
3287            so that a Classification consists of Groups which return
3288            Properties when a value matches a Group.
3289    
3290            * Thuban/Model/layer.py: Fixed name resolution problem.
3291    
3292            * Thuban/Model/load.py: Use new Classification and Group functions.
3293    
3294            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3295            failure.
3296            (Saver.write_classification): Use new Classification and Group
3297            functions.
3298    
3299            * Thuban/UI/classifier.py: Changes to use new Classification and Group
3300            functions. Fix to create a tuple with a single value instead of
3301            simply returning the value.
3302    
3303            * Thuban/UI/renderer.py: Use new Classification and Group functions.
3304            Use common.py functions.
3305    
3306            * Thuban/UI/tree.py: Use common.py functions.
3307            
3308            * test/test_classification.py: Use new Classification and Group
3309            classes.
3310    
3311    2003-02-24  Jonathan Coles   <[email protected]>
3312    
3313            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3314            functions from Thuban color objects to wxWindow colour objects.
3315    
3316            * Thuban/Model/classification.py (Classification): Renamed
3317            GetProperties() to GetClassData(). Used the new iterator
3318            in TreeInfo().
3319            (ClassIterator): Iterator implementation to iterate over the
3320            ClassData objects in a classification object.
3321    
3322            * Thuban/Model/save.py (Saver.write_classificaton): Uses
3323            the new iterator to save the classification information.
3324    
3325            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3326            for changing the stroke and fill colors and previewing the
3327            changes.
3328    
3329            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3330            MainWindow.SaveSessionAs): Text string changes so the dialogs
3331            have more meaningful titles.
3332    
3333            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3334            Classification method name from GetProperties to GetClassData.
3335    
3336            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3337            instead of accessing now non-existent class variables.
3338    
3339    2003-02-24  Bernhard Herzog  <[email protected]>
3340    
3341            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3342            unneeded Shape() call. Rendering is substantially faster without
3343            it and it avoids some problems with broken shape files.
3344    
3345    2003-02-20  Frank Koormann   <[email protected]>
3346    
3347            Force minimal size of identify and label dialogs. The autosizing
3348            looked too ugly.
3349    
3350            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3351            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3352            Set size of listctrl.
3353            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3354            Set size of dialog.
3355    
3356    2003-02-19  Jonathan Coles   <[email protected]>
3357    
3358            * test/test_classification.py, test/test_layer.py,
3359            test/test_load.py, test/test_map.py, test/test_session.py:
3360            Updated the tests to use the new functions that are in the
3361            respective classes.
3362    
3363            * Thuban/Model/classification.py (Classification):
3364            Uses the new ClassData* classes. Modification messages are
3365            passed up to the parent layer (if it exists).
3366            (ClassData): New class to encapsulate the common data in each
3367            classification property.
3368            (ClassDataDefault): Represents the Default class. data.
3369            (ClassDataPoint): Represents a single class. data point
3370            (ClassDataRange): Represents a class. range
3371            (ClassDataMap): Represents a class. map (unused).
3372    
3373            * Thuban/Model/color.py: Added Color.None to represent something
3374            with no color. Color.Black represents the color black.
3375            (NoColor): Helper class derived from Color to represent something
3376            with no color.
3377    
3378            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3379            stroke_width attributes. Made the 'classification' attribute private.
3380            New methods for setting/getting the classification.
3381    
3382            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3383            to get the classifcation and use the new ClassData* classes to
3384            hold the classification data. Use Str2Num to convert numbers
3385            properly.
3386    
3387            * Thuban/Model/save.py (Saver): Use new Color and Classification
3388            methods
3389    
3390            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3391            custom grid.
3392            (ClassTable): Support for editing Values and Labels and for
3393            changing what type (point or range) of data is stored in each
3394            property based on how the user enters the data.
3395            (Classifier): Support for saving the new classifications and
3396            launching the dialog to edit a property.
3397            (SelectPropertiesDialog): New class for editing the visual
3398            properties of a classification (stroke color, width, and fill color)
3399            (ClassPreviewer): Took the Draw method from ClassRenderer and
3400            made most of it into this new class. Intend to use this class in
3401            the SelectPropertiesDialog for previewing changes.
3402    
3403            * Thuban/UI/renderer.py: Use new Color and Classification methods.
3404    
3405            * Thuban/UI/tree.py: Formatting changes.
3406    
3407            * Doc/thuban.dtd: Add 'label' element
3408    
3409            * Thuban/common.py: New. Contains common routines used throughout
3410            the code.
3411            (Str2Num): Takes a string and converts it to the "best" type of
3412            number.
3413    
3414    2003-02-14  Bernhard Herzog  <[email protected]>
3415    
3416            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3417            dragging flag is always set to 0 even when the tool implementation
3418            raises an exception
3419    
3420    2003-02-11  Bernhard Herzog  <[email protected]>
3421    
3422            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3423            method to create a splash screen.
3424            (ThubanApplication.ShowMainWindow): New. Show the main window.
3425            Needed so the splash screen can display the mainwindow
3426            (ThubanApplication.OnInit): Call the
3427            new splash_screen method to determine whether the application
3428            should display a splash screen. If it displays a splash screen do
3429            not immediately show the main window.
3430    
3431    2003-02-11  Jonathan Coles  <[email protected]>
3432    
3433            * Thuban/Model/classification.py: Added import line to fix
3434            feature conflicts between running on python2.2 and python2.1.
3435    
3436            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3437            onto the clinfo parameter, so removed the deepcopy().
3438    
3439    2003-02-10  Jonathan Coles  <[email protected]>
3440    
3441            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3442            Added element_open variable to track opening and closing of tags
3443            so that tags that don't span more than one line are closed with
3444            /> instead of </tag_name>. Use the GetDefault*() methods of
3445            the Classification class.
3446    
3447            * Thuban/Model/classification.py (Classificaton): Added set and
3448            get methods for the default data. The class also takes a layer
3449            reference so that modification messages can be sent. Fixed the
3450            methods to use the new ClassData class.
3451            (ClassData): New class to encapsulate the classification data
3452    
3453            * Thuban/Model/layer.py (Layer): Remove the
3454            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3455            SetDefault*() methods on the layer's classification object.
3456            (Layer.__init__): Use the new SetDefault*() methods in the
3457            Classification class.
3458    
3459            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3460            object instead of a dictionary.
3461    
3462            * Thuban/UI/classifier.py (ClassRenderer): New class to
3463            draw the classifications in the dialog box's table.
3464            (Classifier): Modified to use the ClassRenderer class.
3465    
3466            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3467            methods of the Classification class.
3468    
3469            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3470            of the ClassData class.
3471    
3472            * test/test_classification.py, test/test_layer.py,
3473            test/test_map.py, test/test_session.py: Fix the tests to work
3474            with the above code changes.
3475    
3476    2003-02-03  Jonathan Coles  <[email protected]>
3477    
3478            * Thuban/Model/classification.py (Classification): Added getNull()
3479            to return the NullData reference
3480    
3481            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3482            Layer.SetStrokeWidth): Modified these functions to change the
3483            null data in the classification rather than keep these values
3484            directly in the Layer class. Menu options to change these values
3485            work again.
3486    
3487    2003-01-28  Jonathan Coles  <[email protected]>
3488    
3489            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3490            Fixed crashing problem on some systems. Dialog box shows
3491            classification data.
3492    
3493            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3494            Colors in the tree view.
3495    
3496            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3497            the tree info for classifications. Commented out unnecessary lines.
3498    
3499            * Thuban/Model/classification.py (Classification.TreeInfo): New
3500            function to add information about the classification into the
3501            tree view.
3502    
3503    2003-01-27  Jan-Oliver Wagner <[email protected]>
3504    
3505            * Thuban/__init__.py (_): New.
3506    
3507            * Thuban/Model/classification.py, Thuban/Model/extension.py,
3508            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3509            Thuban/Model/session.py, Thuban/UI/application.py,
3510            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3511            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3512            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3513            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3514            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3515    
3516    2003-01-27  Jonathan Coles  <[email protected]>
3517    
3518            * Thuban/Model/layer.py: Classification initialization calls.
3519    
3520            * Thuban/Model/classification.py: Created class to encapsulate
3521            a layer classification. Supports specific data points and
3522            ranges.
3523    
3524            * Thuban/Model/load.py: Added support for loading classification
3525            information.
3526    
3527            * Thuban/Model/save.py: Added support for saving classification
3528            information.
3529    
3530            * Thuban/UI/classifier.py: Initial class for a dialog box for
3531            specifying classification information.
3532    
3533            * Thuban/UI/mainwindows.py: Support for opening the classifier
3534            dialog.
3535    
3536            * Thuban/UI/renderer.py: Support for drawing a layer with the
3537            classification information.
3538    
3539            * Data/iceland_sample_class.thuban: iceland_sample with
3540            classification data.
3541    
3542            * test/test_classification: Tests for the Classification class.
3543    
3544    2002-12-09  Bernhard Herzog  <[email protected]>
3545    
3546            * test/test_command.py: New. Tests for the command classes.
3547    
3548            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
3549            (Command.IsTool): New method to distinguish between command
3550            switching tools and other commands.
3551    
3552            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
3553            the tool to avoid direct assignments to instance variables
3554            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
3555            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
3556            change the tool
3557    
3558            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
3559            active tool's command turns insensitive, disable the tool.
3560            (_tool_command): Use the new ToolCommand class
3561    
3562            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
3563            SelectTool method to change the tool
3564            (iconfile): Use the ToolCommand class
3565    
3566    2002-12-03  Bernhard Herzog  <[email protected]>
3567    
3568            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
3569            the case of selected items that are not children of Layers or Maps
3570            properly. Previously this bug would trigger an assertion in
3571            wxWindows.
3572    
3573    2002-11-06  Frank Koormann  <[email protected]>
3574    
3575            * Thuban/UI/mainwindow.py: Altered the order of tools in the
3576            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
3577            Full Extent).
3578    
3579    2002-10-23  Bernhard Herzog  <[email protected]>
3580    
3581            * setup.py (setup call): version now 0.1.3
3582    
3583            * MANIFEST.in: Add the files in test/
3584    
3585            * test/README: Add note about tests requiring the iceland data
3586    
3587            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
3588            copyright notice.
3589    
3590    2002-10-18  Bernhard Herzog  <[email protected]>
3591    
3592            * test/test_map.py
3593            (TestMapWithContents.test_projected_bounding_box): Use an explicit
3594            epsilon.
3595    
3596            * test/support.py (FloatComparisonMixin.assertFloatEqual)
3597            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
3598            message if the assertion fails and don't return the return value
3599            of self.assert_. In assertFloatSeqEqual the return meant that not
3600            all items of the sequence were compared.
3601    
3602    2002-09-20  Bernhard Herzog  <[email protected]>
3603    
3604            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3605    
3606            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3607    
3608            * test/test_map.py (TestMapWithContents.test_tree_info): Create
3609            the string with the bounding box on the fly because of platform
3610            differences in the way %g is handled.
3611    
3612            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
3613            DBFfile too because Thuban layers can't yet cope missing DBF
3614            files.
3615    
3616    2002-09-20  Bernhard Herzog  <[email protected]>
3617    
3618            * test/test_menu.py: Use initthuban instead of
3619            add_thuban_dir_to_path to initialize Thuban.
3620    
3621            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
3622            Mixin class for float comparisons
3623            (SubscriberMixin): New. Mixin class to test messages sent through
3624            the Connector class
3625    
3626            * test/README: Fix a typo and add the -v flag to the command for
3627            individual tests
3628    
3629            * test/test_session.py: New. Test cases for Thuban.Model.session
3630    
3631            * test/test_proj.py: New. Test cases for Thuban.Model.proj
3632    
3633            * test/test_map.py: New. Test cases for Thuban.Model.map
3634    
3635            * test/test_layer.py: New. Test cases for Thuban.Model.layer
3636    
3637            * test/test_label.py: New. Test cases for Thuban.Model.label
3638    
3639            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
3640    
3641            * test/test_color.py: New. Test cases for Thuban.Model.color
3642    
3643            * test/test_base.py: New. Test cases for Thuban.Model.base
3644    
3645    2002-09-13  Bernhard Herzog  <[email protected]>
3646    
3647            * Thuban/Model/session.py (Session.forwarded_channels): Forward
3648            the CHANGED channel too.
3649    
3650            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
3651            CHANGED channel too.
3652            (Map.__init__): Call the Modifiable constructor as well.
3653    
3654            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
3655            event if the modified flag changes.
3656            (Modifiable.changed): Tweak the doc-string.
3657    
3658            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
3659            (MainWindow.set_position_text): Put the code that puts the text
3660            with the mouse position into the status bar into the new method
3661            set_position_text so that it can overwritten in derived classes.
3662    
3663    2002-09-12  Bernhard Herzog  <[email protected]>
3664    
3665            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
3666            message box on the main window.
3667    
3668    2002-09-11  Bernhard Herzog  <[email protected]>
3669    
3670            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
3671            the 'E' because it's less likely to interfere with other menu
3672            entries.
3673            (MainWindow.build_menu): remove an incorrect comment.
3674    
3675    2002-09-10  Bernhard Herzog  <[email protected]>
3676    
3677            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
3678            (_tool_command): Add sensitive parameter
3679            (_has_visible_map): Sensitivity callback to tools and other
3680            commands that require a visible map. Use it in map_zoom_in_tool,
3681            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
3682            and map_full_extent
3683    
3684    2002-09-06  Bernhard Herzog  <[email protected]>
3685    
3686            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3687            VIEW_POSITION
3688    
3689    2002-09-04  Frank Koormann  <[email protected]>
3690    
3691            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3692    
3693    2002-09-02  Bernhard Herzog  <[email protected]>
3694    
3695            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
3696            wxWindows already and our implementation doesn't work correctly
3697            with wxGTK 2.3:
3698            (MapCanvas.__init__): Remove the instance variable
3699            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
3700            be drawin
3701            (MapCanvas.OnIdle): Removed.
3702    
3703            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
3704            a parameter to determine the size of the rectangle.
3705            (MapCanvas.find_shape_at): Create the box around the point on a
3706            layer by layer basis and make the size depend on the shape type.
3707            This solves a problem with the selection of point shapes at the
3708            border of the layer's bounding box
3709    
3710    2002-08-30  Bernhard Herzog  <[email protected]>
3711    
3712            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
3713            for the sensitivity  of remove layer.
3714            (_can_remove_layer): New. Sensitivity callback for remove layer
3715            (Command layer_remove): Use _can_remove_layer
3716    
3717            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
3718            determine whether a given layer can be deleted.
3719    
3720            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3721            (MapCanvas.do_redraw): Get rid of the unused update_region
3722            instance variable
3723    
3724            * Thuban/UI/view.py: Add/update some doc-strings.
3725    
3726            * test/: new subdirectory with a bunch of unit tests.
3727    
3728            * test/README, test/test_table.py, test/test_save.py,
3729            test/test_menu.py, test/test_load.py: Initial set of tests and
3730            brief instructions on how to run them
3731    
3732    2002-08-29  Bernhard Herzog  <[email protected]>
3733    
3734            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3735            arcs with multiple parts.
3736    
3737            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3738            Handle degenrate rectangles.
3739    
3740            * Thuban/Model/table.py: Make writing records work correctly:
3741            (Table.__init__): Keep track of whether the DBF is open for
3742            writing
3743            (Table.write_record): Open the DBF file for writing when necessary
3744    
3745    2002-08-27  Bernhard Herzog  <[email protected]>
3746    
3747            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
3748            dbf files only for reading by default. Use a new writable dbf
3749            object for writing.
3750    
3751    2002-08-26  Bernhard Herzog  <[email protected]>
3752    
3753            * Thuban/UI/mainwindow.py: Refactor the context creation:
3754            (MainWindow.Context): New method to return a context
3755            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
3756            new method
3757    
3758            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
3759            layer table specific code from TableGrid into LayerTableGrid
3760            (TableFrame, LayerTableFrame): Split the layer table specific code
3761            from TableFrame into LayerTableFrame
3762            (LayerTableGrid.select_shape): Remove a debug print
3763    
3764            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3765            LayerTableFrame
3766    
3767    2002-08-23  Bernhard Herzog  <[email protected]>
3768    
3769            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
3770            absolute filename.
3771    
3772    2002-08-22  Bernhard Herzog  <[email protected]>
3773    
3774            * Thuban/Model/table.py (Table.write_record): New method to write
3775            records.
3776            (Table.__init__): Open the DBF file for writing too.
3777    
3778            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
3779            into the underlying table.
3780    
3781            * extensions/shapelib/shapefil.h (DBFCommit),
3782            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
3783            commit any changes made to the DBF file.
3784    
3785            * Thuban/UI/mainwindow.py (make_check_current_tool)
3786            (_tool_command): Put the code that generates the "checked"
3787            callback into a separate function so that we can reuse it
3788            elsewhere
3789    
3790            * Thuban/Model/save.py (Saver): New class to handle serializing a
3791            session into an XML file. The main reason to introduce a class is
3792            that applications built on Thuban can derive from it so that they
3793            can save additional information in a session file.
3794            (save_session): Delegate almost all the work to the Saver class.
3795            Rename the filename argument to file because it may be a file like
3796            object now.
3797    
3798            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
3799            code. Remove the little test code which would be executed when the
3800            module is run as a script which didn't work anymore since it can't
3801            import the other Thuban modules.
3802            (ProcessSession, load_session): Refactor the ProcessSession to
3803            have one method for each element start and end tag so that derived
3804            classes can easily override the processing of individual tags.
3805            Also, always parse with namespaces enabled because applications
3806            built on top of Thuban will likely use namespaces if they extend
3807            the session file format.
3808    
3809    2002-08-21  Bernhard Herzog  <[email protected]>
3810    
3811            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3812            because thubaninit_contents will do it for us.
3813    
3814    2002-08-16  Jan-Oliver Wagner <[email protected]>
3815    
3816            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3817            tree window already open
3818    
3819    2002-08-15  Bernhard Herzog  <[email protected]>
3820    
3821            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
3822            with self.
3823    
3824            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
3825            when we have actually captured it.
3826    
3827            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
3828            shapefile and destroy the table.
3829    
3830            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
3831    
3832    2002-08-14  Bernhard Herzog  <[email protected]>
3833    
3834            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
3835            instance variable columns
3836            (RecordTable.GetTypeName): row and col may be negative in some
3837            cases.
3838    
3839            * setup.py (InstallLocal.initialize_options)
3840            (InstallLocal.finalize_options, InstallLocal.user_options): New
3841            option create-init-file to build a thubaninit.py when running
3842            install_local
3843            (InstallLocal.run): Create the thubaninit.py module when requested
3844            (thubaninit_contents): Split the template into several parts and
3845            create a new function thubaninit_contents that creates the
3846            contents of a thubaninit module.
3847            (ThubanInstall.run): Use the new function to create the thubaninit
3848            module.
3849    
3850    2002-07-30  Bernhard Herzog  <[email protected]>
3851    
3852            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
3853            cleanup.
3854            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
3855    
3856            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
3857            direct base class' Destroy method.
3858    
3859            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
3860            layers.
3861            (Map.Destroy): Destroy the label_layer as well and call the
3862            inherited Desatroymethod first so that no more messages are
3863            issued.
3864            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
3865            message if the stacking order actually has changed. Add
3866            doc-strings.
3867            (Map.BoundingBox): Correct the doc-string.
3868            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
3869            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
3870    
3871            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
3872            all labels.
3873    
3874    2002-07-29  Bernhard Herzog  <[email protected]>
3875    
3876            * Thuban/Model/map.py (Map.subscribe_layer_channels)
3877            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
3878            to a layer's channels into separate methods.
3879            (Map.RemoveLayer, Map.AddLayer): Call the new methods
3880            (Map.Destroy): Unsubscribe from a layer's channels before
3881            destroying it.
3882    
3883            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
3884            selected_layer parameter to searched_layer which is the layer to
3885            search in.
3886            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
3887            search to that layer. Return the selected layer and shape.
3888    
3889            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
3890            typo
3891    
3892    2002-07-24  Bernhard Herzog  <[email protected]>
3893    
3894            * Thuban/UI/application.py (ThubanApplication.create_session):
3895            Extend the doc string.
3896            (ThubanApplication.subscribe_session)
3897            (ThubanApplication.unsubscribe_session): New methods to
3898            subscribe/unsubscribe to/from session channels.
3899            (ThubanApplication.SetSession): Call the new methods here.
3900            (ThubanApplication.maps_changed, ThubanApplication.set_map):
3901            Renamed set_map to maps_changed. Its now a subscriber for
3902            MAPS_CHANGED.
3903    
3904            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
3905            x-coordinate in case of simple clicks
3906    
3907            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
3908            don't pass it as a parameter
3909    
3910            * Thuban/Model/session.py (Session.RemoveMap): New
3911    
3912            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3913            window size into a parameter.
3914    
3915    2002-07-23  Bernhard Herzog  <[email protected]>
3916    
3917            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3918            just commands.
3919    
3920            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
3921            parameter list a bit to allow setting the window title and the
3922            initial message in the status bar. Update the callers.
3923    
3924            * Thuban/UI/application.py (ThubanApplication.OnInit)
3925            (ThubanApplication.CreateMainWindow): Put the mainwindow
3926            instantiation into a separate method so that it can be overridden
3927            by a subclass.
3928    
3929    2002-07-19  Bernhard Herzog  <[email protected]>
3930    
3931            * Thuban/Model/session.py: Issue a CHANGED message every time
3932            another changed message is issued to make it easier to get
3933            notified of changes.
3934            (Session): Update the doc string
3935            (Session.forward): Issue changed-events as CHANGED as well.
3936            (Session.changed): Overwrite the inherited version to issue
3937            CHANGED events as well.
3938    
3939            * Thuban/UI/tree.py: We can now simply subscribe to the session's
3940            CHANGED channel to be informed of changes.
3941            (SessionTreeCtrl.session_channels): Not needed any longer.
3942            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3943            Only have to (un)subscribe CHANGED
3944    
3945            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3946    
3947            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
3948            for the wxPython locale bug to __init__.py so that it's
3949            automatically executed by anybody using UI code from Thuban.
3950    
3951    2002-07-18  Bernhard Herzog  <[email protected]>
3952    
3953            * Thuban/UI/main.py (main): app no longer needs to be global
3954    
3955            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
3956            as parameter and store it in an instance variable
3957            (MainWindow.invoke_command, MainWindow.update_command_ui)
3958            (MainWindow.save_modified_session, MainWindow.NewSession)
3959            (MainWindow.OpenSession, MainWindow.SaveSession)
3960            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
3961            application object.
3962    
3963            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
3964            the main window with self.
3965    
3966            * Thuban/UI/context.py: New module with the context class
3967    
3968            * Thuban/UI/command.py (Command): Update doc string.
3969    
3970            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
3971            MainWindow.update_command_ui): Pass an instance of the context
3972            class to the command's methods
3973            (check_current_tool, call_method): Handle the new context
3974            implementation
3975    
3976            * Examples/simple_extensions/simple_tool.py (simple_tool,
3977            check_simple_tool): Handle the new context implementation
3978    
3979            * Examples/simple_extensions/simple_command.py (simple_command):
3980            Handle the new context implementation. Update the comments about
3981            the context.
3982    
3983            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
3984            doc-string
3985            (ThubanApplication.Session): New method to return the session
3986            object
3987    
3988            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
3989            interactor's selected_layer may not be a layer of the current
3990            session when the tree is updated while a new session is being set.
3991    
3992    2002-07-17  Bernhard Herzog  <[email protected]>
3993    
3994            * Thuban/UI/tree.py (color_string): Removed. No longer used.
3995            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
3996            update_tree into update_tree and add_items. The tree now uses a
3997            more generic way to display the contents of the tree.
3998            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
3999    
4000            * Thuban/Model/layer.py (Layer.TreeInfo),
4001            Thuban/Model/extension.py (Extension.TreeInfo),
4002            Thuban/Model/map.py (Map.TreeInfo),
4003            Thuban/Model/session.py (Session.TreeInfo):
4004            Add TreeInfo methods to implement the new tree view update scheme
4005    
4006    2002-07-16  Bernhard Herzog  <[email protected]>
4007    
4008            * Thuban/UI/application.py: Don't use "import from" for the
4009            MainWindow. It can't always be resolved.
4010            (ThubanApplication.OnInit): change reference to MainWindow
4011            accordingly.
4012    
4013            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
4014            completely
4015    
4016    2002-07-10  Bernhard Herzog  <[email protected]>
4017    
4018            * setup.py (create_init_module): New configurable variable whose
4019            default depends on the platform we're running on.
4020            (ThubanInstall.initialize_options): Initialize
4021            self.create_init_module from the global create_init_module
4022            (ThubanInstall.user_options): indictate that the options
4023            create-init-module and init-module-dir have arguments.
4024    
4025            * setup.py: In the setup call change the version number to include
4026            cvs.
4027    
4028            * MANIFEST.in: Add the files in Examples
4029    
4030    2002-07-09  Bernhard Herzog  <[email protected]>
4031    
4032            * setup.py: In the setup call, use the thuban homepage as the
4033            value of the url parameter.
4034    
4035            * Examples: New subdirectory for examples.
4036    
4037            * Examples/simple_extensions/simple_tool.xpm,
4038            Examples/simple_extensions/simple_tool.py,
4039            Examples/simple_extensions/simple_command.py,
4040            Examples/simple_extensions/README: Simple examples showing how to
4041            add new commands and tools.
4042    
4043            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
4044            bdist_rpm that we also have an install script.
4045            (bdist_inno): Add 2002 to the copyright notice.
4046    
4047            * setup.py: Create a file in python's site-packages directory to
4048            make installation of Thuban as a library easier.
4049            (ThubanInstall.user_options): Add two new options,
4050            create-init-module and init-module-dir
4051            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4052            filenames for installation in the default directories.
4053            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4054            the inherited methods to capture some filenames before they're
4055            transformed too much by distutils.
4056            (ThubanInstall.run): Create the init module if requested.
4057            (ThubanInstall.thuban_init_filename): New method to return the
4058            full name of the init module.
4059            (ThubanInstall.get_outputs): Append the filename of the init
4060            module.
4061    
4062    2002-07-08  Bernhard Herzog  <[email protected]>
4063    
4064            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4065            handle the prefix properly which means that the default for the
4066            installation prefix should be /usr for RPMs and /usr/local when
4067            doing a normal source install.
4068            (bdist_rpm_install_script): Script to override the default install
4069            commands in the specfile generated by the bdist_rpm command.
4070            (thuban_bdist_rpm.user_options): Add a prefix option
4071            (thuban_bdist_rpm.initialize_options): Init the prefix option.
4072            Create the script files for the spec files as empty files here
4073            (thuban_bdist_rpm._make_spec_file): Override the inherited method
4074            to fill the script files with content.
4075    
4076            * Thuban/Model/save.py (relative_filename): Wrapper around
4077            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4078            argument. save_session now automatically uses this version,
4079            solving a problem when saving to a relative filename.
4080    
4081            * setup.py: In the setup call, make sure that the library
4082            directories are under $prefix/lib not directly under $prefix.
4083    
4084    2002-06-20  Jan-Oliver Wagner <[email protected]>
4085    
4086            * Thuban/Model/extension.py: new module to handle extension objects.
4087            * Thuban/Model/messages.py: new messages for extensions.
4088            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4089            Session.AddExtension): new for handling extensions.
4090            Also some other minor changes to round up extension handling.
4091            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4092            of Extension titles and title and names of its objects.
4093    
4094    2002-05-29  Bernhard Herzog  <[email protected]>
4095    
4096            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4097            the events for a command.
4098            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4099            Call bind_command_events to bind the events. add_toolbar_command
4100            can now bind events too so that it's possible to have commands
4101            that are only available through the toolbar.
4102            (MainWindow.init_ids): New instance variable events_bound to keep
4103            track of for which commands events have been bound.
4104    
4105    2002-05-28  Bernhard Herzog  <[email protected]>
4106    
4107            * Thuban/UI/menu.py: New module to build and manage menus.
4108    
4109            * Thuban/UI/mainwindow.py: Remove some unused imports.
4110            (MainWindow.__init__, main_menu): move the definition of the main
4111            menu from __init__ to the Menu instance main_menu.
4112            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4113            build the menu bar and sub-menus from a menu description.
4114    
4115            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4116            startup file
4117            (ThubanApplication.read_startup_files): New method to run
4118            ~/.thuban/thubanstart.py
4119    
4120            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4121            Move the toolbar definition to the Menu instance main_toolbar.
4122            (MainWindow.build_toolbar): New method to build the toolbar
4123            similar to the build_menu methods
4124    
4125    2002-05-23  Bernhard Herzog  <[email protected]>
4126    
4127            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4128            layer_outline_color. Fix it in the definition of the command too.
4129    
4130            * Thuban/UI/command.py (Command): Fix typo in doc string
4131    
4132    2002-05-22  Bernhard Herzog  <[email protected]>
4133    
4134            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
4135            in the docstring
4136    
4137    2002-05-15  Bernhard Herzog  <[email protected]>
4138    
4139            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
4140            when the shapefile is empty.
4141            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
4142            now return None for empty shapefiles. Update doc-strings.
4143    
4144            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
4145            the layer's bbox being None.
4146    
4147            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
4148            layer's bbox being None.
4149    
4150            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
4151            necessary.
4152            (MapCanvas.__init__): New instance variables, last_selected_layer
4153            and last_selected_shape to determine how the selection has
4154            changed.
4155    
4156            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
4157            AutoSizeColumns because it will cause a traversal of the entire
4158            table which for large .dbf files will take a very long time.
4159    
4160    2002-05-14  Bernhard Herzog  <[email protected]>
4161    
4162            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
4163            maximum depth for the tree than shapelib does by default.
4164    
4165    2002-05-10  Bernhard Herzog  <[email protected]>
4166    
4167            * setup.py (py_modules): The shptree modules doesn't have a
4168            wrapper, so don't include it in the py_modules
4169    
4170    2002-05-08  Bernhard Herzog  <[email protected]>
4171    
4172            * extensions/shapelib/shptree.c (compare_ints): Make arguments
4173            const void * as in the qsort prototype
4174            (SHPTreeFindLikelyShapes): Remove some unused variables.
4175    
4176            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
4177            maintains to redraw the window during a drag.
4178            (MapCanvas.unprojected_rect_around_point): New method to determine
4179            a small region around a point for hit-testing.
4180            (MapCanvas.find_shape_at): Only test the shapes in a small region
4181            around the point.
4182    
4183            * setup.py: Increment the version to 0.1.2
4184    
4185            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
4186            debug print and set session to None after unsubscribing
4187    
4188    2002-05-07  Bernhard Herzog  <[email protected]>
4189    
4190            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
4191            the file to have a .thuban extension.
4192    
4193            * Thuban/UI/tree.py (session_channels): New class constant with
4194            all the session channels to subscribe to to update the tree
4195            (SessionTreeCtrl.session_changed): Remember the session so that we
4196            can unsubscribe properly. Use the new class constant to
4197            unsubscribe from the old session and subscribe to the new one.
4198            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
4199            subscriptions of the SessionTreeCtrl.
4200            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
4201    
4202            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
4203            Session Tree" command to the file menu.
4204    
4205            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
4206            as update_region to the renderer.
4207    
4208            * Thuban/UI/renderer.py
4209            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
4210            update box is now directly a tuple, not a wxRect anymore.
4211    
4212            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
4213            prints.
4214    
4215    2002-05-07  Bernhard Herzog  <[email protected]>
4216    
4217            * setup.py: Add the shptree extension module. See
4218            extensions/pyshapelib/ChangeLog for more details.
4219    
4220            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
4221            extensions/shapelib/dbfopen.c: Really update to the versions of
4222            shapelib 1.2.9. For some reason it wasn't really done on
4223            2002-04-11.
4224    
4225            * extensions/shapelib/shptree.c: Modified version of shptree.c of
4226            shapelib 1.2.9. The only real difference is the use of qsort
4227            instead of a bubble sort implementation
4228    
4229            * Thuban/Model/layer.py (Layer.__init__): New instance variable
4230            shapetree to hold the shapelib quadtree for the shapefile
4231            (Layer.open_shapefile): Create the quad tree.
4232            (Layer.ShapesInRegion): New method to return the ids of shapes in
4233            a given region using the quad tree.
4234    
4235            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
4236            comment
4237            (draw_polygon_shape): Accept both arcs and polygons.
4238            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
4239            the api.
4240    
4241            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
4242            return the shape ids to be rendered in a given layer.
4243            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
4244            ids. Use draw_polygon_shape to draw arc shapes as well.
4245            (ScreenRenderer.RenderMap): New parameter for the rectangle that
4246            has to be updated
4247            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
4248            calling it's ShapesInRegion method.
4249    
4250            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4251            update_region for the update region.
4252            (MapCanvas.OnPaint): Maintain the update region
4253            (MapCanvas.do_redraw): Pass the bounding box of the update_region
4254            to the renderer when drawing the bitmap. Reset the update_region.
4255    
4256    2002-05-03  Bernhard Herzog  <[email protected]>
4257    
4258            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
4259            MainWindow.OpenSession): Change the file extension of the session
4260            files to .thuban
4261    
4262            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
4263            Move the map channels to be forwarded by the session into the
4264            class constant with forwarded_channels. Also add
4265            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
4266            forwarded_channels
4267    
4268            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
4269            typo and some rewording).
4270    
4271    2002-05-02  Bernhard Herzog  <[email protected]>
4272    
4273            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
4274            around to speed up most redraws:
4275            (MapCanvas.__init__): New instance variable bitmap which holds the
4276            bitmap
4277            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
4278            self.bitmap to draw.
4279            (MapCanvas.full_redraw): New method to force a full redraw
4280            including the bitmap
4281            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
4282            make sure the bitmap is redrawn.
4283            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
4284            MapCanvas.shape_selected): Call full_redraw instead of readraw to
4285            make sure the bitmap is redrawn.
4286            (MapCanvas.OnSize): New method to handle size events so that the
4287            bitmap can be redrawn.
4288    
4289    2002-04-29  Bernhard Herzog  <[email protected]>
4290    
4291            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4292            canvas' VIEW_POSITION event
4293            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
4294            Update the text in the status-bar accordingly.
4295    
4296            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
4297            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
4298            called.
4299            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
4300            current_position
4301            (MapCanvas.set_current_position): New method to set
4302            current_position. Issue a VIEW_POSITION event
4303            (MapCanvas.CurrentPosition): New public method to return the value
4304            of current_position. Should be called when the VIEW_POSITION event
4305            is processed.
4306            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
4307            Update the position.
4308            (MapCanvas.OnLeaveWindow): Set the position to None.
4309    
4310            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4311            position in the statusbar
4312    
4313    2002-04-26  Frank Koormann <[email protected]>
4314    
4315            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4316    
4317    2002-04-24  Frank Koormann <[email protected]>
4318    
4319            * Resources/Bitmaps/identify.xpm: shadow added
4320    
4321            * Resources/Bitmaps/fullextent.xpm: new
4322    
4323    2002-04-22  Jan-Oliver Wagner <[email protected]>
4324    
4325            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4326            box
4327    
4328    2002-04-21  Jan-Oliver Wagner <[email protected]>
4329    
4330            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4331    
4332            * Thuban/UI/tree.py (update_tree): added added map extent
4333    
4334            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4335            icon; added map_full_extend as tool
4336    
4337    2002-04-19  Jan-Oliver Wagner <[email protected]>
4338    
4339            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4340            saving _new_ sessions
4341    
4342            * Thuban/Model/session.py (create_empty_session): new session
4343            don't have a filename (set to None)
4344    
4345            * Thuban/UI/tree.py (update_tree): added filename and modified flag
4346    
4347            * Thuban/Model/load.py (ProcessSession): convert projection
4348            parameters from unicode to regular string
4349    
4350            * Data/iceland_sample.session: Added UTM Zone 26 projection.
4351    
4352    2002-04-11  Bernhard Herzog  <[email protected]>
4353    
4354            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
4355            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
4356            1.2.9
4357    
4358            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
4359            the pyshapelib directoy into the list of include dirs, so that
4360            pyshapelib_api.h can be found.
4361    
4362            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
4363            holds the pyshapelib C-API
4364            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
4365            pyshapelib_api to access the shapelib functions.
4366            (initwxproj): Import the c_api from the shapelib module and
4367            initialize pyshapelib_api.
4368    
4369    2002-04-04  Bernhard Herzog  <[email protected]>
4370    
4371            * setup.py (thuban_bdist_rpm.initialize_options): Use
4372            initialize_options to create the scripts for the rpm.
4373    
4374            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
4375    
4376    2002-04-03  Bernhard Herzog  <[email protected]>
4377    
4378            * setup.py: Increment version to 0.1.1
4379    
4380            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
4381            Layer" and "Remove Layer" commands from the layer menu to the map
4382            menu
4383    
4384    2002-02-15  Bernhard Herzog  <[email protected]>
4385    
4386            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
4387            argument (python <= 1.5.2 erroneously accepted multiuple
4388            arguments)
4389    
4390    2002-02-04  Bernhard Herzog  <[email protected]>
4391    
4392            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
4393            RecordGrid in the identifyview.
4394            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
4395            IdentifyListCtrl. The grid allows editing of the values.
4396    
4397            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
4398            implementing a grid for a single row of a thuban table.
4399    
4400            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
4401            layers by default. Easier to use than the previous default of only
4402            searching through the select layer which meant that if no layer
4403            was selected, you couldn't select a shape.
4404    
4405            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
4406    
4407            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
4408            stroke_width attribute
4409    
4410            * Thuban/Model/save.py (save_session): Write the new stroke_width
4411            attribute
4412    
4413            * Thuban/Model/load.py (ProcessSession.startElement): Read the
4414            stroke_width attribute
4415    
4416            * Thuban/Model/layer.py (Layer.__init__): New parameter and
4417            instance variable stroke_width
4418            (Layer.SetStrokeWidth): Set the stroke_width.
4419    
4420    2002-02-01  Bernhard Herzog  <[email protected]>
4421    
4422            * extensions/thuban/wxproj.cpp (project_points): Fix two
4423            off-by-one errors in the last loop that joins the various parts
4424            together.
4425    
4426    2002-01-14  Bernhard Herzog  <[email protected]>
4427    
4428            * setup.py (data_dist.make_distribution): Fix some typos
4429    
4430    2001-09-18  Bernhard Herzog  <[email protected]>
4431    
4432            * README: Slight tweaking in preparation for the 0.1 release
4433    
4434            * setup.cfg: Add section for sdist to create both tgz and zip
4435            archives
4436    
4437            * setup.py: increase version number to 0.1
4438            (data_dist): New command class for data distribution
4439    
4440    2001-09-14  Bernhard Herzog  <[email protected]>
4441    
4442            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4443            Handle the case of no layer (i.e. layer is None) properly.
4444    
4445            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4446            Set the initial selection of the combo boxes to reflect the
4447            projection we're starting with in a way that works on windows,
4448            too.
4449    
4450            * Thuban/Lib/connector.py (Connector.print_connections): Print the
4451            puiblisher's ids in hex to make it easier to compare them to the
4452            standard repr of python methods
4453    
4454            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
4455            messages
4456    
4457    2001-09-13  Bernhard Herzog  <[email protected]>
4458    
4459            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
4460            deselect the layer if no layer is selected
4461    
4462            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
4463            idle time when there actually is something to draw. If there's
4464            nothing to draw simply clear the window
4465            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
4466            (MapCanvas.SetMap): force a redraw in all cases because
4467            FitMapToWindow doesn't always do it.
4468            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
4469            specify the point to move into the center of the window
4470            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
4471            dragged, zoon in/out by a factor of 2
4472            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
4473            index, i.e. reversed drawing order) so that objects appearing to
4474            be in from of others are selected first. This is probably mostly
4475            relevant for point shapes where the symbols used may overlap
4476    
4477            * Thuban/Model/session.py (create_empty_session): Unset the
4478            modified bit before returning it
4479    
4480            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
4481            create_empty_session session to create the new, empty session.
4482    
4483            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
4484            the tool bitmaps.
4485            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
4486            the code that asks whether the session should be saved into the
4487            new method save_modified_session.
4488            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
4489            method to save modified session here too.
4490    
4491    2001-09-11  Bernhard Herzog  <[email protected]>
4492    
4493            * setup.py (InnoIconItem): fix typo
4494    
4495            (thuban_bdist_inno.run):
4496            (bdist_inno.run): Move the decision not to create symlinks on
4497            non-nt platforms to thuban_bdist_inno and do it unconditinally
4498            since we never want to create the symlinks here
4499    
4500    2001-09-10  Bernhard Herzog  <[email protected]>
4501    
4502            * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
4503            identify view immediately
4504    
4505            * Thuban/UI/controls.py: New file with two classes RecordListCtrl
4506            and SelectableRecordListCtrl that implement the code shared by the
4507            identify view and the label dialog
4508    
4509            * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
4510            new class RecordListCtrl
4511    
4512            * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
4513            return value of GetValue is None instead of using it as a boolean
4514            directly so that Zero numbers are handled properly.
4515            (LabelListCtrl): Derive from the new class
4516            SelectableRecordListCtrl
4517    
4518            * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
4519            (Proj4Dialog.dialogLayout): Make the window resizable and set the
4520            size of the text control explicitly to make the sizers work on
4521            both Windows and X.
4522    
4523  2001-09-07  Bernhard Herzog  <[email protected]>  2001-09-07  Bernhard Herzog  <[email protected]>
4524    
4525          * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter          * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
# Line 30  Line 4552 
4552          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
4553          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
4554    
4555          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4556          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
4557          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
4558          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
4559          the application's OnInit method          the application's OnInit method
# Line 47  Line 4569 
4569          layer to the tableview dialog.          layer to the tableview dialog.
4570    
4571          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
4572          (TableGrid):          (TableGrid):
4573          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
4574          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
4575          (TableFrame.__init__):          (TableFrame.__init__):
# Line 114  Line 4636 
4636  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
4637    
4638          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4639            
4640          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4641          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
4642            
4643          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
4644          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
4645          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 164  Line 4686 
4686          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
4687          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
4688          link_file method          link_file method
4689            
4690          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
4691          the window when the first layer is added to the map.          the window when the first layer is added to the map.
4692    
# Line 201  Line 4723 
4723          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
4724          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
4725          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
4726            
4727          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
4728          installer          installer
4729    

Legend:
Removed from v.46  
changed lines
  Added in v.1366

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26