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

Legend:
Removed from v.893  
changed lines
  Added in v.1210

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26