/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 793 by jonathan, Wed Apr 30 17:00:36 2003 UTC revision 1195 by bh, Fri Jun 13 13:02:39 2003 UTC
# Line 1  Line 1 
1    2003-06-13  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4            self.selected_shape with the current selection to make sure the
5            contents of the dialog are up to date when it's shown for the
6            first time.
7            The dialog used to work without this by luck. The recent fix to
8            the connector module 'broke' a 'feature' the identify view was
9            relying on, i.e that subscribing to a message in response to
10            receiving a message of that type would mean that the new
11            subscriber would also be called for the same message.
12            
13    2003-06-12  Jonathan Coles   <[email protected]>
14    
15            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
16            the image is rendered. Fixes RTbug #1937.
17    
18    2003-06-12  Jonathan Coles   <[email protected]>
19    
20            * Thuban/Lib/fileutil.py: As is done under Windows, create the
21            user directory if it doesn't exist on a posix system.
22            Fixes RTbug #1815.
23    
24            * Thuban/Model/resource.py (get_user_proj_files): Moved the
25            called to get_application_dir here, so that the directory
26            will only be called if this method is invoked.
27    
28            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
29            the projfilepath if no projection is selected.
30    
31    2003-06-12  Jonathan Coles   <[email protected]>
32    
33            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
34            the scalebar if the current map has no projection set.
35    
36            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
37            projfilepath label to just the basename of the projection file
38            rather than include the entire path.
39    
40            * Thuban/Model/resource.py: Fix missed proj functions that
41            needed to be renamed.
42    
43    2003-06-12  Jonathan Coles   <[email protected]>
44    
45            * Thuban/Model/classification.py: Removed assert statements that
46            tested if the variable was an instance of Color.
47    
48            * Thuban/Model/color.py (Color): Remove commented code that isn't
49            used.
50            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
51            Fixes RTbug #1835.
52            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
53            Needed now that the class doesn't inherit from Color.
54    
55    2003-06-12  Jonathan Coles   <[email protected]>
56    
57            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
58            check unicode strings.
59    
60            * test/test_layer.py: Check for existence of gdal.
61    
62    2003-06-12  Jonathan Coles   <[email protected]>
63        
64            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
65            that was in load.py
66    
67            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
68            that was in save.py
69    
70    2003-06-12  Jonathan Coles   <[email protected]>
71    
72            This is largely a collection of bug fixes. We also handle the
73            case where gdal is not on the system. The XMLReader and XMLWriter
74            classes were moved into there own files to resolve some circular
75            import references and because they shouldn't really be in the
76            file that is dediciated to reading/writing session files since
77            they are also used elsewhere.
78    
79            * Thuban/Model/classgen.py: Renamed functions to follow the
80            function_names_with_underscores style. Fixes RTbug #1903.
81            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
82    
83            * Thuban/Model/layer.py: Import gdal only if it available.
84            (RasterLayer): Handle the case where the gdal library is unavailable.
85            Addresses RTbug #1877.
86    
87            * Thuban/Model/load.py (XMLReader): Moved into seperate file
88            xmlreader.py.
89    
90    2003-06-12  Jonathan Coles   <[email protected]>
91    
92            This is largely a collection of bug fixes. We also handle the
93            case where gdal is not on the system. The XMLReader and XMLWriter
94            classes were moved into there own files to resolve some circular
95            import references and because they shouldn't really be in the
96            file that is dediciated to reading/writing session files since
97            they are also used elsewhere.
98    
99            * Thuban/Model/classgen.py: Renamed functions to follow the
100            function_names_with_underscores style. Fixes RTbug #1903.
101            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
102    
103            * Thuban/Model/layer.py: Import gdal only if it available.
104            (RasterLayer): Handle the case where the gdal library is unavailable.
105            Addresses RTbug #1877.
106    
107            * Thuban/Model/load.py (XMLReader): Moved into seperate file
108            xmlreader.py.
109    
110            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
111            file xmlwriter.py.
112    
113            * Thuban/Model/resource.py: Renamed functions to following the
114            function_names_with_underscores style.
115            (has_gdal_support): New function that returns true if the gdal
116            library is available. Addresses RTbug #1877.
117    
118            * Thuban/UI/application.py (ThubanApplication.OpenSession):
119            Display a message box if the gdal library is not available, but
120            only if there are any layers that would use it. Addresses RTbug #1877.
121    
122            * Thuban/UI/classgen.py: Use renamed projection resource functions.
123            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
124            when using integers versus floats.
125    
126            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
127            determine if the "Add Image Layer" menu option should be
128            greyed out or not. Addresses RTbug #1877.
129    
130            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
131    
132            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
133            optimize if a raster layer is visible. Fixes RTbug #1931.
134            Only draw the raster layer if the gdal library is available.
135            Addresses RTbug #1877.
136    
137            * test/test_classgen.py: Add tests for generate_singletons,
138            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
139            (test_calculate_quantiles): Fix some tests to catch the new
140            ValueError that is raised.
141    
142            * test/test_proj.py: Use renamed projection resource functions.
143    
144            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
145            test for saving classified layers. Fixes RTbug #1902.
146            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
147    
148    2003-06-12  Jan-Oliver Wagner <[email protected]>
149    
150            Fix for http://intevation.de/rt/webrt?serial_num=1900.
151    
152            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
153    
154            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
155            multiplechoicedialog.py rather than from the wxPython library.
156    
157    2003-06-11  Frank Koormann  <[email protected]>
158    
159            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
160            update.
161    
162    2003-06-11  Frank Koormann  <[email protected]>
163    
164            * Thuban/Lib/fileutil.py (get_application_dir): New function to
165            determine the absolute .thuban/thuban directory under
166            "posix" (os.expanduser) and "nt" (read AppData registry key).
167    
168            * Thuban/Model/resource.py: Use get_application_dir
169    
170            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
171            Use get_application_dir.
172    
173    2003-06-10  Bernhard Herzog  <[email protected]>
174    
175            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
176            the messages MAP_LAYERS_REMOVED messages
177            (LayerTableFrame.OnClose): Unsubscribe from it.
178            (LayerTableFrame.map_layers_removed): New. Receiver for
179            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
180            dialog is showing is removed.
181    
182    2003-06-10  Bernhard Herzog  <[email protected]>
183    
184            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
185            of the receivers list so that unsubscribing in a receiver doesn't
186            modify it while iterating over it.
187    
188            * test/test_connector.py
189            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
190            unsubscribing in a receiver works correctly. See docstring for
191            details
192    
193    2003-06-10  Bernhard Herzog  <[email protected]>
194    
195            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
196            message.
197    
198            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
199            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
200            LAYER_CHANGED will still be sent if the classification changes.
201    
202            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
203            parameter so we can subscribe to some of its messages
204            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
205            and the layer's LAYER_SHAPESTORE_REPLACED
206            (Classifier.unsubscribe_messages): New. Unsubscribe from message
207            subscribed to in __init__
208            (Classifier.map_layers_removed)
209            (Classifier.layer_shapestore_replaced): receivers for the messages
210            subscribed to in __init__. Unsubscribe and close the dialog
211    
212            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
213            the map to the Classifier dialog
214    
215            * test/test_layer.py (SetShapeStoreTests): Derive from
216            SubscriberMixin as well so we can test messages
217            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
218            messages
219            (SetShapeStoreTests.tearDown): Clear the messages again
220            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
221            for the modified flag too
222            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
223            to check whether SetShapeStore sets the modified flag
224            (SetShapeStoreTests.test_set_shape_store_different_field_name)
225            (SetShapeStoreTests.test_set_shape_store_same_field)
226            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
227            Add tests for the messages. This checks both the new
228            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
229    
230    2003-06-06  Jan-Oliver Wagner <[email protected]>
231    
232            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
233            the menu items.
234    
235    2003-06-05  Frank Koormann  <[email protected]>
236    
237            * Thuban/UI/identifyview.py (IdentifyView.__init__):
238            Layout reimplemented without panel. Make life easier to fit the list
239            in the dialog.
240    
241    2003-06-05  Frank Koormann  <[email protected]>
242    
243            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
244            once on initialisation (Former implementation resulted in multiple
245            entries for each projection).
246            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
247            if set, select the projection found under the specified name. This
248            overwrites any other selection estimate.
249            Removed projchoice filling from this method.
250            (ProjFrame._OnSave, ProjFrame._OnAddToList):
251            Updated call of ProjFrame.__FillAvailList
252            (LCCPanel._DoLayout): Moved parameter controls in more common order.
253    
254            * Resources/Projections/defaults.proj: Extended defaults representing
255            various common European projections.
256    
257    2003-06-05  Frank Koormann  <[email protected]>
258    
259            * Thuban/UI/identifyview.py (IdentifyView.__init__):
260            Use ListCtrl instead of GridCtrl
261    
262            * Thuban/Model/resource.py:
263            Guess location of .thuban directory from tempdir parent directory.
264    
265            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
266            Guess location of .thuban directory from tempdir parent directory.
267    
268    2003-06-04  Bernhard Herzog  <[email protected]>
269    
270            Do not cache the values returned by the tree widget's
271            GetFirstChild and GetNextChild methods because it led to lots of
272            segfaults. The new way requires more brute force but is more
273            reliable.
274    
275            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
276            variable layer2id
277            (LegendTree.find_layer): New method to do with brute force what
278            layer2id tried to accomplish
279            (LegendTree._OnMsgLayerChanged)
280            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
281            Use find_layer instead of layer2id
282            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
283            update layer2id anymore
284            (LegendTree._OnMsgMapLayersRemoved)
285            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
286    
287    2003-06-03  Thomas Koester  <[email protected]>
288    
289            * Thuban/Model/classgen.py (GenQuantiles0): New function.
290    
291    2003-06-02  Bernhard Herzog  <[email protected]>
292    
293            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
294            New commands.
295            (main_menu): Add the new commands.
296            (MainWindow.TableRename): New. Implementation of the table_rename
297            command.
298            (MainWindow.RenameLayer): New. Implementation of the layer_rename
299            command.
300    
301            * Thuban/Model/session.py (Session.AddTable): call self.changed to
302            set the modified flag
303    
304            * test/test_session.py (TestSessionSimple.test_add_table): Test
305            whether the modified flag is set properly
306    
307            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
308            instead of issue so that the modified flags get updated.
309    
310            * test/test_base.py (SomeTitledObject): Derive from Modifiable
311            instead of Publisher to reflect reality better and to accomodate
312            the fact that SetTitle now calls changed instead of issue
313    
314    2003-06-02  Bernhard Herzog  <[email protected]>
315    
316            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
317            acquisition has to happen before the try in a try-finally.
318    
319    2003-06-02  Bernhard Herzog  <[email protected]>
320    
321            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
322            possible that a layer is removed that is not currently selected in
323            the legend so don't check for this.
324    
325    2003-05-30  Bernhard Herzog  <[email protected]>
326    
327            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
328            variables to None that have direct or indirect references to
329            shapefiles or dbf files to make sure that they do go away and the
330            files are closed.
331    
332    2003-05-30  Bernhard Herzog  <[email protected]>
333    
334            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
335            availImgListIndices when a new image list is created
336            
337    2003-05-30  Bernhard Herzog  <[email protected]>
338    
339            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
340            changing_selection to indicate whether the LegendTree code itself
341            is currently changing the selection
342            (LegendTree.normalize_selection): New method to normalize the
343            selection by selecting the layer item even if the user clicked on
344            the classification.
345            (LegendTree._OnSelChanged): normalize the selection. This works
346            around a bug in wx which doesn't keep track of the selection
347            properly when subtrees are deleted.
348    
349    2003-05-30  Bernhard Herzog  <[email protected]>
350    
351            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
352            maximum and minimum scale factors.
353    
354            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
355            changes in classgen.py
356    
357    2003-05-30  Jonathan Coles   <[email protected]>
358    
359            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
360            all the methods functions. Fixes RTBug #1903.
361    
362            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
363            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
364            RTBug #1907.
365    
366            * Thuban/UI/classgen.py: Use classgen functions that were part
367            of the ClassGenerator class. Put try/finally blocks around
368            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
369            RTBug #1904.
370    
371            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
372    
373            * Thuban/UI/legend.py: The legend was cleared and repopulated any
374            time something changed which caused some state to be lost such
375            as which children were expanded or collapsed. Fixes RTBug #1901.
376            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
377            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
378            the legend but not in the map.
379            (LegendTree.__FillTree): Move main functionality out into smaller
380            methods that can be used by other methods.
381            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
382            if they are available.
383            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
384            that we override the wxTreeCtrl method. Iterate over children
385            and call __RemoveLayer.
386            (LegendTree.__AddLayer): New. Add a new layer to the legend.
387            (LegendTree.__RemoveLayer): Remove a layer from the legend.
388            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
389            Should only be called with the id of a layer branch.
390            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
391            Returns the root item or creates one if necessary.
392    
393            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
394            ProjectRasterFile with tuple arguments instead of strings.
395    
396            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
397            with try/finally. Fixes RTBug #1904.
398    
399            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
400            with try/finally. Fixes RTBug #1904.
401            (MapCanvas.FitSelectedToWindow): If a single point is selected
402            simply center it on the display. Fixes RTBug #1849.
403    
404            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
405            to be compiled as a standalone app. Now the code can only be
406            called from Python which simplifies the parameter passing.
407            (ProjectRasterFile): Handle Python arguments. Remove code that
408            checks for a destination dataset. Add more clean up code.
409    
410            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
411            TestMapWithContents.test_lower_layer_bottom):
412            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
413            Fixes RTBug #1907.
414    
415            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
416            extent to the map when the legend is toggled. Fixes RTBug #1881.
417    
418    2003-05-29  Jan-Oliver Wagner <[email protected]>
419    
420            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
421            unsubscribes all that is subcribed in __init__.
422    
423    2003-05-28  Bernhard Herzog  <[email protected]>
424    
425            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
426            (MainWindow.CanDuplicateLayer): New methods to implement the
427            Layer/Duplicate command.
428            (layer_duplicate command): New.
429            (main_menu): Add layer_duplicate to the Layer menu.
430    
431    2003-05-28  Bernhard Herzog  <[email protected]>
432    
433            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
434            renderer so that NULL/None values get displayed differently (by a
435            gray rectangle).
436            (TableGrid.__init__): Override the default renderers
437    
438    2003-05-28  Bernhard Herzog  <[email protected]>
439    
440            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
441            classification to "None" if the type of the field has changed.
442    
443            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
444            test for the Layer.SetShapeStore method
445    
446    2003-05-28  Jan-Oliver Wagner <[email protected]>
447    
448            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
449            does not necessarily have a filename).
450    
451    2003-05-28  Jan-Oliver Wagner <[email protected]>
452    
453            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
454            sort the selection list for the dialog.
455    
456    2003-05-28  Frank Koormann  <[email protected]>
457    
458            * extensions/thuban/wxproj.cpp
459            (project_point): Removed cast to int for projected point coordinates.
460            (shape_centroid): Return last point if all polygon vertices fall
461            to one point.
462    
463    2003-05-28  Bernhard Herzog  <[email protected]>
464    
465            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
466            with layers that don't have shapestores, i.e. raster layers.
467    
468    2003-05-28  Bernhard Herzog  <[email protected]>
469    
470            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
471            when determining the title from the filename.
472    
473            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
474            reflect changes in the way the title is derived from the filename
475    
476    2003-05-28  Frank Koormann  <[email protected]>
477    
478            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
479            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
480    
481    2003-05-27  Bernhard Herzog  <[email protected]>
482    
483            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
484            delegate SelectedLayer.
485            (MainWindow.LayerUnjoinTable): Implement.
486            (_can_unjoin): New. Helper function for the sensitivity of the
487            layer/unjoin command.
488    
489            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
490            (DerivedShapeStore.OrigShapeStore): New. Return the original
491            shapestore. Used to figure out how to unjoin.
492            (DerivedShapeStore.Shapefile): Fix a typo.
493    
494    2003-05-27  Bernhard Herzog  <[email protected]>
495    
496            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
497            well
498            (JoinDialog.__init__): Use the layer parameter and only build the
499            left choice when a layer is given
500            (JoinDialog.OnJoin): Handle layer joins as well
501            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
502            that the user selects the "Select..." item. The sensitivitly
503            updating is now in update_sensitivity
504            (JoinDialog.y): New method to refactor the sensitivity update of
505            the join button into its own method.
506    
507            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
508    
509    2003-05-27  Bernhard Herzog  <[email protected]>
510    
511            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
512            iff there are unreferenced tables in the session
513    
514    2003-05-27  Bernhard Herzog  <[email protected]>
515    
516            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
517    
518            * Thuban/Model/session.py (Session.UnreferencedTables): New method
519            to return tables that are not referenced by other tables or shape
520            stores and can be removed.
521            (Session.RemoveTable): Issue a TABLE_REMOVED message after
522            removing the table
523    
524            * Thuban/UI/mainwindow.py: Remove unused imports
525            (MainWindow.TableClose): Implement.
526    
527            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
528            messages so that the frame will be automatically closed when a new
529            session is opened or the table is removed.
530            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
531            __init__
532            (TableFrame.close_on_session_replaced)
533            (TableFrame.close_on_table_removed): New. Subscribers that close
534            the window
535    
536            * test/test_session.py (TestSessionMessages.test_remove_table)
537            (TestSessionSimple.test_remove_table): Move the test to
538            TestSessionSimple and add test for the TABLE_REMOVED message
539            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
540            (TestSessionSimple.test_unreferenced_tables) New. Test for the
541            UnreferencedTables method.
542            (UnreferencedTablesTests): New. Class with some more sophisticated
543            tests for UnreferencedTables.
544    
545    2003-05-27  Frank Koormann  <[email protected]>
546    
547            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
548            display has some unwanted side effects. Removed again.
549    
550    2003-05-27  Frank Koormann  <[email protected]>
551    
552            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
553    
554            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
555    
556    2003-05-27  Jan-Oliver Wagner <[email protected]>
557    
558            * test/test_menu.py (MenuTest.test): Added test for
559            Menu.RemoveItem().
560    
561            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
562            the menu.
563    
564    2003-05-27  Frank Koormann  <[email protected]>
565            
566            Nonmodal dialogs without parent (i.e. they can fall behind the main
567            window)
568    
569            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
570            all dialogs in the dialogs dictionary and the canvas.
571    
572            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
573            parent, i.e. can fall behind other windows.
574            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
575            dictionary before removing it.
576    
577            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
578    
579            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
580            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
581            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
582    
583    2003-05-27  Bernhard Herzog  <[email protected]>
584    
585            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
586            tableview dialog
587            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
588            Also, don't use the table's titles as the dialog names. The titles
589            aren't guaranteed to be unique.
590            (MainWindow.TableOpen): Open a table view dialog after opening the
591            table
592    
593    2003-05-27  Bernhard Herzog  <[email protected]>
594    
595            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
596            effect can be achieved by simply closing the window showing the
597            table.
598            (MainWindow.TableHide): Removed.
599            (main_menu): Removed "table_hide"
600    
601    2003-05-27  Frank Koormann  <[email protected]>
602    
603            Fix legend tree display problems under Win32
604    
605            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
606            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
607            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
608    
609            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
610    
611    2003-05-27  Jan-Oliver Wagner <[email protected]>
612    
613            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
614            'after' now allows to insert separators almost anywhere in the menu.
615    
616    2003-05-27  Frank Koormann  <[email protected]>
617    
618            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
619            "S" of selection box label to hint on hot key (Alt-S). Works under
620            Win32 but is ignored under GTK.
621    
622    2003-05-26  Frank Koormann  <[email protected]>
623    
624            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
625            Center Choices.
626    
627    2003-05-26  Bernhard Herzog  <[email protected]>
628    
629            Remove the Precision methods again. They're too DBF specific to be
630            part of the table interface and they're only used in table_to_dbf
631            anyway.
632            
633            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
634            fixed precision of 12 for doubles.
635            (TransientTableBase.Precision): Removed
636            (AutoTransientTable.Width): Delegate to self.table.
637    
638            * Thuban/Model/table.py (DBFTable.Precision)
639            (MemoryTable.Precision): Removed.
640            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
641            (table_to_dbf): Use a fixed precision of 12 for floats unless the
642            column object specifies something else.
643    
644            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
645            test for table_to_dbf
646    
647    2003-05-26  Bernhard Herzog  <[email protected]>
648    
649            * test/test_transientdb.py
650            (TestTransientTable.run_iceland_political_tests): Fix a comment.
651    
652    2003-05-26  Bernhard Herzog  <[email protected]>
653    
654            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
655            implementation. Mark parts of the file format strings for
656            localization.
657    
658            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
659            file and add the table to the tables managed by the session
660    
661            * test/test_session.py (TestSessionSimple.test_open_table_file):
662            New. test case for OpenTableFile
663    
664    2003-05-26  Jan-Oliver Wagner <[email protected]>
665    
666            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
667            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
668            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
669            Replace the true/false of wxWindows by True/False of Python 2.2.1.
670    
671    2003-05-26  Jan-Oliver Wagner <[email protected]>
672    
673            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
674            already a selection present, update the grid accordingly.
675    
676            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
677            resizeable and increase its initial size.
678    
679    2003-05-26  Frank Koormann  <[email protected]>
680    
681            Table export functionality
682    
683            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
684            Return width (in characters) for a column.
685            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
686            (table_to_dbf): Write table to dbf file.
687            (table_to_csv): Write table to csv file.
688    
689            * Thuban/Model/transientdb.py (TransientTableBase.Width,
690            TransientTableBase.Precision): Return column width and precision.
691    
692            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
693            or table_to_csv depending on file selection.
694    
695            * test/test_dbf_table.py:
696            Test table_to_dbf (extension of former part of test).
697    
698            * test/test_csv_table.py:
699            Test table_to_csv.
700    
701    2003-05-23  Jan-Oliver Wagner <[email protected]>
702    
703            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
704            Use QueryTableFrame instead of TableFrame.
705    
706            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
707            table window with 'Layer Table:' instead of 'Table:'.
708    
709    2003-05-23  Jan-Oliver Wagner <[email protected]>
710    
711            Give all tables a title via mix-in TitledObject.LayerShowTable
712    
713            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
714            only if it exists.
715    
716            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
717            and call its init-method with a default title. Remove Title() method.
718    
719            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
720            AutoTransientTable): mix-in TitledObject and call its init-method with
721            a default title. Remove Title() method.
722    
723    2003-05-23  Bernhard Herzog  <[email protected]>
724    
725            * Thuban/Model/session.py (Session.AddShapeStore): Define
726            AddShapeStore analogously to AddTable.
727    
728            * test/test_session.py (TestSessionSimple.test_add_shapestore):
729            New. Test for AddShapeStore
730    
731    2003-05-23  Jan-Oliver Wagner <[email protected]>
732    
733            Introducing QueryTableFrame and a very coarse ShowTable implementation.
734    
735            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
736            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
737            The latter implements the selection GUI without dependency on a layer.
738            LayerTableFrame now is derived from QueryTableFrame and connects
739            to a layer.
740    
741            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
742            implementation that still needs work.
743    
744            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
745    
746    2003-05-22  Frank Koormann  <[email protected]>
747    
748            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
749            Added "outer_join = False" as optional parameter.
750            (TransientJoinedTable.create): If outer join is true, perform a
751            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
752            the left table. Records not matching are filled with 0 / None.
753    
754            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
755            (JoinDialog.OnJoin): Consider outer join check box.
756    
757    2003-05-22  Bernhard Herzog  <[email protected]>
758    
759            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
760            somewhat safer way. Storing the traceback in a local variable can
761            lead to memory leaks
762    
763    2003-05-22  Bernhard Herzog  <[email protected]>
764    
765            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
766            the wxMessageDialog's Destroy() method.
767    
768    2003-05-22  Frank Koormann  <[email protected]>
769    
770            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
771            TransientTable.Title()
772    
773    2003-05-22  Frank Koormann  <[email protected]>
774    
775            Join Dialog, initial version.
776    
777            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
778    
779            * Thuban/UI/join.py (JoinDialog): Functional implementation of
780            former framework. Renamed Table1/Table2 to LeftTable/RightTable
781            in all occurences.
782    
783            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
784            Typo fixed.
785    
786    2003-05-22  Bernhard Herzog  <[email protected]>
787    
788            Give the tables titles so that the GUI can display more meaningful
789            names. For now the titles are fixed but depend on e.g. filenames
790            or the titles of the joined tables.
791    
792            * Thuban/Model/transientdb.py (TransientTable.Title)
793            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
794    
795            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
796    
797            * test/test_transientdb.py
798            (TestTransientTable.test_auto_transient_table_title): New. Test
799            for the Title method
800            (TestTransientTable.test_transient_joined_table)
801            (TestTransientTable.test_transient_table): Add test for the Title
802            methods
803    
804            * test/test_memory_table.py (TestMemoryTable.test_title): New.
805            Test for the Title method
806    
807            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
808            the Title method
809    
810    2003-05-22  Bernhard Herzog  <[email protected]>
811    
812            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
813            Provide a better way to destroy the layers
814            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
815            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
816            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
817            the new way to destroy the layers.
818            (TestLayer.test_derived_store): New. Test for using a layer with a
819            DerivedShapeStore
820    
821            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
822            filename if the shape store actually has one.
823    
824    2003-05-22  Bernhard Herzog  <[email protected]>
825    
826            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
827            for the filename
828    
829            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
830            for the FileName method
831            (TestDBFTableWriting.test_write): Fix spelling of filename
832    
833    2003-05-22  Thomas Koester  <[email protected]>
834    
835            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
836            from SciParam that now really is immutable.
837    
838    2003-05-22  Frank Koormann  <[email protected]>
839    
840            Layer Top/Bottom placement added to legend.
841    
842            * Thuban/UI/legend.py
843            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
844            bound to tool events.
845            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
846            New, methods binding the event methods with the map methods.
847    
848            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
849            layer at top/bottom of layer stack.
850    
851            * Resources/Bitmaps/top_layer.xpm: New button icon.
852    
853            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
854    
855    2003-05-22  Bernhard Herzog  <[email protected]>
856    
857            * Thuban/Model/session.py (Session.RemoveTable): New method to
858            remove tables
859    
860            * test/test_session.py (TestSessionSimple.test_remove_table): New.
861            Test for RemoveTable
862    
863    2003-05-22  Thomas Koester  <[email protected]>
864    
865            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
866            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
867    
868    2003-05-22  Bernhard Herzog  <[email protected]>
869    
870            Implement a way to discover dependencies between tables and
871            shapestores.
872    
873            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
874            (TransientJoinedTable.Dependencies)
875            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
876            interface
877            (TransientJoinedTable.__init__): Keep tack of the original table
878            objects in addition to the corresponding transient tables.
879    
880            * Thuban/Model/table.py (DBFTable.Dependencies)
881            (MemoryTable.Dependencies): New. Implement the dependencies
882            interface
883    
884            * Thuban/Model/data.py (ShapeTable): New. Helper class for
885            ShapefileStore
886            (ShapefileStore.__init__): Use ShapeTable instead of
887            AutoTransientTable
888            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
889            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
890            methods for filename and type
891            (ShapefileStore.Dependencies): New. Implement the dependencies
892            interface
893            (DerivedShapeStore): New class to replace SimpleStore. The main
894            difference to SimpleStore is that it depends not on a shapefile
895            but another shapestore which expresses the dependencies a bit
896            better
897            (SimpleStore.__init__): Add deprecation warning.
898    
899            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
900            Test for the Dependencies method.
901    
902            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
903            New. Test for the Dependencies method.
904    
905            * test/test_transientdb.py
906            (TestTransientTable.test_auto_transient_table_dependencies): New.
907            Test for the Dependencies method.
908            (TestTransientTable.test_transient_joined_table): Add test for the
909            Dependencies method.
910    
911            * test/test_session.py (TestSessionSimple.setUp)
912            (TestSessionSimple.tearDown): New. Implement a better way to
913            destroy the sessions.
914            (TestSessionSimple.test_initial_state)
915            (TestSessionSimple.test_add_table): Bind session to self.session
916            so that it's destroyed by tearDown
917            (TestSessionSimple.test_open_shapefile): New. Test for
918            OpenShapefile and the object it returns
919    
920    2003-05-22  Bernhard Herzog  <[email protected]>
921    
922            * Thuban/Model/session.py (Session.AddTable): New method to
923            register tables with the session.
924            (Session.Tables): Return the tables registered with AddTable too.
925    
926            * test/test_session.py (TestSessionSimple.test_add_table): New.
927            Test case for the AddTable method
928    
929    2003-05-22  Frank Koormann  <[email protected]>
930    
931            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
932            lower right corner, center labels for selections, initialize controls
933            in reasonable order for keyboard navigation.
934    
935            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
936            (ProjFrame.__DoOnProjAvail): Determine position of current projection
937            using the wxListBox.FindString() method. Still a problem (#1886)
938    
939            * Thuban/UI/classifier.py
940            (Classifier.__init__, SelectPropertiesDialog.__init__)
941    
942            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
943            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
944            different classification types from here to __init__.
945            (GenUniquePanel.__init__): Set the column width of the first field
946            in the Field ListCtrl to the full width.
947    
948            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
949            Button to 'Export'. Center Buttons in Selection Box, set Focus to
950            Grid.
951            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
952            changes focus to the Selection when pressing "Alt-S".
953    
954            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
955            the text if not visible. The italic font sometimes exceeds the
956            rendering area.
957    
958    2003-05-21  Jonathan Coles   <[email protected]>
959    
960            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
961            to OnClose so that Thuban closes correctly.
962    
963            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
964            DockFrame.OnClose, not DockFrame._OnClose.
965    
966    2003-05-21  Jonathan Coles   <[email protected]>
967    
968            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
969            references to 'inf' and use new Range __init__ to pass floats
970            directly rather than converting them to strings first.
971            Fixes RTBug #1876.
972    
973            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
974            Use new Range ___init__ to pass floats.
975    
976            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
977            filename is a valid image file. Throw IOError otherwise.
978    
979            * Thuban/Model/range.py: Brought over new Range from SciParam that
980            is immutable and has an __init__ which can accept floats.
981    
982            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
983            into try block. AddLayer doesn't throw any exceptions anymore.
984            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
985            try block.
986    
987            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
988            the first item in choices. Fixes RTBug #1882.
989    
990            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
991            has gone to 0 which is a serious problem. abort.
992            (MapRenderer.draw_raster_layer): Catch IOError seperately and
993            print the error from GDAL.
994    
995            * Thuban/UI/tableview.py (TableGrid.__init__): Call
996            ToggleEventListeners to turn on listening.
997            (TableGrid.ToggleEventListeners): New. Turns event listening on
998            and off so as to prevent excessive messages.
999            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1000            to suppress excessive messages when selecting many rows.
1001            Fixes RTBug #1880.
1002    
1003            * Thuban/UI/view.py: Added checks against if scale == 0. This
1004            is a serious problem that can occur when an image without
1005            geo data is loading and causes the map projection bounds to
1006            go to infinity. Right now, the solution is to simply try
1007            to recover.
1008    
1009            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1010            to set the MFILEReceiver attributes even if the data is NULL.
1011    
1012            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1013            and passed GDAL messages back up to the Python layer. Also
1014            tried to fix some memory leaks that were present in the original
1015            utility but didn't matter because the program aborted.
1016    
1017            * test/test_range.py: Copied over tests from SciParam. Removed
1018            tests against importing. Fixes RTBug #1867.
1019    
1020    2003-05-21  Bernhard Herzog  <[email protected]>
1021    
1022            * test/test_load.py: Remove unused imports and restructure the
1023            test code
1024            (LoadSessionTest): Split into one class for each test and turn
1025            LoadSessionTest itself into the base class for all such session
1026            tests.
1027            (ClassificationTest): New base class for load tests that test
1028            classifications
1029            (TestSingleLayer, TestLayerVisibility, TestClassification)
1030            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1031            for the individual tests
1032    
1033            * test/support.py (FileLoadTestCase.filename): New base class for
1034            file loading tests
1035    
1036    2003-05-21  Jan-Oliver Wagner <[email protected]>
1037    
1038            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1039            Mercator' to 'UTM Zone 32' as a more convenient example.
1040            Added 'Gauss Krueger Zone 6'.
1041    
1042            * Data/iceland_sample_raster.thuban: political polygon now
1043            filled transparent to have the raster image visible at once.
1044    
1045    2003-05-21  Frank Koormann  <[email protected]>
1046    
1047            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1048            OnClose() to keep in sync with extensions. Internally Thuban
1049            still uses "underscored" names.
1050    
1051    2003-05-20  Jonathan Coles   <[email protected]>
1052    
1053            This puts back Raster layer support. These layers support projections
1054            through the GDAL library. Currently, the CVS version is being used.
1055            There are no Debian packages available although this may change soon.
1056            A GDAL driver was extended to support writing to memory rather to
1057            files.
1058    
1059            There is still some work that needs to be done, such as some error
1060            handling when loading invalid images or when there is a problem
1061            projecting the image. This putback simply checks in the majority
1062            of the work.
1063    
1064            * setup.py: Add gdalwarp library extension.
1065    
1066            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1067            Defaults to False, but can be overridden by subclasses if they
1068            support classification.
1069            (RasterLayer): New. Defines a new layer that represents an
1070            image.
1071    
1072            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1073            tag handler.
1074            (SessionLoader.start_layer): Encode the filename.
1075            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1076            New. Supports reading a rasterlayer tag.
1077    
1078            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1079    
1080            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1081            get a string in Latin1. If we get such as string convert it to
1082            unicode first, otherwise leave if alone before encoding.
1083            (SessionSaver.write_layer): Add support for writing both Layers
1084            and RasterLayers.
1085    
1086            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1087            The right argument may not be a string, it could also be a Column.
1088    
1089            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1090            Make initial window size 600x400. Fixes RTBug #1872.
1091    
1092            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1093            the dialog is constructed so that we can support layers that
1094            do not have classifications.
1095            (Classifier._OnTry): Only build a classification if the layer
1096            supports one.
1097    
1098            * Thuban/UI/legend.py: Change all checks that a layer is an
1099            instance of Layer into checks against BaseLayer.
1100            (LegendTree.__FillTreeLayer): Only add children to a branch if
1101            the layer supports classification.
1102    
1103            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1104            MainWindow.OpenSession): Don't proceed with an action if the
1105            user chooses Cancel when they are asked to save changes.
1106            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1107            user to select an image file. Create a new RasterLayer and add
1108            it to the map.
1109    
1110            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1111            for rendering RasterLayer layers.
1112            (MapRenderer.draw_raster_layer): Actually method that calls
1113            the GDALWarp python wrapper and constructs an image from the
1114            data returned.
1115    
1116            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1117            Choices symbols to match those used in the table query method.
1118            Replace deprecated method calls on table with new method names.
1119    
1120            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1121            how small the scale can get. This still needs more testing.
1122    
1123            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1124            Provides a driver to output in .bmp format.
1125    
1126            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1127            New. Provides IO routines which write to memory, rather than a file.
1128    
1129            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1130            of the gdalwarp utility provided in GDAL. Added function calls
1131            that can be accessed from python.
1132    
1133            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1134            a raster layer.
1135    
1136            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1137            layer image data.
1138    
1139            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1140    
1141            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1142            tests associated with the raster layer code.
1143    
1144            * test/test_transientdb.py
1145            (TestTransientTable.test_auto_transient_table_query): Added a test
1146            for using a Column object as the "right" parameter to a query.
1147    
1148    2003-05-19  Frank Koormann  <[email protected]>
1149    
1150            * Thuban/version.py (get_changelog_date):
1151            Catch exceptions if ChangeLog does not exist.
1152    
1153            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1154    
1155    2003-05-19  Frank Koormann  <[email protected]>
1156    
1157            Extended version information for Thuban
1158    
1159            * Thuban/version.py: New, version information for Thuban: Last
1160            modification date and last ChangeLog entry date.
1161    
1162            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1163            information: Display Thuban, wxPython and Python version.
1164    
1165    2003-05-16  Bernhard Herzog  <[email protected]>
1166    
1167            * Thuban/Model/save.py: Remove some unused imports including the
1168            __future__ import for nested_scopes as Thuban relies on Python 2.2
1169            now.
1170            (XMLWriter.encode): Remove the special case for a None argument.
1171            In the saver encode is always called with a string argument.
1172    
1173    2003-05-16  Bernhard Herzog  <[email protected]>
1174    
1175            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1176            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1177            of the bug was that e.g. float("1.2") would fail. Thuban now
1178            requires 2.4.x.
1179            
1180    2003-05-16  Frank Koormann   <[email protected]>
1181    
1182            Printing enhancement and WMF export (under Win32)
1183    
1184            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1185            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1186            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1187            PrintRender.
1188    
1189            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1190            to fullfil information needed for PrinterRenderer.
1191            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1192            (MapCanvas.Print): Adapted to new MapPrintout.
1193            (OutputTransform): General calculations to transform from canvas
1194            coordinates to export/printing devices.
1195    
1196            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1197            new method_command to call ExportMap, with platform dependency (only
1198            __WXMSW__)
1199      
1200            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1201            of scalebar drawing area as new parameters.
1202            
1203            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1204    
1205            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1206            Update to extended scalebar.DrawScalebar header.
1207    
1208            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1209    
1210            * test/test_scalebar.py: Made test executable as standalone.
1211    
1212    2003-05-16  Bernhard Herzog  <[email protected]>
1213    
1214            * Thuban/Model/table.py (Table): Remove this compatibility alias
1215            for DBFTable.
1216    
1217            * test/test_table.py: Import DBFTable as Table because that alias
1218            doesn't exist anymore.
1219    
1220            * Thuban/UI/classgen.py: Remove some unused imports
1221    
1222    2003-05-14  Jonathan Coles   <[email protected]>
1223    
1224            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1225            Fix docstring.
1226            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1227            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1228            values of the supplied range to determine the beginning and end
1229            bounds of the generated classes.
1230    
1231            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1232            do not have a leading 0 (.5 is now accepted as well as 0.5).
1233    
1234            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1235            call to ClassGenerator.GenUniformDistribution.
1236    
1237            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1238            layout bug with the 'Projection' label.
1239    
1240            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1241    
1242            * test/test_range.py: New. Imported from SciParam.
1243    
1244    2003-05-12  Jonathan Coles   <[email protected]>
1245    
1246            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1247            to table.UniqueValues() with calls that retrieve all the values
1248            from the table. This will need to be replaced by a method on table
1249            which can simply return the list (perhaps more efficiently).
1250    
1251    2003-05-12  Jonathan Coles   <[email protected]>
1252    
1253            The return value of ClassGenerator.CalculateQuantiles has changed.
1254            Refer to the documentation for details.
1255    
1256            * test/test_classgen.py: Modified Quantile tests to use the
1257            new return values.
1258    
1259            * Thuban/Model/classgen.py
1260            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1261            use new return values from CalculateQuantiles to produce the correct
1262            range bounds in the Classification.
1263            (ClassGenerator.CalculateQuantiles): Add more comments describing
1264            the return values and parameters. Make minor adjustments to improve
1265            the legibility of the code. Fix problem with adjusted not being set
1266            in most cases.
1267    
1268    2003-05-12  Frank Koormann <[email protected]>
1269            
1270            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1271            and latin1. Fixes #1851 finally.
1272    
1273    2003-05-09  Jonathan Coles   <[email protected]>
1274    
1275            * test/test_classgen.py: New. Tests the Quantile algorithm.
1276    
1277            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1278            Clean up debugging statement, add comments, fix a small bug in the
1279            returned adjusted percentiles.
1280            
1281    2003-05-09  Jonathan Coles   <[email protected]>
1282    
1283            Introduces Range class from SciParam into the ClassGroupRange class,
1284            and such ranges can now be saved and loaded from disk.
1285    
1286            Quantiles are now available in the Classification Generator.
1287    
1288            Initial support for building Queries on a table. Doesn't do anything
1289            but run some tests.
1290    
1291            * Thuban/Model/classification.py: Explicit imports.
1292            (ClassGroupRange): Use the Range class to store the underlying
1293            range information. The interface remains the same, except for
1294            GetRange(), and you can also supply a Range object as the min
1295            parameter to SetRange or __init__.
1296    
1297            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1298            string appropriately for use in Thuban. Fixes RTbug #1851.
1299            (SessionLoader.end_projection): Handle the context of the
1300            projection tag a bit better by looking at what objects are not
1301            None. There was an assumption that a projection tag for a map
1302            could occur before any layers.
1303            (SessionLoader.start_clrange): Provide backward compatibility for
1304            reading min/max values as well as the new range parameter.
1305    
1306            * Thuban/Model/map.py: Explicit imports.
1307    
1308            * Thuban/Model/resource.py: Import _.
1309            (ProjFileSaver.write): write header using projfile.dtd.
1310    
1311            * Thuban/Model/save.py: Explicit imports.
1312            (XMLWriter.encode): New. Encode the given string from a format
1313            used by Thuban into UTF-8. Fixes RTbug #1851.
1314    
1315            * Thuban/UI/classgen.py: Explicit imports.
1316            (ClassGenDialog.__init__): Clean up the code and add support
1317            for Quantiles.
1318            (ClassGenDialog.OnOK): Add support for Quantiles.
1319            (GenQuantilesPanel): New. Input panel for Quantiles.
1320            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1321            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1322    
1323            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1324    
1325            * Thuban/UI/classifier.py: Explicit imports.
1326            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1327            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1328    
1329            * Thuban/UI/legend.py: Explicit imports.
1330    
1331            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1332            a Table menu and associated method calls.
1333            (MainWindow.choose_color): Removed. No longer needed.
1334    
1335            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1336            should be disabled if no projection is selected in the available
1337            list.
1338    
1339            * Thuban/UI/renderer.py: Explicit imports.
1340    
1341            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1342            with correctly selecting the rows and issuing the right events.
1343            Be sure to call Skip() to allow the grid to do some of its own
1344            handling which allows the rows to actually be selected.
1345            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1346            selecting multiple shapes.
1347            (LayerTableFrame): Support for building Queries.
1348            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1349    
1350            * Thuban/UI/tree.py: Explicit imports.
1351    
1352            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1353            table view can call it.
1354    
1355            * test/test_classification.py: Explicit imports.
1356            (TestClassification.test_ClassGroupRange): Fix test for new
1357            Range class.
1358    
1359            * Doc/thuban.dtd: Add range parameter for clrange.
1360    
1361            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1362            object in ClassGroupRange, and also uesd for inputting ranges in
1363            the classifer table and elsewhere.
1364    
1365            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1366            yet.
1367    
1368    2003-05-09  Frank Koormann <[email protected]>
1369    
1370            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1371    
1372    2003-05-08  Frank Koormann <[email protected]>
1373    
1374            Coding style updates
1375    
1376            * test/test_scalebar.py: Replaced tab indentation by spaces.
1377    
1378            * Thuban/UI/scalebar.py: Explicit imports.
1379    
1380    2003-05-08  Frank Koormann <[email protected]>
1381    
1382            * Thuban/UI/scalebar.py
1383            (ScaleBar.DrawScalebar): Format string bug fixed.
1384    
1385    2003-05-08  Frank Koormann <[email protected]>
1386    
1387            Reorganization of scalebar component (no wx in Thuban/Model)
1388    
1389            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1390            (deriveInterval):
1391            Calculate scalebar interval and unit which fits in width for scale.
1392            (roundInterval): Round float.
1393    
1394            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1395    
1396            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1397    
1398            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1399    
1400    2003-05-08  Frank Koormann <[email protected]>
1401    
1402            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1403            Initialize ScaleBar with canvas.map
1404    
1405            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1406            round intervals to display smarter lengths
1407            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1408            layer. If the maps has no projection applied grey the scalebar.
1409    
1410    2003-05-07  Frank Koormann <[email protected]>
1411            
1412            Basic Scalebar features added.
1413    
1414            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1415    
1416            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1417            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1418            and the renderer.
1419    
1420            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1421    
1422            * Thuban/UI/messages.py: SCALE_CHANGED added.
1423    
1424    2003-05-07  Bernhard Herzog  <[email protected]>
1425    
1426            * Thuban/Model/session.py (Session.__init__): New instance
1427            variable shapestores to hold a list of all open shapestore objects
1428            (Session.ShapeStores): New. Accessor method for the shapestores
1429            list.
1430            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1431            Internal methods to maintain the shapestores list.
1432            (Session.Tables): New. Return all tables open in the session.
1433            (Session.OpenShapefile): Insert the new ShapeStore into the
1434            shapestores list.
1435    
1436            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1437            tests for ShapeStores and Tables
1438            (TestSessionWithContent.test_shape_stores)
1439            (TestSessionWithContent.test_tables): New. Test cases for
1440            ShapeStores and Tables
1441    
1442    2003-05-07  Bernhard Herzog  <[email protected]>
1443    
1444            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1445            Add comments about the optimizations used.
1446            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1447            Implement the ReadValue table interface method.
1448    
1449            * test/test_transientdb.py
1450            (TestTransientTable.run_iceland_political_tests)
1451            (TestTransientTable.test_transient_joined_table): Add tests for
1452            ReadValue
1453    
1454    2003-05-07  Frank Koormann <[email protected]>
1455    
1456            * Resources/Bitmaps/fulllayerextent.xpm,
1457            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1458            new icons.
1459    
1460    2003-05-06  Bernhard Herzog  <[email protected]>
1461    
1462            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1463            New. Simply delegate to the transient table's version.
1464    
1465            * test/test_transientdb.py
1466            (TestTransientTable.test_auto_transient_table_query): New. Test
1467            case for AutoTransientTable's SimpleQuery
1468    
1469    2003-05-06  Bernhard Herzog  <[email protected]>
1470    
1471            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1472            Implement a simple query method for the query dialog
1473            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1474            the row index or shapeid.
1475            (TransientTable.create): Insert the right value of the row index
1476            (TransientJoinedTable.create): Copy the row index of the left
1477            table to the joined result table
1478    
1479            * test/test_transientdb.py
1480            (TestTransientTable.test_transient_table_read_twice): Fix
1481            doc-string
1482            (TestTransientTable.test_transient_table_query): New. Test for the
1483            SimpleQuery method
1484    
1485    2003-05-06  Bernhard Herzog  <[email protected]>
1486    
1487            Convert all table users to use the new table interface. This only
1488            covers Thuban itself, not GREAT-ER or other applications built on
1489            Thuban yet, so the compatibility interface stays in place for the
1490            time being but it now issues DeprecationWarnings.
1491    
1492            Finally, the new Table interface has a new method, HasColumn.
1493    
1494            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1495            issue deprecation warnings when they're. The warnings refer to the
1496            caller of the method.
1497            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1498            for the deprecation warnings
1499    
1500            * test/test_table.py: Ignore the deprecation warnings for the old
1501            table in the tests in this module. The purpose of the tests is to
1502            test the old interface, after all.
1503    
1504            * test/test_transientdb.py
1505            (TestTransientTable.run_iceland_political_tests): Use the
1506            constants for the types. Add a test for HasColumn
1507            (TestTransientTable.test_transient_joined_table): Adapt to new
1508            table interface. Add a test for HasColumn
1509            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1510            table interface
1511    
1512            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1513            Adapt to new table interface
1514    
1515            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1516            new table interface
1517    
1518            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1519            (RecordTable.SetTable): Adapt to new table interface
1520    
1521            * Thuban/UI/classifier.py (Classifier.__init__)
1522            (Classifier.__init__): Adapt to new table interface
1523    
1524            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1525            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1526            to new table interface
1527    
1528            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1529            (AutoTransientTable.HasColumn): Implement the new table interface
1530            method
1531            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1532            (AutoTransientTable.UniqueValues): Adapt to new table interface
1533    
1534            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1535            Adapt to new table interface
1536    
1537            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1538            simplify opening shapefiles a bit easier.
1539            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1540            (TestLayer.test_point_layer): Use the new helper method
1541            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1542            method
1543    
1544            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1545            the new table method
1546    
1547            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1548            Test for the new table method HasColumn
1549    
1550    2003-05-06  Jonathan Coles   <[email protected]>
1551    
1552            Addresses the "Selection Extent" wish of RTbug #1787.
1553    
1554            * Resources/Bitmaps/fulllayerextent.xpm,
1555            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1556            extent. These are just place holders for the real bitmaps.
1557    
1558            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1559            calculate the bounding box once (the first time compute_bbox() is
1560            called).
1561            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1562            the bounding box for the shapes in lat/long coordinates.
1563    
1564            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1565            option.
1566            (MainWindow.has_selected_shapes): New. Returns true if there are
1567            any selected shapes.
1568            (MainWindow.FullSelectionExtent): New. Calls
1569            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1570            (_has_selected_shapes): New. Returns true if there are any
1571            selected shapes.
1572    
1573            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1574            true if there are any selected shapes.
1575    
1576            * Thuban/UI/view.py (MapCanvas): Added delegated method
1577            HasSelectedShapes.
1578            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1579            shapes on the canvas using the map projection (if any).
1580    
1581            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1582            for Layer.ShapesBoundingBox().
1583    
1584    2003-05-06  Bernhard Herzog  <[email protected]>
1585    
1586            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1587    
1588    2003-05-05  Jonathan Coles   <[email protected]>
1589    
1590            Addresses the "Full Layer Extent" wish of RTbug #1787.
1591    
1592            * Resources/Projections/defaults.proj: Added UK National Grid.
1593    
1594            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1595            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1596            when the user selects the menu option.
1597    
1598            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1599            scales the given layer on the canvas using the map projection.
1600    
1601    2003-05-05  Bernhard Herzog  <[email protected]>
1602    
1603            Convert the table implementations to a new table interface. All
1604            tables use a common mixin class to provide backwards compatibility
1605            until all table users have been updated.
1606    
1607            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1608            provide backwards compatibility for table classes implementing the
1609            new interface
1610            (DBFTable, MemoryTable): Implement the new table interface. Use
1611            OldTableInterfaceMixin as base for compatibility
1612            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1613            and MemoryTable resp.
1614    
1615            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1616            the new table interface.
1617    
1618            * test/test_memory_table.py: New. Test cases for the MemoryTable
1619            with the new table interface.
1620    
1621            * test/test_table.py: Document the all tests in this file as only
1622            for backwards compatibility. The equivalent tests for the new
1623            interface are in test_memory_table.py and test_dbf_table.py
1624            (MemoryTableTest.test_read): field_info should be returning tuples
1625            with four items
1626            (MemoryTableTest.test_write): Make doc-string a more precise.
1627    
1628            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1629            table interface. Derive from from OldTableInterfaceMixin for
1630            compatibility.
1631            (TransientTableBase.create): New intance variable column_map to
1632            map from names and indices to column objects
1633            (TransientTable.create): Use the new table interface of the input
1634            table
1635            (AutoTransientTable): Convert to new table interface. Derive from
1636            from OldTableInterfaceMixin for compatibility.
1637            (AutoTransientTable.write_record): Removed. It's not implemented
1638            yet and we still have to decide how to handle writing with the new
1639            table and data framework.
1640    
1641            * test/test_transientdb.py
1642            (TestTransientTable.run_iceland_political_tests)
1643            (TestTransientTable.test_transient_joined_table): Use the new
1644            table interface
1645    
1646    2003-05-05  Jonathan Coles   <[email protected]>
1647    
1648            This is namely a collection of UI updates to improve user interactivity.
1649            Tabbing between controls now exists and you can use ESC to close dialog
1650            boxes; ENTER will active the default button.
1651    
1652            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1653            order that the controls are created so that tabbing works correctly.
1654            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1655            wxDialog can handle the default button correctly.
1656            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1657            same reasons as for OnOK.
1658            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1659            when we ask the table for the maximum/minimum values of a field
1660            which could take a very long time.
1661    
1662            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1663            order that the controls are created so that tabbing works correctly.
1664            (SelectPropertiesDialog.__init__): Rearrange the order that the
1665            controls are created so that tabbing works correctly.
1666    
1667            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1668            to derive from a wxDialog but behave like the original implementation
1669            which was derived from a wxFrame. wxDialog provides useful key
1670            handling functionality like ESC calling OnCancel and ENTER calling
1671            OnOK which is lost with wxFrame.
1672    
1673            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1674            new dialogs.
1675    
1676            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1677            order that the controls are created so that tabbing works correctly.
1678            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1679            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1680            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1681            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1682            can provide the "UK National Grid" as a default projection.
1683            (UTMPanel.__init__): Rearrange the order that the controls are
1684            created so that tabbing works correctly.
1685    
1686    2003-05-05  Bernhard Herzog  <[email protected]>
1687    
1688            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1689            (project_point): If a map projection but no layer projection is
1690            given, convert degrees to radians before applying the map
1691            projection.
1692    
1693            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1694            (TableGrid.allow_messages): New methods to make it possible to
1695            inhibit message sending.
1696            (TableGrid.issue): Only send the message if not inhibited.
1697            (LayerTableGrid.select_shape): Use the new methods to make sure
1698            that no ROW_SELECTED message is sent while we're updating the
1699            selected rows to match the selected shapes.
1700    
1701    2003-05-02  Jan-Oliver Wagner <[email protected]>
1702    
1703            Implementation of MemoryTable.
1704    
1705            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1706            implementation that operates on a list of tuples. All of the data
1707            are kept in the memory.
1708    
1709            * test/test_table.py (MemoryTableTest): New.
1710    
1711            * test/test_transientdb.py (SimpleTable): Removed.
1712            (TestTransientTable.test_transient_joined_table,
1713            (TestTransientTable.test_transient_table_read_twice): Replaced
1714            SimpleTable by MemoryTable.
1715    
1716    2003-04-30  Jonathan Coles   <[email protected]>
1717    
1718            * Data/iceland_sample.thuban: Now contains correct projections
1719            for each of the layers.
1720    
1721            * Resources/Projections/defaults.proj: Geographic projection
1722            contains unit conversion parameter.
1723    
1724  2003-04-30  Jonathan Coles   <[email protected]>  2003-04-30  Jonathan Coles   <[email protected]>
1725    
1726          The most important part of this putback is the projection changes.          The most important part of this putback is the projection changes.

Legend:
Removed from v.793  
changed lines
  Added in v.1195

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26