/[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 477 by bh, Thu Mar 6 15:03:48 2003 UTC revision 1191 by jonathan, Thu Jun 12 17:01:45 2003 UTC
# Line 1  Line 1 
1    2003-06-12  Jonathan Coles   <[email protected]>
2    
3            * Thuban/Lib/fileutil.py: As is done under Windows, create the
4            user directory if it doesn't exist on a posix system.
5    
6            * Thuban/Model/resource.py (get_user_proj_files): Moved the
7            called to get_application_dir here, so that the directory
8            will only be called if this method is invoked.
9    
10            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
11            the projfilepath if no projection is selected.
12    
13    2003-06-12  Jonathan Coles   <[email protected]>
14    
15            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
16            the scalebar if the current map has no projection set.
17    
18            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
19            projfilepath label to just the basename of the projection file
20            rather than include the entire path.
21    
22            * Thuban/Model/resource.py: Fix missed proj functions that
23            needed to be renamed.
24    
25    2003-06-12  Jonathan Coles   <[email protected]>
26    
27            * Thuban/Model/classification.py: Removed assert statements that
28            tested if the variable was an instance of Color.
29    
30            * Thuban/Model/color.py (Color): Remove commented code that isn't
31            used.
32            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
33            Fixes RTbug #1835.
34            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
35            Needed now that the class doesn't inherit from Color.
36    
37    2003-06-12  Jonathan Coles   <[email protected]>
38    
39            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
40            check unicode strings.
41    
42            * test/test_layer.py: Check for existence of gdal.
43    
44    2003-06-12  Jonathan Coles   <[email protected]>
45        
46            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
47            that was in load.py
48    
49            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
50            that was in save.py
51    
52    2003-06-12  Jonathan Coles   <[email protected]>
53    
54            This is largely a collection of bug fixes. We also handle the
55            case where gdal is not on the system. The XMLReader and XMLWriter
56            classes were moved into there own files to resolve some circular
57            import references and because they shouldn't really be in the
58            file that is dediciated to reading/writing session files since
59            they are also used elsewhere.
60    
61            * Thuban/Model/classgen.py: Renamed functions to follow the
62            function_names_with_underscores style. Fixes RTbug #1903.
63            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
64    
65            * Thuban/Model/layer.py: Import gdal only if it available.
66            (RasterLayer): Handle the case where the gdal library is unavailable.
67            Addresses RTbug #1877.
68    
69            * Thuban/Model/load.py (XMLReader): Moved into seperate file
70            xmlreader.py.
71    
72    2003-06-12  Jonathan Coles   <[email protected]>
73    
74            This is largely a collection of bug fixes. We also handle the
75            case where gdal is not on the system. The XMLReader and XMLWriter
76            classes were moved into there own files to resolve some circular
77            import references and because they shouldn't really be in the
78            file that is dediciated to reading/writing session files since
79            they are also used elsewhere.
80    
81            * Thuban/Model/classgen.py: Renamed functions to follow the
82            function_names_with_underscores style. Fixes RTbug #1903.
83            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
84    
85            * Thuban/Model/layer.py: Import gdal only if it available.
86            (RasterLayer): Handle the case where the gdal library is unavailable.
87            Addresses RTbug #1877.
88    
89            * Thuban/Model/load.py (XMLReader): Moved into seperate file
90            xmlreader.py.
91    
92            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
93            file xmlwriter.py.
94    
95            * Thuban/Model/resource.py: Renamed functions to following the
96            function_names_with_underscores style.
97            (has_gdal_support): New function that returns true if the gdal
98            library is available. Addresses RTbug #1877.
99    
100            * Thuban/UI/application.py (ThubanApplication.OpenSession):
101            Display a message box if the gdal library is not available, but
102            only if there are any layers that would use it. Addresses RTbug #1877.
103    
104            * Thuban/UI/classgen.py: Use renamed projection resource functions.
105            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
106            when using integers versus floats.
107    
108            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
109            determine if the "Add Image Layer" menu option should be
110            greyed out or not. Addresses RTbug #1877.
111    
112            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
113    
114            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
115            optimize if a raster layer is visible. Fixes RTbug #1931.
116            Only draw the raster layer if the gdal library is available.
117            Addresses RTbug #1877.
118    
119            * test/test_classgen.py: Add tests for generate_singletons,
120            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
121            (test_calculate_quantiles): Fix some tests to catch the new
122            ValueError that is raised.
123    
124            * test/test_proj.py: Use renamed projection resource functions.
125    
126            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
127            test for saving classified layers. Fixes RTbug #1902.
128            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
129    
130    2003-06-12  Jan-Oliver Wagner <[email protected]>
131    
132            Fix for http://intevation.de/rt/webrt?serial_num=1900.
133    
134            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
135    
136            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
137            multiplechoicedialog.py rather than from the wxPython library.
138    
139    2003-06-11  Frank Koormann  <[email protected]>
140    
141            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
142            update.
143    
144    2003-06-11  Frank Koormann  <[email protected]>
145    
146            * Thuban/Lib/fileutil.py (get_application_dir): New function to
147            determine the absolute .thuban/thuban directory under
148            "posix" (os.expanduser) and "nt" (read AppData registry key).
149    
150            * Thuban/Model/resource.py: Use get_application_dir
151    
152            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
153            Use get_application_dir.
154    
155    2003-06-10  Bernhard Herzog  <[email protected]>
156    
157            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
158            the messages MAP_LAYERS_REMOVED messages
159            (LayerTableFrame.OnClose): Unsubscribe from it.
160            (LayerTableFrame.map_layers_removed): New. Receiver for
161            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
162            dialog is showing is removed.
163    
164    2003-06-10  Bernhard Herzog  <[email protected]>
165    
166            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
167            of the receivers list so that unsubscribing in a receiver doesn't
168            modify it while iterating over it.
169    
170            * test/test_connector.py
171            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
172            unsubscribing in a receiver works correctly. See docstring for
173            details
174    
175    2003-06-10  Bernhard Herzog  <[email protected]>
176    
177            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
178            message.
179    
180            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
181            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
182            LAYER_CHANGED will still be sent if the classification changes.
183    
184            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
185            parameter so we can subscribe to some of its messages
186            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
187            and the layer's LAYER_SHAPESTORE_REPLACED
188            (Classifier.unsubscribe_messages): New. Unsubscribe from message
189            subscribed to in __init__
190            (Classifier.map_layers_removed)
191            (Classifier.layer_shapestore_replaced): receivers for the messages
192            subscribed to in __init__. Unsubscribe and close the dialog
193    
194            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
195            the map to the Classifier dialog
196    
197            * test/test_layer.py (SetShapeStoreTests): Derive from
198            SubscriberMixin as well so we can test messages
199            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
200            messages
201            (SetShapeStoreTests.tearDown): Clear the messages again
202            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
203            for the modified flag too
204            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
205            to check whether SetShapeStore sets the modified flag
206            (SetShapeStoreTests.test_set_shape_store_different_field_name)
207            (SetShapeStoreTests.test_set_shape_store_same_field)
208            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
209            Add tests for the messages. This checks both the new
210            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
211    
212    2003-06-06  Jan-Oliver Wagner <[email protected]>
213    
214            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
215            the menu items.
216    
217    2003-06-05  Frank Koormann  <[email protected]>
218    
219            * Thuban/UI/identifyview.py (IdentifyView.__init__):
220            Layout reimplemented without panel. Make life easier to fit the list
221            in the dialog.
222    
223    2003-06-05  Frank Koormann  <[email protected]>
224    
225            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
226            once on initialisation (Former implementation resulted in multiple
227            entries for each projection).
228            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
229            if set, select the projection found under the specified name. This
230            overwrites any other selection estimate.
231            Removed projchoice filling from this method.
232            (ProjFrame._OnSave, ProjFrame._OnAddToList):
233            Updated call of ProjFrame.__FillAvailList
234            (LCCPanel._DoLayout): Moved parameter controls in more common order.
235    
236            * Resources/Projections/defaults.proj: Extended defaults representing
237            various common European projections.
238    
239    2003-06-05  Frank Koormann  <[email protected]>
240    
241            * Thuban/UI/identifyview.py (IdentifyView.__init__):
242            Use ListCtrl instead of GridCtrl
243    
244            * Thuban/Model/resource.py:
245            Guess location of .thuban directory from tempdir parent directory.
246    
247            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
248            Guess location of .thuban directory from tempdir parent directory.
249    
250    2003-06-04  Bernhard Herzog  <[email protected]>
251    
252            Do not cache the values returned by the tree widget's
253            GetFirstChild and GetNextChild methods because it led to lots of
254            segfaults. The new way requires more brute force but is more
255            reliable.
256    
257            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
258            variable layer2id
259            (LegendTree.find_layer): New method to do with brute force what
260            layer2id tried to accomplish
261            (LegendTree._OnMsgLayerChanged)
262            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
263            Use find_layer instead of layer2id
264            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
265            update layer2id anymore
266            (LegendTree._OnMsgMapLayersRemoved)
267            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
268    
269    2003-06-03  Thomas Koester  <[email protected]>
270    
271            * Thuban/Model/classgen.py (GenQuantiles0): New function.
272    
273    2003-06-02  Bernhard Herzog  <[email protected]>
274    
275            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
276            New commands.
277            (main_menu): Add the new commands.
278            (MainWindow.TableRename): New. Implementation of the table_rename
279            command.
280            (MainWindow.RenameLayer): New. Implementation of the layer_rename
281            command.
282    
283            * Thuban/Model/session.py (Session.AddTable): call self.changed to
284            set the modified flag
285    
286            * test/test_session.py (TestSessionSimple.test_add_table): Test
287            whether the modified flag is set properly
288    
289            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
290            instead of issue so that the modified flags get updated.
291    
292            * test/test_base.py (SomeTitledObject): Derive from Modifiable
293            instead of Publisher to reflect reality better and to accomodate
294            the fact that SetTitle now calls changed instead of issue
295    
296    2003-06-02  Bernhard Herzog  <[email protected]>
297    
298            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
299            acquisition has to happen before the try in a try-finally.
300    
301    2003-06-02  Bernhard Herzog  <[email protected]>
302    
303            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
304            possible that a layer is removed that is not currently selected in
305            the legend so don't check for this.
306    
307    2003-05-30  Bernhard Herzog  <[email protected]>
308    
309            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
310            variables to None that have direct or indirect references to
311            shapefiles or dbf files to make sure that they do go away and the
312            files are closed.
313    
314    2003-05-30  Bernhard Herzog  <[email protected]>
315    
316            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
317            availImgListIndices when a new image list is created
318            
319    2003-05-30  Bernhard Herzog  <[email protected]>
320    
321            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
322            changing_selection to indicate whether the LegendTree code itself
323            is currently changing the selection
324            (LegendTree.normalize_selection): New method to normalize the
325            selection by selecting the layer item even if the user clicked on
326            the classification.
327            (LegendTree._OnSelChanged): normalize the selection. This works
328            around a bug in wx which doesn't keep track of the selection
329            properly when subtrees are deleted.
330    
331    2003-05-30  Bernhard Herzog  <[email protected]>
332    
333            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
334            maximum and minimum scale factors.
335    
336            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
337            changes in classgen.py
338    
339    2003-05-30  Jonathan Coles   <[email protected]>
340    
341            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
342            all the methods functions. Fixes RTBug #1903.
343    
344            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
345            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
346            RTBug #1907.
347    
348            * Thuban/UI/classgen.py: Use classgen functions that were part
349            of the ClassGenerator class. Put try/finally blocks around
350            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
351            RTBug #1904.
352    
353            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
354    
355            * Thuban/UI/legend.py: The legend was cleared and repopulated any
356            time something changed which caused some state to be lost such
357            as which children were expanded or collapsed. Fixes RTBug #1901.
358            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
359            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
360            the legend but not in the map.
361            (LegendTree.__FillTree): Move main functionality out into smaller
362            methods that can be used by other methods.
363            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
364            if they are available.
365            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
366            that we override the wxTreeCtrl method. Iterate over children
367            and call __RemoveLayer.
368            (LegendTree.__AddLayer): New. Add a new layer to the legend.
369            (LegendTree.__RemoveLayer): Remove a layer from the legend.
370            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
371            Should only be called with the id of a layer branch.
372            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
373            Returns the root item or creates one if necessary.
374    
375            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
376            ProjectRasterFile with tuple arguments instead of strings.
377    
378            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
379            with try/finally. Fixes RTBug #1904.
380    
381            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
382            with try/finally. Fixes RTBug #1904.
383            (MapCanvas.FitSelectedToWindow): If a single point is selected
384            simply center it on the display. Fixes RTBug #1849.
385    
386            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
387            to be compiled as a standalone app. Now the code can only be
388            called from Python which simplifies the parameter passing.
389            (ProjectRasterFile): Handle Python arguments. Remove code that
390            checks for a destination dataset. Add more clean up code.
391    
392            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
393            TestMapWithContents.test_lower_layer_bottom):
394            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
395            Fixes RTBug #1907.
396    
397            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
398            extent to the map when the legend is toggled. Fixes RTBug #1881.
399    
400    2003-05-29  Jan-Oliver Wagner <[email protected]>
401    
402            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
403            unsubscribes all that is subcribed in __init__.
404    
405    2003-05-28  Bernhard Herzog  <[email protected]>
406    
407            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
408            (MainWindow.CanDuplicateLayer): New methods to implement the
409            Layer/Duplicate command.
410            (layer_duplicate command): New.
411            (main_menu): Add layer_duplicate to the Layer menu.
412    
413    2003-05-28  Bernhard Herzog  <[email protected]>
414    
415            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
416            renderer so that NULL/None values get displayed differently (by a
417            gray rectangle).
418            (TableGrid.__init__): Override the default renderers
419    
420    2003-05-28  Bernhard Herzog  <[email protected]>
421    
422            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
423            classification to "None" if the type of the field has changed.
424    
425            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
426            test for the Layer.SetShapeStore method
427    
428    2003-05-28  Jan-Oliver Wagner <[email protected]>
429    
430            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
431            does not necessarily have a filename).
432    
433    2003-05-28  Jan-Oliver Wagner <[email protected]>
434    
435            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
436            sort the selection list for the dialog.
437    
438    2003-05-28  Frank Koormann  <[email protected]>
439    
440            * extensions/thuban/wxproj.cpp
441            (project_point): Removed cast to int for projected point coordinates.
442            (shape_centroid): Return last point if all polygon vertices fall
443            to one point.
444    
445    2003-05-28  Bernhard Herzog  <[email protected]>
446    
447            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
448            with layers that don't have shapestores, i.e. raster layers.
449    
450    2003-05-28  Bernhard Herzog  <[email protected]>
451    
452            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
453            when determining the title from the filename.
454    
455            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
456            reflect changes in the way the title is derived from the filename
457    
458    2003-05-28  Frank Koormann  <[email protected]>
459    
460            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
461            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
462    
463    2003-05-27  Bernhard Herzog  <[email protected]>
464    
465            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
466            delegate SelectedLayer.
467            (MainWindow.LayerUnjoinTable): Implement.
468            (_can_unjoin): New. Helper function for the sensitivity of the
469            layer/unjoin command.
470    
471            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
472            (DerivedShapeStore.OrigShapeStore): New. Return the original
473            shapestore. Used to figure out how to unjoin.
474            (DerivedShapeStore.Shapefile): Fix a typo.
475    
476    2003-05-27  Bernhard Herzog  <[email protected]>
477    
478            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
479            well
480            (JoinDialog.__init__): Use the layer parameter and only build the
481            left choice when a layer is given
482            (JoinDialog.OnJoin): Handle layer joins as well
483            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
484            that the user selects the "Select..." item. The sensitivitly
485            updating is now in update_sensitivity
486            (JoinDialog.y): New method to refactor the sensitivity update of
487            the join button into its own method.
488    
489            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
490    
491    2003-05-27  Bernhard Herzog  <[email protected]>
492    
493            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
494            iff there are unreferenced tables in the session
495    
496    2003-05-27  Bernhard Herzog  <[email protected]>
497    
498            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
499    
500            * Thuban/Model/session.py (Session.UnreferencedTables): New method
501            to return tables that are not referenced by other tables or shape
502            stores and can be removed.
503            (Session.RemoveTable): Issue a TABLE_REMOVED message after
504            removing the table
505    
506            * Thuban/UI/mainwindow.py: Remove unused imports
507            (MainWindow.TableClose): Implement.
508    
509            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
510            messages so that the frame will be automatically closed when a new
511            session is opened or the table is removed.
512            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
513            __init__
514            (TableFrame.close_on_session_replaced)
515            (TableFrame.close_on_table_removed): New. Subscribers that close
516            the window
517    
518            * test/test_session.py (TestSessionMessages.test_remove_table)
519            (TestSessionSimple.test_remove_table): Move the test to
520            TestSessionSimple and add test for the TABLE_REMOVED message
521            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
522            (TestSessionSimple.test_unreferenced_tables) New. Test for the
523            UnreferencedTables method.
524            (UnreferencedTablesTests): New. Class with some more sophisticated
525            tests for UnreferencedTables.
526    
527    2003-05-27  Frank Koormann  <[email protected]>
528    
529            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
530            display has some unwanted side effects. Removed again.
531    
532    2003-05-27  Frank Koormann  <[email protected]>
533    
534            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
535    
536            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
537    
538    2003-05-27  Jan-Oliver Wagner <[email protected]>
539    
540            * test/test_menu.py (MenuTest.test): Added test for
541            Menu.RemoveItem().
542    
543            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
544            the menu.
545    
546    2003-05-27  Frank Koormann  <[email protected]>
547            
548            Nonmodal dialogs without parent (i.e. they can fall behind the main
549            window)
550    
551            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
552            all dialogs in the dialogs dictionary and the canvas.
553    
554            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
555            parent, i.e. can fall behind other windows.
556            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
557            dictionary before removing it.
558    
559            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
560    
561            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
562            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
563            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
564    
565    2003-05-27  Bernhard Herzog  <[email protected]>
566    
567            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
568            tableview dialog
569            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
570            Also, don't use the table's titles as the dialog names. The titles
571            aren't guaranteed to be unique.
572            (MainWindow.TableOpen): Open a table view dialog after opening the
573            table
574    
575    2003-05-27  Bernhard Herzog  <[email protected]>
576    
577            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
578            effect can be achieved by simply closing the window showing the
579            table.
580            (MainWindow.TableHide): Removed.
581            (main_menu): Removed "table_hide"
582    
583    2003-05-27  Frank Koormann  <[email protected]>
584    
585            Fix legend tree display problems under Win32
586    
587            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
588            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
589            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
590    
591            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
592    
593    2003-05-27  Jan-Oliver Wagner <[email protected]>
594    
595            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
596            'after' now allows to insert separators almost anywhere in the menu.
597    
598    2003-05-27  Frank Koormann  <[email protected]>
599    
600            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
601            "S" of selection box label to hint on hot key (Alt-S). Works under
602            Win32 but is ignored under GTK.
603    
604    2003-05-26  Frank Koormann  <[email protected]>
605    
606            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
607            Center Choices.
608    
609    2003-05-26  Bernhard Herzog  <[email protected]>
610    
611            Remove the Precision methods again. They're too DBF specific to be
612            part of the table interface and they're only used in table_to_dbf
613            anyway.
614            
615            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
616            fixed precision of 12 for doubles.
617            (TransientTableBase.Precision): Removed
618            (AutoTransientTable.Width): Delegate to self.table.
619    
620            * Thuban/Model/table.py (DBFTable.Precision)
621            (MemoryTable.Precision): Removed.
622            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
623            (table_to_dbf): Use a fixed precision of 12 for floats unless the
624            column object specifies something else.
625    
626            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
627            test for table_to_dbf
628    
629    2003-05-26  Bernhard Herzog  <[email protected]>
630    
631            * test/test_transientdb.py
632            (TestTransientTable.run_iceland_political_tests): Fix a comment.
633    
634    2003-05-26  Bernhard Herzog  <[email protected]>
635    
636            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
637            implementation. Mark parts of the file format strings for
638            localization.
639    
640            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
641            file and add the table to the tables managed by the session
642    
643            * test/test_session.py (TestSessionSimple.test_open_table_file):
644            New. test case for OpenTableFile
645    
646    2003-05-26  Jan-Oliver Wagner <[email protected]>
647    
648            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
649            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
650            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
651            Replace the true/false of wxWindows by True/False of Python 2.2.1.
652    
653    2003-05-26  Jan-Oliver Wagner <[email protected]>
654    
655            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
656            already a selection present, update the grid accordingly.
657    
658            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
659            resizeable and increase its initial size.
660    
661    2003-05-26  Frank Koormann  <[email protected]>
662    
663            Table export functionality
664    
665            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
666            Return width (in characters) for a column.
667            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
668            (table_to_dbf): Write table to dbf file.
669            (table_to_csv): Write table to csv file.
670    
671            * Thuban/Model/transientdb.py (TransientTableBase.Width,
672            TransientTableBase.Precision): Return column width and precision.
673    
674            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
675            or table_to_csv depending on file selection.
676    
677            * test/test_dbf_table.py:
678            Test table_to_dbf (extension of former part of test).
679    
680            * test/test_csv_table.py:
681            Test table_to_csv.
682    
683    2003-05-23  Jan-Oliver Wagner <[email protected]>
684    
685            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
686            Use QueryTableFrame instead of TableFrame.
687    
688            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
689            table window with 'Layer Table:' instead of 'Table:'.
690    
691    2003-05-23  Jan-Oliver Wagner <[email protected]>
692    
693            Give all tables a title via mix-in TitledObject.LayerShowTable
694    
695            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
696            only if it exists.
697    
698            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
699            and call its init-method with a default title. Remove Title() method.
700    
701            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
702            AutoTransientTable): mix-in TitledObject and call its init-method with
703            a default title. Remove Title() method.
704    
705    2003-05-23  Bernhard Herzog  <[email protected]>
706    
707            * Thuban/Model/session.py (Session.AddShapeStore): Define
708            AddShapeStore analogously to AddTable.
709    
710            * test/test_session.py (TestSessionSimple.test_add_shapestore):
711            New. Test for AddShapeStore
712    
713    2003-05-23  Jan-Oliver Wagner <[email protected]>
714    
715            Introducing QueryTableFrame and a very coarse ShowTable implementation.
716    
717            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
718            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
719            The latter implements the selection GUI without dependency on a layer.
720            LayerTableFrame now is derived from QueryTableFrame and connects
721            to a layer.
722    
723            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
724            implementation that still needs work.
725    
726            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
727    
728    2003-05-22  Frank Koormann  <[email protected]>
729    
730            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
731            Added "outer_join = False" as optional parameter.
732            (TransientJoinedTable.create): If outer join is true, perform a
733            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
734            the left table. Records not matching are filled with 0 / None.
735    
736            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
737            (JoinDialog.OnJoin): Consider outer join check box.
738    
739    2003-05-22  Bernhard Herzog  <[email protected]>
740    
741            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
742            somewhat safer way. Storing the traceback in a local variable can
743            lead to memory leaks
744    
745    2003-05-22  Bernhard Herzog  <[email protected]>
746    
747            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
748            the wxMessageDialog's Destroy() method.
749    
750    2003-05-22  Frank Koormann  <[email protected]>
751    
752            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
753            TransientTable.Title()
754    
755    2003-05-22  Frank Koormann  <[email protected]>
756    
757            Join Dialog, initial version.
758    
759            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
760    
761            * Thuban/UI/join.py (JoinDialog): Functional implementation of
762            former framework. Renamed Table1/Table2 to LeftTable/RightTable
763            in all occurences.
764    
765            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
766            Typo fixed.
767    
768    2003-05-22  Bernhard Herzog  <[email protected]>
769    
770            Give the tables titles so that the GUI can display more meaningful
771            names. For now the titles are fixed but depend on e.g. filenames
772            or the titles of the joined tables.
773    
774            * Thuban/Model/transientdb.py (TransientTable.Title)
775            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
776    
777            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
778    
779            * test/test_transientdb.py
780            (TestTransientTable.test_auto_transient_table_title): New. Test
781            for the Title method
782            (TestTransientTable.test_transient_joined_table)
783            (TestTransientTable.test_transient_table): Add test for the Title
784            methods
785    
786            * test/test_memory_table.py (TestMemoryTable.test_title): New.
787            Test for the Title method
788    
789            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
790            the Title method
791    
792    2003-05-22  Bernhard Herzog  <[email protected]>
793    
794            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
795            Provide a better way to destroy the layers
796            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
797            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
798            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
799            the new way to destroy the layers.
800            (TestLayer.test_derived_store): New. Test for using a layer with a
801            DerivedShapeStore
802    
803            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
804            filename if the shape store actually has one.
805    
806    2003-05-22  Bernhard Herzog  <[email protected]>
807    
808            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
809            for the filename
810    
811            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
812            for the FileName method
813            (TestDBFTableWriting.test_write): Fix spelling of filename
814    
815    2003-05-22  Thomas Koester  <[email protected]>
816    
817            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
818            from SciParam that now really is immutable.
819    
820    2003-05-22  Frank Koormann  <[email protected]>
821    
822            Layer Top/Bottom placement added to legend.
823    
824            * Thuban/UI/legend.py
825            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
826            bound to tool events.
827            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
828            New, methods binding the event methods with the map methods.
829    
830            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
831            layer at top/bottom of layer stack.
832    
833            * Resources/Bitmaps/top_layer.xpm: New button icon.
834    
835            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
836    
837    2003-05-22  Bernhard Herzog  <[email protected]>
838    
839            * Thuban/Model/session.py (Session.RemoveTable): New method to
840            remove tables
841    
842            * test/test_session.py (TestSessionSimple.test_remove_table): New.
843            Test for RemoveTable
844    
845    2003-05-22  Thomas Koester  <[email protected]>
846    
847            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
848            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
849    
850    2003-05-22  Bernhard Herzog  <[email protected]>
851    
852            Implement a way to discover dependencies between tables and
853            shapestores.
854    
855            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
856            (TransientJoinedTable.Dependencies)
857            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
858            interface
859            (TransientJoinedTable.__init__): Keep tack of the original table
860            objects in addition to the corresponding transient tables.
861    
862            * Thuban/Model/table.py (DBFTable.Dependencies)
863            (MemoryTable.Dependencies): New. Implement the dependencies
864            interface
865    
866            * Thuban/Model/data.py (ShapeTable): New. Helper class for
867            ShapefileStore
868            (ShapefileStore.__init__): Use ShapeTable instead of
869            AutoTransientTable
870            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
871            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
872            methods for filename and type
873            (ShapefileStore.Dependencies): New. Implement the dependencies
874            interface
875            (DerivedShapeStore): New class to replace SimpleStore. The main
876            difference to SimpleStore is that it depends not on a shapefile
877            but another shapestore which expresses the dependencies a bit
878            better
879            (SimpleStore.__init__): Add deprecation warning.
880    
881            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
882            Test for the Dependencies method.
883    
884            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
885            New. Test for the Dependencies method.
886    
887            * test/test_transientdb.py
888            (TestTransientTable.test_auto_transient_table_dependencies): New.
889            Test for the Dependencies method.
890            (TestTransientTable.test_transient_joined_table): Add test for the
891            Dependencies method.
892    
893            * test/test_session.py (TestSessionSimple.setUp)
894            (TestSessionSimple.tearDown): New. Implement a better way to
895            destroy the sessions.
896            (TestSessionSimple.test_initial_state)
897            (TestSessionSimple.test_add_table): Bind session to self.session
898            so that it's destroyed by tearDown
899            (TestSessionSimple.test_open_shapefile): New. Test for
900            OpenShapefile and the object it returns
901    
902    2003-05-22  Bernhard Herzog  <[email protected]>
903    
904            * Thuban/Model/session.py (Session.AddTable): New method to
905            register tables with the session.
906            (Session.Tables): Return the tables registered with AddTable too.
907    
908            * test/test_session.py (TestSessionSimple.test_add_table): New.
909            Test case for the AddTable method
910    
911    2003-05-22  Frank Koormann  <[email protected]>
912    
913            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
914            lower right corner, center labels for selections, initialize controls
915            in reasonable order for keyboard navigation.
916    
917            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
918            (ProjFrame.__DoOnProjAvail): Determine position of current projection
919            using the wxListBox.FindString() method. Still a problem (#1886)
920    
921            * Thuban/UI/classifier.py
922            (Classifier.__init__, SelectPropertiesDialog.__init__)
923    
924            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
925            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
926            different classification types from here to __init__.
927            (GenUniquePanel.__init__): Set the column width of the first field
928            in the Field ListCtrl to the full width.
929    
930            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
931            Button to 'Export'. Center Buttons in Selection Box, set Focus to
932            Grid.
933            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
934            changes focus to the Selection when pressing "Alt-S".
935    
936            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
937            the text if not visible. The italic font sometimes exceeds the
938            rendering area.
939    
940    2003-05-21  Jonathan Coles   <[email protected]>
941    
942            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
943            to OnClose so that Thuban closes correctly.
944    
945            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
946            DockFrame.OnClose, not DockFrame._OnClose.
947    
948    2003-05-21  Jonathan Coles   <[email protected]>
949    
950            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
951            references to 'inf' and use new Range __init__ to pass floats
952            directly rather than converting them to strings first.
953            Fixes RTBug #1876.
954    
955            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
956            Use new Range ___init__ to pass floats.
957    
958            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
959            filename is a valid image file. Throw IOError otherwise.
960    
961            * Thuban/Model/range.py: Brought over new Range from SciParam that
962            is immutable and has an __init__ which can accept floats.
963    
964            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
965            into try block. AddLayer doesn't throw any exceptions anymore.
966            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
967            try block.
968    
969            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
970            the first item in choices. Fixes RTBug #1882.
971    
972            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
973            has gone to 0 which is a serious problem. abort.
974            (MapRenderer.draw_raster_layer): Catch IOError seperately and
975            print the error from GDAL.
976    
977            * Thuban/UI/tableview.py (TableGrid.__init__): Call
978            ToggleEventListeners to turn on listening.
979            (TableGrid.ToggleEventListeners): New. Turns event listening on
980            and off so as to prevent excessive messages.
981            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
982            to suppress excessive messages when selecting many rows.
983            Fixes RTBug #1880.
984    
985            * Thuban/UI/view.py: Added checks against if scale == 0. This
986            is a serious problem that can occur when an image without
987            geo data is loading and causes the map projection bounds to
988            go to infinity. Right now, the solution is to simply try
989            to recover.
990    
991            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
992            to set the MFILEReceiver attributes even if the data is NULL.
993    
994            * extensions/thuban/gdalwarp.cpp: Improved the error handling
995            and passed GDAL messages back up to the Python layer. Also
996            tried to fix some memory leaks that were present in the original
997            utility but didn't matter because the program aborted.
998    
999            * test/test_range.py: Copied over tests from SciParam. Removed
1000            tests against importing. Fixes RTBug #1867.
1001    
1002    2003-05-21  Bernhard Herzog  <[email protected]>
1003    
1004            * test/test_load.py: Remove unused imports and restructure the
1005            test code
1006            (LoadSessionTest): Split into one class for each test and turn
1007            LoadSessionTest itself into the base class for all such session
1008            tests.
1009            (ClassificationTest): New base class for load tests that test
1010            classifications
1011            (TestSingleLayer, TestLayerVisibility, TestClassification)
1012            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1013            for the individual tests
1014    
1015            * test/support.py (FileLoadTestCase.filename): New base class for
1016            file loading tests
1017    
1018    2003-05-21  Jan-Oliver Wagner <[email protected]>
1019    
1020            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1021            Mercator' to 'UTM Zone 32' as a more convenient example.
1022            Added 'Gauss Krueger Zone 6'.
1023    
1024            * Data/iceland_sample_raster.thuban: political polygon now
1025            filled transparent to have the raster image visible at once.
1026    
1027    2003-05-21  Frank Koormann  <[email protected]>
1028    
1029            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1030            OnClose() to keep in sync with extensions. Internally Thuban
1031            still uses "underscored" names.
1032    
1033    2003-05-20  Jonathan Coles   <[email protected]>
1034    
1035            This puts back Raster layer support. These layers support projections
1036            through the GDAL library. Currently, the CVS version is being used.
1037            There are no Debian packages available although this may change soon.
1038            A GDAL driver was extended to support writing to memory rather to
1039            files.
1040    
1041            There is still some work that needs to be done, such as some error
1042            handling when loading invalid images or when there is a problem
1043            projecting the image. This putback simply checks in the majority
1044            of the work.
1045    
1046            * setup.py: Add gdalwarp library extension.
1047    
1048            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1049            Defaults to False, but can be overridden by subclasses if they
1050            support classification.
1051            (RasterLayer): New. Defines a new layer that represents an
1052            image.
1053    
1054            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1055            tag handler.
1056            (SessionLoader.start_layer): Encode the filename.
1057            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1058            New. Supports reading a rasterlayer tag.
1059    
1060            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1061    
1062            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1063            get a string in Latin1. If we get such as string convert it to
1064            unicode first, otherwise leave if alone before encoding.
1065            (SessionSaver.write_layer): Add support for writing both Layers
1066            and RasterLayers.
1067    
1068            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1069            The right argument may not be a string, it could also be a Column.
1070    
1071            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1072            Make initial window size 600x400. Fixes RTBug #1872.
1073    
1074            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1075            the dialog is constructed so that we can support layers that
1076            do not have classifications.
1077            (Classifier._OnTry): Only build a classification if the layer
1078            supports one.
1079    
1080            * Thuban/UI/legend.py: Change all checks that a layer is an
1081            instance of Layer into checks against BaseLayer.
1082            (LegendTree.__FillTreeLayer): Only add children to a branch if
1083            the layer supports classification.
1084    
1085            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1086            MainWindow.OpenSession): Don't proceed with an action if the
1087            user chooses Cancel when they are asked to save changes.
1088            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1089            user to select an image file. Create a new RasterLayer and add
1090            it to the map.
1091    
1092            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1093            for rendering RasterLayer layers.
1094            (MapRenderer.draw_raster_layer): Actually method that calls
1095            the GDALWarp python wrapper and constructs an image from the
1096            data returned.
1097    
1098            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1099            Choices symbols to match those used in the table query method.
1100            Replace deprecated method calls on table with new method names.
1101    
1102            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1103            how small the scale can get. This still needs more testing.
1104    
1105            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1106            Provides a driver to output in .bmp format.
1107    
1108            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1109            New. Provides IO routines which write to memory, rather than a file.
1110    
1111            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1112            of the gdalwarp utility provided in GDAL. Added function calls
1113            that can be accessed from python.
1114    
1115            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1116            a raster layer.
1117    
1118            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1119            layer image data.
1120    
1121            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1122    
1123            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1124            tests associated with the raster layer code.
1125    
1126            * test/test_transientdb.py
1127            (TestTransientTable.test_auto_transient_table_query): Added a test
1128            for using a Column object as the "right" parameter to a query.
1129    
1130    2003-05-19  Frank Koormann  <[email protected]>
1131    
1132            * Thuban/version.py (get_changelog_date):
1133            Catch exceptions if ChangeLog does not exist.
1134    
1135            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1136    
1137    2003-05-19  Frank Koormann  <[email protected]>
1138    
1139            Extended version information for Thuban
1140    
1141            * Thuban/version.py: New, version information for Thuban: Last
1142            modification date and last ChangeLog entry date.
1143    
1144            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1145            information: Display Thuban, wxPython and Python version.
1146    
1147    2003-05-16  Bernhard Herzog  <[email protected]>
1148    
1149            * Thuban/Model/save.py: Remove some unused imports including the
1150            __future__ import for nested_scopes as Thuban relies on Python 2.2
1151            now.
1152            (XMLWriter.encode): Remove the special case for a None argument.
1153            In the saver encode is always called with a string argument.
1154    
1155    2003-05-16  Bernhard Herzog  <[email protected]>
1156    
1157            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1158            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1159            of the bug was that e.g. float("1.2") would fail. Thuban now
1160            requires 2.4.x.
1161            
1162    2003-05-16  Frank Koormann   <[email protected]>
1163    
1164            Printing enhancement and WMF export (under Win32)
1165    
1166            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1167            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1168            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1169            PrintRender.
1170    
1171            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1172            to fullfil information needed for PrinterRenderer.
1173            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1174            (MapCanvas.Print): Adapted to new MapPrintout.
1175            (OutputTransform): General calculations to transform from canvas
1176            coordinates to export/printing devices.
1177    
1178            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1179            new method_command to call ExportMap, with platform dependency (only
1180            __WXMSW__)
1181      
1182            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1183            of scalebar drawing area as new parameters.
1184            
1185            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1186    
1187            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1188            Update to extended scalebar.DrawScalebar header.
1189    
1190            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1191    
1192            * test/test_scalebar.py: Made test executable as standalone.
1193    
1194    2003-05-16  Bernhard Herzog  <[email protected]>
1195    
1196            * Thuban/Model/table.py (Table): Remove this compatibility alias
1197            for DBFTable.
1198    
1199            * test/test_table.py: Import DBFTable as Table because that alias
1200            doesn't exist anymore.
1201    
1202            * Thuban/UI/classgen.py: Remove some unused imports
1203    
1204    2003-05-14  Jonathan Coles   <[email protected]>
1205    
1206            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1207            Fix docstring.
1208            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1209            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1210            values of the supplied range to determine the beginning and end
1211            bounds of the generated classes.
1212    
1213            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1214            do not have a leading 0 (.5 is now accepted as well as 0.5).
1215    
1216            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1217            call to ClassGenerator.GenUniformDistribution.
1218    
1219            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1220            layout bug with the 'Projection' label.
1221    
1222            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1223    
1224            * test/test_range.py: New. Imported from SciParam.
1225    
1226    2003-05-12  Jonathan Coles   <[email protected]>
1227    
1228            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1229            to table.UniqueValues() with calls that retrieve all the values
1230            from the table. This will need to be replaced by a method on table
1231            which can simply return the list (perhaps more efficiently).
1232    
1233    2003-05-12  Jonathan Coles   <[email protected]>
1234    
1235            The return value of ClassGenerator.CalculateQuantiles has changed.
1236            Refer to the documentation for details.
1237    
1238            * test/test_classgen.py: Modified Quantile tests to use the
1239            new return values.
1240    
1241            * Thuban/Model/classgen.py
1242            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1243            use new return values from CalculateQuantiles to produce the correct
1244            range bounds in the Classification.
1245            (ClassGenerator.CalculateQuantiles): Add more comments describing
1246            the return values and parameters. Make minor adjustments to improve
1247            the legibility of the code. Fix problem with adjusted not being set
1248            in most cases.
1249    
1250    2003-05-12  Frank Koormann <[email protected]>
1251            
1252            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1253            and latin1. Fixes #1851 finally.
1254    
1255    2003-05-09  Jonathan Coles   <[email protected]>
1256    
1257            * test/test_classgen.py: New. Tests the Quantile algorithm.
1258    
1259            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1260            Clean up debugging statement, add comments, fix a small bug in the
1261            returned adjusted percentiles.
1262            
1263    2003-05-09  Jonathan Coles   <[email protected]>
1264    
1265            Introduces Range class from SciParam into the ClassGroupRange class,
1266            and such ranges can now be saved and loaded from disk.
1267    
1268            Quantiles are now available in the Classification Generator.
1269    
1270            Initial support for building Queries on a table. Doesn't do anything
1271            but run some tests.
1272    
1273            * Thuban/Model/classification.py: Explicit imports.
1274            (ClassGroupRange): Use the Range class to store the underlying
1275            range information. The interface remains the same, except for
1276            GetRange(), and you can also supply a Range object as the min
1277            parameter to SetRange or __init__.
1278    
1279            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1280            string appropriately for use in Thuban. Fixes RTbug #1851.
1281            (SessionLoader.end_projection): Handle the context of the
1282            projection tag a bit better by looking at what objects are not
1283            None. There was an assumption that a projection tag for a map
1284            could occur before any layers.
1285            (SessionLoader.start_clrange): Provide backward compatibility for
1286            reading min/max values as well as the new range parameter.
1287    
1288            * Thuban/Model/map.py: Explicit imports.
1289    
1290            * Thuban/Model/resource.py: Import _.
1291            (ProjFileSaver.write): write header using projfile.dtd.
1292    
1293            * Thuban/Model/save.py: Explicit imports.
1294            (XMLWriter.encode): New. Encode the given string from a format
1295            used by Thuban into UTF-8. Fixes RTbug #1851.
1296    
1297            * Thuban/UI/classgen.py: Explicit imports.
1298            (ClassGenDialog.__init__): Clean up the code and add support
1299            for Quantiles.
1300            (ClassGenDialog.OnOK): Add support for Quantiles.
1301            (GenQuantilesPanel): New. Input panel for Quantiles.
1302            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1303            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1304    
1305            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1306    
1307            * Thuban/UI/classifier.py: Explicit imports.
1308            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1309            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1310    
1311            * Thuban/UI/legend.py: Explicit imports.
1312    
1313            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1314            a Table menu and associated method calls.
1315            (MainWindow.choose_color): Removed. No longer needed.
1316    
1317            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1318            should be disabled if no projection is selected in the available
1319            list.
1320    
1321            * Thuban/UI/renderer.py: Explicit imports.
1322    
1323            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1324            with correctly selecting the rows and issuing the right events.
1325            Be sure to call Skip() to allow the grid to do some of its own
1326            handling which allows the rows to actually be selected.
1327            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1328            selecting multiple shapes.
1329            (LayerTableFrame): Support for building Queries.
1330            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1331    
1332            * Thuban/UI/tree.py: Explicit imports.
1333    
1334            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1335            table view can call it.
1336    
1337            * test/test_classification.py: Explicit imports.
1338            (TestClassification.test_ClassGroupRange): Fix test for new
1339            Range class.
1340    
1341            * Doc/thuban.dtd: Add range parameter for clrange.
1342    
1343            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1344            object in ClassGroupRange, and also uesd for inputting ranges in
1345            the classifer table and elsewhere.
1346    
1347            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1348            yet.
1349    
1350    2003-05-09  Frank Koormann <[email protected]>
1351    
1352            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1353    
1354    2003-05-08  Frank Koormann <[email protected]>
1355    
1356            Coding style updates
1357    
1358            * test/test_scalebar.py: Replaced tab indentation by spaces.
1359    
1360            * Thuban/UI/scalebar.py: Explicit imports.
1361    
1362    2003-05-08  Frank Koormann <[email protected]>
1363    
1364            * Thuban/UI/scalebar.py
1365            (ScaleBar.DrawScalebar): Format string bug fixed.
1366    
1367    2003-05-08  Frank Koormann <[email protected]>
1368    
1369            Reorganization of scalebar component (no wx in Thuban/Model)
1370    
1371            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1372            (deriveInterval):
1373            Calculate scalebar interval and unit which fits in width for scale.
1374            (roundInterval): Round float.
1375    
1376            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1377    
1378            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1379    
1380            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1381    
1382    2003-05-08  Frank Koormann <[email protected]>
1383    
1384            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1385            Initialize ScaleBar with canvas.map
1386    
1387            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1388            round intervals to display smarter lengths
1389            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1390            layer. If the maps has no projection applied grey the scalebar.
1391    
1392    2003-05-07  Frank Koormann <[email protected]>
1393            
1394            Basic Scalebar features added.
1395    
1396            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1397    
1398            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1399            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1400            and the renderer.
1401    
1402            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1403    
1404            * Thuban/UI/messages.py: SCALE_CHANGED added.
1405    
1406    2003-05-07  Bernhard Herzog  <[email protected]>
1407    
1408            * Thuban/Model/session.py (Session.__init__): New instance
1409            variable shapestores to hold a list of all open shapestore objects
1410            (Session.ShapeStores): New. Accessor method for the shapestores
1411            list.
1412            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1413            Internal methods to maintain the shapestores list.
1414            (Session.Tables): New. Return all tables open in the session.
1415            (Session.OpenShapefile): Insert the new ShapeStore into the
1416            shapestores list.
1417    
1418            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1419            tests for ShapeStores and Tables
1420            (TestSessionWithContent.test_shape_stores)
1421            (TestSessionWithContent.test_tables): New. Test cases for
1422            ShapeStores and Tables
1423    
1424    2003-05-07  Bernhard Herzog  <[email protected]>
1425    
1426            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1427            Add comments about the optimizations used.
1428            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1429            Implement the ReadValue table interface method.
1430    
1431            * test/test_transientdb.py
1432            (TestTransientTable.run_iceland_political_tests)
1433            (TestTransientTable.test_transient_joined_table): Add tests for
1434            ReadValue
1435    
1436    2003-05-07  Frank Koormann <[email protected]>
1437    
1438            * Resources/Bitmaps/fulllayerextent.xpm,
1439            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1440            new icons.
1441    
1442    2003-05-06  Bernhard Herzog  <[email protected]>
1443    
1444            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1445            New. Simply delegate to the transient table's version.
1446    
1447            * test/test_transientdb.py
1448            (TestTransientTable.test_auto_transient_table_query): New. Test
1449            case for AutoTransientTable's SimpleQuery
1450    
1451    2003-05-06  Bernhard Herzog  <[email protected]>
1452    
1453            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1454            Implement a simple query method for the query dialog
1455            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1456            the row index or shapeid.
1457            (TransientTable.create): Insert the right value of the row index
1458            (TransientJoinedTable.create): Copy the row index of the left
1459            table to the joined result table
1460    
1461            * test/test_transientdb.py
1462            (TestTransientTable.test_transient_table_read_twice): Fix
1463            doc-string
1464            (TestTransientTable.test_transient_table_query): New. Test for the
1465            SimpleQuery method
1466    
1467    2003-05-06  Bernhard Herzog  <[email protected]>
1468    
1469            Convert all table users to use the new table interface. This only
1470            covers Thuban itself, not GREAT-ER or other applications built on
1471            Thuban yet, so the compatibility interface stays in place for the
1472            time being but it now issues DeprecationWarnings.
1473    
1474            Finally, the new Table interface has a new method, HasColumn.
1475    
1476            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1477            issue deprecation warnings when they're. The warnings refer to the
1478            caller of the method.
1479            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1480            for the deprecation warnings
1481    
1482            * test/test_table.py: Ignore the deprecation warnings for the old
1483            table in the tests in this module. The purpose of the tests is to
1484            test the old interface, after all.
1485    
1486            * test/test_transientdb.py
1487            (TestTransientTable.run_iceland_political_tests): Use the
1488            constants for the types. Add a test for HasColumn
1489            (TestTransientTable.test_transient_joined_table): Adapt to new
1490            table interface. Add a test for HasColumn
1491            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1492            table interface
1493    
1494            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1495            Adapt to new table interface
1496    
1497            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1498            new table interface
1499    
1500            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1501            (RecordTable.SetTable): Adapt to new table interface
1502    
1503            * Thuban/UI/classifier.py (Classifier.__init__)
1504            (Classifier.__init__): Adapt to new table interface
1505    
1506            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1507            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1508            to new table interface
1509    
1510            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1511            (AutoTransientTable.HasColumn): Implement the new table interface
1512            method
1513            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1514            (AutoTransientTable.UniqueValues): Adapt to new table interface
1515    
1516            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1517            Adapt to new table interface
1518    
1519            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1520            simplify opening shapefiles a bit easier.
1521            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1522            (TestLayer.test_point_layer): Use the new helper method
1523            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1524            method
1525    
1526            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1527            the new table method
1528    
1529            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1530            Test for the new table method HasColumn
1531    
1532    2003-05-06  Jonathan Coles   <[email protected]>
1533    
1534            Addresses the "Selection Extent" wish of RTbug #1787.
1535    
1536            * Resources/Bitmaps/fulllayerextent.xpm,
1537            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1538            extent. These are just place holders for the real bitmaps.
1539    
1540            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1541            calculate the bounding box once (the first time compute_bbox() is
1542            called).
1543            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1544            the bounding box for the shapes in lat/long coordinates.
1545    
1546            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1547            option.
1548            (MainWindow.has_selected_shapes): New. Returns true if there are
1549            any selected shapes.
1550            (MainWindow.FullSelectionExtent): New. Calls
1551            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1552            (_has_selected_shapes): New. Returns true if there are any
1553            selected shapes.
1554    
1555            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1556            true if there are any selected shapes.
1557    
1558            * Thuban/UI/view.py (MapCanvas): Added delegated method
1559            HasSelectedShapes.
1560            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1561            shapes on the canvas using the map projection (if any).
1562    
1563            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1564            for Layer.ShapesBoundingBox().
1565    
1566    2003-05-06  Bernhard Herzog  <[email protected]>
1567    
1568            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1569    
1570    2003-05-05  Jonathan Coles   <[email protected]>
1571    
1572            Addresses the "Full Layer Extent" wish of RTbug #1787.
1573    
1574            * Resources/Projections/defaults.proj: Added UK National Grid.
1575    
1576            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1577            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1578            when the user selects the menu option.
1579    
1580            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1581            scales the given layer on the canvas using the map projection.
1582    
1583    2003-05-05  Bernhard Herzog  <[email protected]>
1584    
1585            Convert the table implementations to a new table interface. All
1586            tables use a common mixin class to provide backwards compatibility
1587            until all table users have been updated.
1588    
1589            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1590            provide backwards compatibility for table classes implementing the
1591            new interface
1592            (DBFTable, MemoryTable): Implement the new table interface. Use
1593            OldTableInterfaceMixin as base for compatibility
1594            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1595            and MemoryTable resp.
1596    
1597            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1598            the new table interface.
1599    
1600            * test/test_memory_table.py: New. Test cases for the MemoryTable
1601            with the new table interface.
1602    
1603            * test/test_table.py: Document the all tests in this file as only
1604            for backwards compatibility. The equivalent tests for the new
1605            interface are in test_memory_table.py and test_dbf_table.py
1606            (MemoryTableTest.test_read): field_info should be returning tuples
1607            with four items
1608            (MemoryTableTest.test_write): Make doc-string a more precise.
1609    
1610            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1611            table interface. Derive from from OldTableInterfaceMixin for
1612            compatibility.
1613            (TransientTableBase.create): New intance variable column_map to
1614            map from names and indices to column objects
1615            (TransientTable.create): Use the new table interface of the input
1616            table
1617            (AutoTransientTable): Convert to new table interface. Derive from
1618            from OldTableInterfaceMixin for compatibility.
1619            (AutoTransientTable.write_record): Removed. It's not implemented
1620            yet and we still have to decide how to handle writing with the new
1621            table and data framework.
1622    
1623            * test/test_transientdb.py
1624            (TestTransientTable.run_iceland_political_tests)
1625            (TestTransientTable.test_transient_joined_table): Use the new
1626            table interface
1627    
1628    2003-05-05  Jonathan Coles   <[email protected]>
1629    
1630            This is namely a collection of UI updates to improve user interactivity.
1631            Tabbing between controls now exists and you can use ESC to close dialog
1632            boxes; ENTER will active the default button.
1633    
1634            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1635            order that the controls are created so that tabbing works correctly.
1636            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1637            wxDialog can handle the default button correctly.
1638            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1639            same reasons as for OnOK.
1640            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1641            when we ask the table for the maximum/minimum values of a field
1642            which could take a very long time.
1643    
1644            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1645            order that the controls are created so that tabbing works correctly.
1646            (SelectPropertiesDialog.__init__): Rearrange the order that the
1647            controls are created so that tabbing works correctly.
1648    
1649            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1650            to derive from a wxDialog but behave like the original implementation
1651            which was derived from a wxFrame. wxDialog provides useful key
1652            handling functionality like ESC calling OnCancel and ENTER calling
1653            OnOK which is lost with wxFrame.
1654    
1655            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1656            new dialogs.
1657    
1658            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1659            order that the controls are created so that tabbing works correctly.
1660            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1661            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1662            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1663            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1664            can provide the "UK National Grid" as a default projection.
1665            (UTMPanel.__init__): Rearrange the order that the controls are
1666            created so that tabbing works correctly.
1667    
1668    2003-05-05  Bernhard Herzog  <[email protected]>
1669    
1670            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1671            (project_point): If a map projection but no layer projection is
1672            given, convert degrees to radians before applying the map
1673            projection.
1674    
1675            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1676            (TableGrid.allow_messages): New methods to make it possible to
1677            inhibit message sending.
1678            (TableGrid.issue): Only send the message if not inhibited.
1679            (LayerTableGrid.select_shape): Use the new methods to make sure
1680            that no ROW_SELECTED message is sent while we're updating the
1681            selected rows to match the selected shapes.
1682    
1683    2003-05-02  Jan-Oliver Wagner <[email protected]>
1684    
1685            Implementation of MemoryTable.
1686    
1687            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1688            implementation that operates on a list of tuples. All of the data
1689            are kept in the memory.
1690    
1691            * test/test_table.py (MemoryTableTest): New.
1692    
1693            * test/test_transientdb.py (SimpleTable): Removed.
1694            (TestTransientTable.test_transient_joined_table,
1695            (TestTransientTable.test_transient_table_read_twice): Replaced
1696            SimpleTable by MemoryTable.
1697    
1698    2003-04-30  Jonathan Coles   <[email protected]>
1699    
1700            * Data/iceland_sample.thuban: Now contains correct projections
1701            for each of the layers.
1702    
1703            * Resources/Projections/defaults.proj: Geographic projection
1704            contains unit conversion parameter.
1705    
1706    2003-04-30  Jonathan Coles   <[email protected]>
1707    
1708            The most important part of this putback is the projection changes.
1709            It should now be possible to specify the projection that a layer
1710            is in and then specify a different projection for the map. The
1711            projection dialog has an extra parameter for a geographic projection
1712            which lets the user select if the input is in degrees or radians.
1713    
1714            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1715            to say that the parameter is a tuple of unprojected
1716            points (which is what the callers to this method were assuming).
1717            Also, since the points are unprojected we need to projected them.
1718    
1719            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1720            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1721            groups are selected, move the layer up/down. Fixes RTbug #1833.
1722    
1723            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1724    
1725            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1726            parameter in call to SetClientData.
1727            (GeoPanel): Add support for selecting the units that the
1728            source data is in (Radians or Degrees).
1729    
1730            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1731            the rendering loop by reducing the number of if's, removing the
1732            unnecessary try/except block, and checking if the old group
1733            is the same as the new one (which happens a lot if there is
1734            no classification, or lots of shapes are in the same group).
1735    
1736            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1737            around the redraw routine to try to catch problems that the user
1738            may create by selecting invalid projections for the data set and
1739            map. Clears the display if there are any problems and prints the
1740            error.
1741            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1742            rectangle.
1743    
1744            * extensions/thuban/wxproj.cpp (project_point): First invert the
1745            supplied point (which should be in projected coordinates) using
1746            the layer's projection and then project the point using the
1747            map's projection.
1748            (project_points): Use project_point() to project each point.
1749    
1750    2003-04-30  Jan-Oliver Wagner <[email protected]>
1751    
1752            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1753            don't set the Classification to None if the classfication field
1754            is None (ie only a DEFAULT).
1755    
1756    2003-04-30  Bernhard Herzog  <[email protected]>
1757    
1758            * Thuban/UI/view.py: Fix some typos.
1759    
1760            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1761            not pop up the dialog if the selection becomes empty (this could
1762            happen if e.g. a new selection is opened while the identify tool
1763            is active and dialog had been closed)
1764    
1765    2003-04-30  Bernhard Herzog  <[email protected]>
1766    
1767            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1768            instance variable read_record_last_result
1769            (TransientTableBase.read_record): Make sure reading the same
1770            record twice works. The implementation uses the new instance
1771            variable read_record_last_result
1772    
1773            * test/test_transientdb.py
1774            (TestTransientTable.test_transient_table_read_twice): New test
1775            case for the above bug-fix.
1776    
1777    2003-04-29  Jonathan Coles   <[email protected]>
1778    
1779            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1780    
1781            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1782    
1783            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1784            (ClassTable.SetValueAsCustom): Rename keyword argument in
1785            ClassGroup* constructors to match argument name.
1786    
1787    2003-04-29  Bernhard Herzog  <[email protected]>
1788    
1789            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1790            transient DB if it exists to make sure it doesn't leave a journal
1791            file in the temp directory.
1792    
1793            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1794            self.conn to None after closing the connection to make sure it's
1795            not closed twice
1796    
1797    2003-04-29  Jonathan Coles   <[email protected]>
1798    
1799            Add a visible parameter in the layer XML tag. The default value is
1800            "true". If anything other than "false" is specified we also assume
1801            "true". Addresses RTbug #1025.
1802    
1803            * Doc/thuban.dtd: Add visible parameter to a layer.
1804    
1805            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1806            of visible from 1 to True.
1807            (Layer.__init__): Change default value of visible from 1 to True.
1808    
1809            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1810            parameter.
1811    
1812            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1813            parameter.
1814    
1815            * test/test_load.py: Add new test data contents_test_visible.
1816            (LoadSessionTest.setUp): save test data.
1817            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1818            is loaded correctly.
1819    
1820            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1821            for saving an invisible layer.
1822    
1823    2003-04-29  Jonathan Coles   <[email protected]>
1824    
1825            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1826            legend dialog box and tell it to change its map to the one
1827            supplied to SetMap(). Fixes RTbug #1770.
1828    
1829    2003-04-29  Bernhard Herzog  <[email protected]>
1830    
1831            Next step of table implementation. Introduce a transient database
1832            using SQLite that some of the data is copied to on demand. This
1833            allows us to do joins and other operations that require an index
1834            for good performance with reasonable efficiency. Thuban now needs
1835            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1836            haven't tested that.
1837            
1838            * Thuban/Model/transientdb.py: New. Transient database
1839            implementation.
1840    
1841            * test/test_transientdb.py: New. Tests for the transient DB
1842            classes.
1843    
1844            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1845            classes to help automatically remove temporary files and
1846            directories.
1847            (Session.__init__): New instance variables temp_dir for the
1848            temporary directory and transient_db for the SQLite database
1849            (Session.temp_directory): New. Create a temporary directory if not
1850            yet done and return its name. Use AutoRemoveDir to have it
1851            automatically deleted
1852            (Session.TransientDB): Instantiate the transient database if not
1853            done yet and return it.
1854    
1855            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1856            AutoTransientTable so that data is copied to the transient DB on
1857            demand.
1858            (SimpleStore): New class that simply combines a table and a
1859            shapefile
1860    
1861            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1862            DBFTable and update its doc-string to reflect the fact that this
1863            is only the table interface to a DBF file. Table is now an alias
1864            for DBFTable for temporary backwards compatibility.
1865    
1866            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1867            the last reference to the session goes away so that the temporary
1868            files are removed properly.
1869    
1870            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1871            reference to the session to make sure the temporary files are
1872            removed.
1873    
1874    2003-04-29  Bernhard Herzog  <[email protected]>
1875    
1876            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1877            the __parser instance variable into a normal local variable in
1878            read. It's only used there and read will never be called more than
1879            once. Plus it introduces a reference cycle that keeps can keep the
1880            session object alive for a long time.
1881    
1882    2003-04-29  Jonathan Coles   <[email protected]>
1883    
1884            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1885            Projection an immutable item. Fixes RTbug #1825.
1886            (Projection.__init__): Initialize instance variables here.
1887            (ProjFile.Replace): New. Replace the given projection object with
1888            the new projection object. This solves the problem of needing the
1889            mutator Projection.SetProjection() in the ProjFrame class and
1890            allows a projection to change parameters without changing its
1891            location in the file.
1892    
1893            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1894            be of type wxSAVE and should verify overwriting a file.
1895    
1896            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1897            ProjFile.Replace() method instead of the mutator
1898            Projection.SetProjection(). Also requires that we reassign the
1899            client data to the new projection.
1900    
1901            * test/test_proj.py (TestProjection.test): Test GetName() and
1902            GetAllParameters()
1903            (TestProjFile.test): Remove tests for Set*() methods. Add tests
1904            for Replace().
1905    
1906    2003-04-25  Jonathan Coles   <[email protected]>
1907    
1908            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1909            to save the name of the projection.
1910    
1911            * test/test_save.py (SaveSessionTest.testLayerProjection): New
1912            test to verify layer projections are saved correctly.
1913    
1914    2003-04-25  Jonathan Coles   <[email protected]>
1915    
1916            * Thuban/Model/proj.py (Projection.SetName): Set the name
1917            to "Unknown" if name is None.
1918            (Projection.SetAllParameters): New. Set the projection's
1919            parameter list to the one supplied.
1920            (Projection.SetProjection): New. Set the projection's
1921            properties to those of the supplied Projection.
1922    
1923            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1924            the dialog title to include the map's title.
1925            (MainWindow.LayerProjection): Set the dialog title to include
1926            the layer's title.
1927    
1928            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1929            error dialogs into a single method call.
1930            (ProjFrame.__VerifyButtons): Add more states to check.
1931            (ProjFrame.__GetProjection): Return the current state of an
1932            edited projection or None.
1933            (ProjFrame.__FillAvailList): Remove checks for states that
1934            shouldn't exist.
1935            (ProjFrame._OnNew): Clear all selected items and supply
1936            a projection panel if necessary.
1937    
1938            * test/test_proj.py (TestProjFile.test): Add tests for
1939            ProjFile.SetAllParameters, ProjFile.SetProjection,
1940            ProjFile.SetName.
1941    
1942    2003-04-25  Jonathan Coles   <[email protected]>
1943    
1944            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1945            takes an optional argument to select the current projection.
1946            This does not guarantee that the item is visible due to
1947            limited wxWindows functionality. Fixes RTBug #1821.
1948    
1949    2003-04-25  Jonathan Coles   <[email protected]>
1950    
1951            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
1952            the projection name and use it when constructing the Projection
1953            object.
1954    
1955            * Thuban/Model/proj.py (Projection.__init__): Change the default
1956            value for 'name' to None and then test if name is equal to None
1957            in the body of the constructor. This way the caller doesn't have to
1958            know what the default value should be. Namely, useful in load.py
1959            where we have to pick a default value if the 'name' parameter
1960            doesn't exist in the XML file.
1961    
1962            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
1963            Tests a file where a layer has a projection.
1964    
1965    2003-04-25  Jonathan Coles   <[email protected]>
1966    
1967            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
1968            tree for projection information.
1969    
1970            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
1971            XMLReader.GetFileName.
1972            (SessionLoader): Added support for loading projection tags that
1973            appear inside a layer.
1974    
1975            * Thuban/Model/proj.py (ProjFile): Document the class. Move
1976            back to using a list because the order of the projections in
1977            the file is important to maintain. Fixes RTbug #1817.
1978    
1979            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
1980            to ProjFile.GetFilename.
1981    
1982            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
1983            information.
1984    
1985            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
1986            ProjFrame._OnSaveAs. Removed old dead code from previous
1987            implementation.
1988            (ProjFrame._OnExport): Add support for exporting more than one
1989            projection to a single file.
1990            (ProjFrame.__FillAvailList): use string formatting (% operator)
1991            to build strings that are (partly) translated. Fixes RTbug #1818.
1992    
1993            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
1994            class.
1995    
1996    2003-04-24  Bernhard Herzog  <[email protected]>
1997    
1998            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
1999    
2000            * po/fr.po: New. French translation by Daniel Calvelo Aros
2001    
2002            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2003            empty strings.
2004    
2005    2003-04-24  Jonathan Coles   <[email protected]>
2006    
2007            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2008            implement the interface that the ProjFrame dialog expects.
2009    
2010            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2011            name of the projection to be changed.
2012            (ProjFile): Use a dictionary instead of a list so that removing
2013            projections is easier and we are sure about uniqueness.
2014            (ProjFile.Remove): Remove the given projection object.
2015    
2016            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2017            Return a list with only one projection file instead of searching for
2018            any projection file. This simplifies many things if the user can
2019            only have one system file and one user file.
2020    
2021            * Thuban/UI/classgen.py: Change all references to
2022            genCombo to genChoice.
2023    
2024            * Thuban/UI/mainwindow.py: Add a Projection option under the
2025            layer menu.
2026            (MainWindow.LayerProjection): New. Open up a projection window
2027            for a layer.
2028    
2029            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2030            laid out. Use three panels instead of one. One for the list of
2031            projections, one for the edit controls, and one for the buttons.
2032            Fixed resizing problems so that the dialog resizes correctly
2033            when the projection panel changes. Added import/export, save, and
2034            new buttons/functionality.
2035    
2036    2003-04-24  Bernhard Herzog  <[email protected]>
2037    
2038            First step towards table management. Introduce a simple data
2039            abstraction so that we replace the data a layer uses more easily
2040            in the next step.
2041    
2042            * Thuban/Model/data.py: New file with a simple data abstraction
2043            that bundles shapefile and dbffile into one object.
2044    
2045            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2046            open shapefiles and return a shape store object
2047    
2048            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2049            object instead of a shapefile filename. This introduces a new
2050            instance variable store holding the datastore. For intermediate
2051            backwards compatibility keep the old instance variables.
2052            (open_shapefile): Removed. No longer needed with the shape store.
2053            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2054            get the shape store used by a layer.
2055            (Layer.Destroy): No need to explicitly destroy the shapefile or
2056            table anymore.
2057    
2058            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2059            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2060            open shapefiles
2061    
2062            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2063            session's OpenShapefile method to open shapefiles
2064    
2065            * test/test_classification.py
2066            (TestClassification.test_classification): Use the session's
2067            OpenShapefile method to open shapefiles and build the filename in
2068            a more platform independed way
2069    
2070            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2071            Implement to have a session to use in the tests
2072            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2073            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2074            session's OpenShapefile method to open shapefiles
2075            (TestLayerLegend.setUp): Instantiate a session so that we can use
2076            it to open shapefiles.
2077            (TestLayerLegend.tearDown): Make sure that all references to
2078            layers and session are removed otherwise we may get a resource
2079            leak
2080    
2081            * test/test_map.py (TestMapAddLayer.test_add_layer)
2082            (TestMapWithContents.setUp): Instantiate a session so that we can
2083            use it to open shapefiles.
2084            (TestMapWithContents.tearDown): Make sure that all references to
2085            layers, maps and sessions are removed otherwise we may get a
2086            resource leak
2087            ("__main__"): use support.run_tests() so that more info about
2088            uncollected garbage is printed
2089    
2090            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2091            session's OpenShapefile method to open shapefiles
2092            ("__main__"): use support.run_tests() so that more info about
2093            uncollected garbage is printed
2094    
2095            * test/test_selection.py (TestSelection.tearDown): Make sure that
2096            all references to the session and the selection are removed
2097            otherwise we may get a resource leak
2098            (TestSelection.get_layer): Instantiate a session so that we can
2099            use it to open shapefiles.
2100            ("__main__"): use support.run_tests() so that more info about
2101            uncollected garbage is printed
2102    
2103            * test/test_session.py (TestSessionBase.tearDown)
2104            (TestSessionWithContent.tearDown): Make sure that all references
2105            to the session and layers are removed otherwise we may get a
2106            resource leak
2107            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2108            method to open shapefiles
2109    
2110    2003-04-24  Jonathan Coles   <[email protected]>
2111    
2112            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2113            if the file_or_filename object had the 'read' attribute.
2114    
2115    2003-04-23  Jonathan Coles   <[email protected]>
2116    
2117            * Thuban/Model/resource.py: Fixes RTbug #1813.
2118            (ReadProjFile): Add documentation about which exceptions are raised.
2119            Always pass the exceptions up to the caller.
2120            (GetProjFiles): If the directory can't be read return an empty list.
2121            If any of the proj files can't be read skip that file and go
2122            on to the next one.
2123    
2124            * test/test_proj.py: Added test cases to handle nonexistent files,
2125            unreadable files, and files that don't parse correctly.
2126    
2127    2003-04-23  Jonathan Coles   <[email protected]>
2128    
2129            Projection dialog. Allows the user to select from a list
2130            of projection templates and optionally edit them and save new ones.
2131    
2132            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2133            (ProjPanel): Base class for projection specific panels.
2134            (TMPanel): Projection panel for Transverse Mercartor.
2135            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2136            (LCCPanel): Projection panel for Lambert Conic Conformal.
2137            (GeoPanel): Projetion panel for Geographic Projection.
2138    
2139    2003-04-23  Jonathan Coles   <[email protected]>
2140    
2141            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2142            promote symmetry. There now exists XMLReader and XMLWriter.
2143            (XMLReader.read): New. Call to read the given file descriptor or
2144            filename.
2145            (XMLReader.close): New. Make sure the file is closed.
2146            (XMLReader.GetFileName): New. Return just the file name that is being
2147            read from.
2148            (XMLReader.GetDirectory): New. Return just the directory of the file
2149            that is being read.
2150            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2151            the names of functions to call as the XML tree is parsed.
2152            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2153            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2154            (SessionLoader): Removed class variables start_dispatcher and
2155            end_dispatcher since this functionality is now part of a class
2156            instance. Fixes RTbug #1808.
2157            (SessionLoader.__init__): Add dispatcher functions.
2158            (load_xmlfile): Code was moved into the XMLReader.read().
2159            (load_session): Use modified SessionLoader.
2160    
2161            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2162            map's projection.
2163    
2164            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2165            GetAllParameters.
2166            (Projection.GetParameter): Returns the value for the given parameter.
2167    
2168            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2169            (GetProjFiles): Renamed from GetProjections. Now returns a list
2170            of ProjFile objects.
2171            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2172            a list of ProjFile objects whose files are not user defined.
2173            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2174            list of ProjFile objects whose files are user defined.
2175            (ProjFileReader): Extend new XMLReader.
2176    
2177            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2178            promote symmetry.
2179    
2180            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2181            control instead of a wxComboBox. wxChoice controls do not generate
2182            events as the uses highlights possible choices which fixes problems
2183            with resizing the dialog when the use selects an option.
2184    
2185            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2186            control instead of a wxComboBox.
2187    
2188            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2189            dialog.
2190    
2191            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2192            method.
2193    
2194    2003-04-22  Bernhard Herzog  <[email protected]>
2195    
2196            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2197            constants
2198    
2199            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2200            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2201    
2202    2003-04-17  Bernhard Herzog  <[email protected]>
2203    
2204            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2205            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2206            anymore.
2207            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2208            (Layer.ShapeType, Layer.Shape): No need to call
2209            self.open_shapefile since it's always called in __init__
2210    
2211            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2212            In wxPython 2.4 there's no need to extend MainLoop anymore since
2213            wxPython itself makes sure OnExit is called.
2214    
2215    2003-04-16  Jonathan Coles   <[email protected]>
2216    
2217            Initial putback of projection management code. Includes new
2218            classes to read and write projection files. The current load
2219            and save classes were abstracted a bit so they could be reused.
2220            The Projection class was extended to provide new methods and
2221            have a name.
2222    
2223            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2224            general XML reading methods that were part of ProcessSession.
2225    
2226            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2227            name.
2228            (ProjFile): New. Represents a file that contains projection
2229            information.
2230    
2231            * Thuban/Model/resource.py: New. Contains general utilities
2232            for read and writing projection files.
2233    
2234            * Thuban/Model/save.py (XMLSaver): New. Contains all the
2235            general XML writing methods that were part of SessionSaver.
2236            (SessionSaver): Renamed from Saver.
2237    
2238            * test/test_proj.py: New test cases for the projection
2239            file read and write functions.
2240    
2241    2003-04-16  Jonathan Coles   <[email protected]>
2242    
2243            * Thuban/Model/classification.py: Use repr() around values
2244            in the ClassGroup*.__repr__() methods so it is clearer when
2245            a value is a string and when it is a number.
2246    
2247            * test/test_load.py: Rework the classification test to test
2248            that we can load old files.
2249            (testLabels): Test a file where the groups have labels.
2250    
2251    2003-04-16  Bernhard Herzog  <[email protected]>
2252    
2253            Safer implementation of the performance enhancements of the
2254            low-level renderer:
2255            
2256            * extensions/thuban/wxproj.cpp (extract_projection)
2257            (extract_pointer): Rename extract_projection to extract_pointer
2258            and redefine its purpose to return the pointer stored in a CObject
2259            returned by the object's cobject method. Update all callers.
2260            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2261            handling of these low-level parameters so that each s_draw_info
2262            instance is handled as a CObject at python level that also
2263            contains real references to the actual python objects which
2264            contain the values in the struct. Add free_draw_info as the
2265            destructor.
2266            (draw_polygon_shape): Add the py_draw_info parameter which must a
2267            cobject containing an s_draw_info pointer.
2268    
2269            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2270            method to instantiat the low-level render parameter
2271            (MapRenderer.draw_shape_layer): Use the new method. Remove some
2272            commented out code.
2273            (MapRenderer.draw_polygon_shape): Make the first parameter not the
2274            layer but the low-level render parameter
2275            (ScreenRenderer.draw_shape_layer): Use the low-level render
2276            parameter.
2277    
2278    2003-04-15  Jonathan Coles   <[email protected]>
2279    
2280            * Thuban/Model/classification.py: Implemented __repr__ for
2281            the ClassGroup* classes to make debugging a bit easier.
2282            (ClassGroup.SetLabel): Check that the string is an instance
2283            of StringTypes not StringType. Accounts for Unicode strings.
2284    
2285            * Thuban/Model/color.py: Implemented __repr__ to make
2286            debugging a bit easier.
2287    
2288            * Thuban/Model/save.py (Saver.write_classification): Need to
2289            save the group label.
2290    
2291            * test/test_load.py (testClassification): New. Loads the
2292            iceland_sample_test.thuban file and checks if it was loaded
2293            correctly.
2294    
2295    2003-04-15  Jonathan Coles   <[email protected]>
2296    
2297            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2298            to improve rendering performance by initializing the variables
2299            that are not change each time draw_polygon_shape() is called.
2300            The values are stored in a global struct draw_info.
2301            (draw_polygon_shape): Removed initialization code that is
2302            now in draw_polygon_init().
2303    
2304            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2305            drawing initialization call to draw_polygon_init()
2306            (MapRenderer.draw_polygon_shape): Use new signature of
2307            draw_polygon_shape.
2308    
2309            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2310            weirdness by setting the range to (1, maxint).
2311    
2312            * Thuban/Model/classification.py (ClassGroupProperties): Make
2313            instance variables private and optimize comparison operator
2314            by first checking if the color references are the same.
2315            (ClassGroupSingleton): Make instance variables private.
2316            (ClassGroupRange): Make instance variables private.
2317    
2318            * HOWTO-Release: Filled in missing steps for releasing packages.
2319    
2320    2003-04-15  Bernhard Herzog  <[email protected]>
2321    
2322            First stab at internationalized messages:
2323    
2324            * Thuban/__init__.py (_): Implement the translation function for
2325            real using the python gettext module.
2326    
2327            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2328            translate empty strings.
2329    
2330            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2331            Add a missing space to a warning message
2332    
2333            * po/README: New. Notes about the management of the translation
2334            files.
2335    
2336            * po/Makefile: New. Makefile to help manage the translation files.
2337    
2338            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2339    
2340            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2341            translations and support files in po/
2342    
2343            * setup.py (data_files): Add the *.mo files to the data_files too
2344    
2345            * README: Add note about the translations when building from CVS
2346    
2347    2003-04-14  Jonathan Coles   <[email protected]>
2348    
2349            * Thuban/UI/dock.py: Fixes some window resizing problems most
2350            noticable under windows. Always assume the button bitmaps will
2351            be there. Code clean up.
2352            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2353            images for the dock/undock button to the same images.
2354            Work around for RTbug #1801.
2355    
2356            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2357            be allowed to grow within the sizer. Fixes a bug under Windows
2358            where the toolbar wasn't being drawn.
2359    
2360    2003-04-14  Frank Koormann   <[email protected]>
2361    
2362            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2363            Updated design to try to make the button functionality more
2364            transparent.
2365    
2366    2003-04-14  Jonathan Coles   <[email protected]>
2367    
2368            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2369            finalize the intialization of the panel.
2370    
2371            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2372            creation of the panel. Should be the last thing called in the
2373            initializer of a subclass.
2374    
2375            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2376            set the current selections in the combo boxes. This is needed
2377            under Windows.
2378    
2379            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2380            level panel to the dialog so that the background colors are
2381            consistent under Windows.
2382    
2383    2003-04-11  Jonathan Coles   <[email protected]>
2384    
2385            * Thuban/UI/classgen.py: Change color ramps to start at white
2386            not black.
2387    
2388            * Thuban/UI/legend.py: Enable/disable the legend buttons when
2389            the legend changes. Fixes RTbug #1793.
2390    
2391            * test/test_classification.py: Added test for copying of
2392            classifications.
2393    
2394    2003-04-11  Jonathan Coles   <[email protected]>
2395    
2396            * Thuban/UI/resource.py: New. Centralize the loading of resources
2397            such as bitmaps.
2398    
2399            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2400            added images to the move buttons, added 'reverse' button.
2401            (CustomRampPanel.__init__): Added images to the move buttons.
2402            (GreyRamp): New. Generates a ramp from white to black.
2403            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2404    
2405            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2406            ID_PROPERTY_*.
2407            (Classifier.__init__): Minor changes to the layout.
2408            (Classifier._OnTitleChanged): Listen for when the user edits the
2409            title and update the dialog's title and the layer's title.
2410    
2411            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2412    
2413            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2414            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2415            if the layer's title changes.
2416    
2417            * Thuban/UI/mainwindow.py: Added new menu item and associated code
2418            to open a dialog to rename the map.
2419            (MainWindow): Use new resource class to import bitmaps.
2420    
2421    2003-04-11  Jonathan Coles   <[email protected]>
2422    
2423            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2424            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2425            Resources/Bitmaps/group_use_none.xpm,
2426            Resources/Bitmaps/group_use_not.xpm,
2427            Resources/Bitmaps/hide_layer.xpm,
2428            Resources/Bitmaps/layer_properties.xpm,
2429            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2430            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2431            New.
2432    
2433    2003-04-10  Jonathan Coles   <[email protected]>
2434    
2435            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2436            Should pass group to ClassGroup constructor.
2437    
2438    2003-04-10  Jonathan Coles   <[email protected]>
2439    
2440            * Thuban/Model/classification.py: (ClassGroup): Move all the common
2441            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2442            here. Implement SetVisible(), IsVisible().
2443            (ClassGroup.__init__): Add group parameter which acts as a copy
2444            constructor.
2445    
2446            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2447            "Visible" check boxes.
2448            (Classifier): Rename the buttons and refactor the code to match
2449            the new labels.
2450    
2451            * Thuban/UI/legend.py: Classify button is now called "Properties".
2452            Refactored the code to change variable names.
2453            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2454    
2455            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2456            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2457            renamed to MainWindow.LayerEditProperties.
2458            (MainWindow.ToggleLegend): Don't include map name in legend title.
2459            (MainWindow.SetMap): Added the map name to the window title.
2460            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2461            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2462            Functionality is found in the layer properties dialog.
2463    
2464            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2465            draw visible groups.
2466    
2467    2003-04-09  Jonathan Coles   <[email protected]>
2468    
2469            * Thuban/UI/classgen.py: Modifications to allow simple
2470            addition and selection of new color schemes.
2471            (MonochromaticRamp): New. Generates a ramp between two colors.
2472            (RedRamp): New. Generates a ramp of all red.
2473            (GreenRamp): New. Generates a ramp of all green.
2474            (BlueRamp): New. Generates a ramp of all blue.
2475    
2476    2003-04-09  Jonathan Coles   <[email protected]>
2477    
2478            * Thuban/Model/classification.py (Classification.__deepcopy__):
2479            Need to copy over field and fieldType attributes.
2480    
2481            * Thuban/Model/table.py (Table.field_range): New. Retrive the
2482            maximum and minimum values over the entire table for a given
2483            field.
2484            (Table.GetUniqueValues): New. Retrieve all the unique values
2485            in the table for a given field.
2486    
2487            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2488            (GenUniquePanel): New. Controls to allow the user to select
2489            which unique field values they would like in the classification.
2490            (CustomRampPanel): Code that was in ClassGenDialog that allows
2491            the user to select the properties for a custom ramp.
2492            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2493    
2494            * Thuban/UI/classifier.py: Removed a lot of debugging code.
2495            (Classifier._SetClassification): Callback method so that the
2496            class generator can set the classification in the grid.
2497            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2498            editing of a group properties class into a wxWindows control.
2499    
2500            * Thuban/UI/dock.py: It was decided that if the user closes
2501            a dockable window the window should simply hide itself. That
2502            way if the user wants to show the dock again it appears in the
2503            same place as it was when it was closed.
2504            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2505            (DockableWindow._OnButtonClose): Hide the window instead of
2506            destroying it.
2507            (DockableWindow._OnClose): Hide the window instead of
2508            destroying it.
2509    
2510            * Thuban/UI/legend.py (LegendTree): Use a private method to
2511            consistently set the font and style of the text. Fixes RTbug #1786.
2512    
2513            * Thuban/UI/mainwindow.py: Import just the Classifier class.
2514    
2515    2003-04-07  Bernhard Herzog  <[email protected]>
2516    
2517            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2518            to the map module
2519    
2520    2003-04-07  Bernhard Herzog  <[email protected]>
2521    
2522            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2523            favor of ToggleSessionTree
2524            (MainWindow.ToggleSessionTree): New method to toggle visibility of
2525            the session tree.
2526            (MainWindow.SessionTreeShown): New method to return whether the
2527            session tree is currently shown.
2528            (MainWindow.ToggleLegend): New method to toggle visibility of the
2529            legend
2530            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2531            LegendShown
2532            (MainWindow.LegendShown): New method to return whether the legend
2533            is currently shown.
2534            (_method_command): Add checked parameter so we can define check
2535            menu items
2536            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2537            mainwindow methods.
2538            (show_session_tree, show_legend commands): Removed.
2539            (toggle_session_tree, toggle_legend commands): New commands to
2540            toggle the visibility of the dialogs
2541    
2542    2003-04-07  Jonathan Coles   <[email protected]>
2543    
2544            * Thuban/UI/classgen.py: Fix Windows problem.
2545    
2546            * Thuban/UI/dock.py: Fix Windows problem.
2547    
2548            * Thuban/UI/mainwindow.py: Use False instead of false.
2549            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2550    
2551    2003-04-07  Jonathan Coles   <[email protected]>
2552    
2553            Since we now say that the order of the groups in a classification
2554            matters, it makes sense to be able to manipulate that order. Most
2555            of the changes to Thuban/Model/classification.py are to that end.
2556    
2557            * Thuban/Model/classification.py (Classification.AppendGroup,
2558            Classification.InsertGroup, Classification.ReplaceGroup,
2559            Classification.RemoveGroup, Classification.GetGroup): Do as the
2560            names imply.
2561            (Classification.FindGroup): This was called GetGroup, but GetGroup
2562            takes an index, while FindGroup takes a value.
2563            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2564            REFERENCE. Currently there is a cyclic reference between the layer
2565            and its classification. If the classification doesn't need to know
2566            its owning layer we can change this, since it may make sense to be
2567            able to use the same classification with different layers.
2568    
2569            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2570    
2571            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2572            not AddGroup()
2573    
2574            * Thuban/UI/classifier.py: Now that we can depend on the order in
2575            a Classification and have methods to manipulate that order we don't
2576            need to use our own data structures in the grid. We can simply make
2577            the grid/table access the information they need from a copy of
2578            the classification object.
2579            (Classifier._OnCloseBtn): Event handler for when the user clicks
2580            'Close'. This is needed so if the user applies changes and then
2581            continues to change the table the user has the option of discarding
2582            the most recent changes and keeping what they applied.
2583    
2584            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2585            into the same group.
2586    
2587            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2588            with a really old version of proj, PJ_VERSION won't even be defined.
2589            If it isn't defined then just compile so that the function always
2590            returns Py_False.
2591    
2592            * test/test_classification.py: Fix tests to use the renamed methods.
2593            Still need to write tests for the new methods.
2594    
2595    2003-04-04  Jonathan Coles   <[email protected]>
2596    
2597            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2598            call to SetSelection out of the method and before the call
2599            to __SelectField in __init__. This prevents a recursion of events
2600            when _OnFieldSelect is triggered by the user.
2601    
2602    2003-04-04  Jonathan Coles   <[email protected]>
2603    
2604            * Thuban/Model/classification.py: Rename Color.None to
2605            Color.Transparent.
2606            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2607            Don't bother copying the color, since Colors are immutable.
2608    
2609            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2610            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2611            Thuban/UI/renderer.py, Thuban/UI/view.py:
2612            Rename Color.None to Color.Transparent.
2613        
2614            * test/test_classification.py, test/test_load.py: Rename Color.None
2615            to Color.Transparent.
2616    
2617    2003-04-04  Jonathan Coles   <[email protected]>
2618    
2619            * Thuban/Model/classification.py: Fix assert calls.
2620            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2621            Copy the color parameter rather than hold onto a reference.
2622    
2623            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2624            the color object.
2625            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2626            are sure there exists only one refernce to Color.None in the system.
2627            This allows us to use 'is' rather than the comparision functions.
2628            
2629            * Thuban/Model/save.py: Fix assert calls.
2630            
2631            * Thuban/UI/classifier.py: Fix assert calls.
2632            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2633            dialog to edit the groups properties.
2634            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2635            correctly if a cell is resized.
2636            (ClassTable.SetClassification): New. Changes the classification
2637            that is in the table.
2638            (ClassTable.__SetRow): Allow groups to be prepended.
2639            (Classifier): New code for opening the EditProperties and
2640            GenerateRanges dialogs.
2641            (SelectPropertiesDialog.__GetColor): Only set the color in the
2642            color dialog if the current color is not None.
2643            
2644            * Thuban/UI/dock.py: Fix assert calls.
2645            
2646            * Thuban/UI/legend.py: Fix assert calls.
2647            
2648            * Thuban/UI/renderer.py: Fix assert calls.
2649            
2650            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2651            classifications.
2652            (GenRangePanel): Panel specific to range generation.
2653            (GenSingletonPanel): Panel specific to singleton generation.
2654            (ClassGenerator): Class responsible for actually generating
2655            the classification from the data gathered in the dialog box.
2656            (PropertyRamp): Generates properties whose values range from
2657            a starting property to an ending property.
2658    
2659    2003-04-03  Bernhard Herzog  <[email protected]>
2660    
2661            * test/support.py (print_garbage_information): New function that
2662            prints information about still connected messages and memory
2663            leaks.
2664            (run_suite): Removed.
2665            (run_tests): New function for use as a replacement of
2666            unittest.main in the test_* files. This one calls
2667            print_garbage_information at the end.
2668    
2669            * test/runtests.py (main): Use support.print_garbage_information
2670    
2671            * test/test_layer.py: Use support.run_tests instead of
2672            unittest.main so we get memory leak information
2673            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2674            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2675            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2676            to fix a memory leak.
2677    
2678            * test/test_classification.py: Use support.run_tests instead of
2679            unittest.main so we get memory leak information
2680            (TestClassification.test_classification): Call the layer's Destroy
2681            method to fix a memory leak.
2682    
2683    2003-04-02  Bernhard Herzog  <[email protected]>
2684    
2685            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2686            Handle the reference counts of the return value and errors in
2687            PyArg_ParseTuple correctly.
2688    
2689            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2690            sure the filename is absolute to avoid problems when saving the
2691            session again
2692    
2693            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2694    
2695    2003-04-01  Jonathan Coles   <[email protected]>
2696    
2697            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2698            that there actually are points in the returned list of points
2699            before trying to index into the list. The list may be empty if
2700            the shape is a Null Shape.
2701    
2702    2003-04-01  Bernhard Herzog  <[email protected]>
2703    
2704            * test/test_map.py: Don't use from <module> import *
2705    
2706    2003-04-01  Jonathan Coles   <[email protected]>
2707    
2708            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2709            LAYER_LEGEND_CHANGED
2710    
2711            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2712            self.Destroy() to close the window after yesterday's changes.
2713    
2714            * test/test_map.py, test/test_session.py: Fix messages that
2715            are sent from maps and layers.
2716    
2717    2003-03-31  Jonathan Coles   <[email protected]>
2718    
2719            * Thuban/UI/classifier.py: Commented out some debugging statements.
2720            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2721            RTbug #1769.
2722    
2723            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2724            position (although position doesn't work yet under GTK).
2725            (DockableWindow.Destroy): New. Called when the window must be
2726            closed. Namely needed when the DockFrame closes and must close
2727            its children.
2728            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2729    
2730            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2731            when then window is told to close.
2732            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2733            comment in source for more info.
2734    
2735            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2736    
2737            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2738            symmetry with other such methods.
2739            (MainWindow.ShowLegend): Show the legend docked by default.
2740    
2741    2003-03-28  Jonathan Coles   <[email protected]>
2742    
2743            * Thuban/UI/classifier.py: Support for highlighting a specific
2744            group within the grid when the classification dialog is opened.
2745            Also contains a lot of debugging printouts which will later
2746            be removed.
2747    
2748            * Thuban/UI/dock.py: Complete rework on the dock code so that
2749            that it is fairly removed from the rest of the Thuban application.
2750            It is easy to add new docks which the rest of the program having
2751            to be aware of them.
2752    
2753            * Thuban/UI/legend.py: Modifications to support selecting a
2754            specific group in the classification dialog. Changed how layers
2755            are drawn when the layer is visible/invisible.
2756    
2757            * Thuban/UI/mainwindow.py: Removed legend specific code and
2758            replaced it with calls to the new dock code.
2759    
2760            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2761            to check if scale > 0. Trying to track down a divide by zero.
2762    
2763    2003-03-26  Jonathan Coles   <[email protected]>
2764    
2765            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2766            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2767            now part of DockableWindow.
2768            (LegendPanel.DoOnSelChanged): Select the current layer in the
2769            map.
2770            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2771            with the selected layer and/or group.
2772    
2773    2003-03-26  Jonathan Coles   <[email protected]>
2774    
2775            This putback contains the code for dockable windows. There is
2776            no support in wxWindows as of this date for windows that can
2777            attach themselves to other windows.
2778    
2779            The current model contains a DockableWindow which has a parent
2780            window for when it is detached and a dock window that it puts
2781            its contents in when it is docked. The contents of a DockableWindow
2782            must be a DockPanel. DockPanel itself derives from wxPanel.
2783    
2784            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2785            message, not a LAYER_LEGEND_CHANGED message.
2786    
2787            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2788    
2789            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2790            as one of the style properties for the fieldTypeText item to
2791            be sure that its size is correct when the text changes.
2792    
2793            * Thuban/UI/dock.py: New. Classes for the DockPanel and
2794            DockableWindow.
2795    
2796            * Thuban/UI/legend.py: Added some more buttons and made the
2797            LegendPanel a DockPanel.
2798    
2799            * Thuban/UI/mainwindow.py: Added sash windows to the main window
2800            and supporting functions for manipulating the sashes.
2801            (MainWindow.ShowLegend): Create a DockableWindow with the
2802            LegendPanel as the contents.
2803    
2804            * Thuban/UI/messages.py: Added DOCKABLE_* messages
2805    
2806            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2807            not LAYER_LEGEND_CHANGED, messages.
2808    
2809    2003-03-25  Jonathan Coles   <[email protected]>
2810    
2811            * setup.py: Added custom script bdist_rpm_build_script so that
2812            when the rpm is built the path to wx-config is correct.
2813    
2814            * setup.cfg: Added line saying to use the custom build script
2815    
2816    2003-03-20  Jonathan Coles   <[email protected]>
2817    
2818            Initial implementation of the Legend.
2819    
2820            * Thuban/UI/legend.py: New. Creates a window that shows the map's
2821            Legend information and allows the user to add/modify classifications
2822            and how the layers are drawn on the map.
2823    
2824            * setup.py: New command 'build_docs' which currently uses
2825            happydoc to generate html documentation for Thuban.
2826    
2827            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2828            Returns a string which is appropriately describes the group.
2829    
2830            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2831            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2832    
2833            * Thuban/Model/map.py (Map): Rename messages and use new, more
2834            specific, messages.
2835    
2836            * Thuban/Model/messages.py: New message to indicate that a layer's
2837            data has changed (LAYER_CHANGED). New map messages to indicate
2838            when layers have been added/removed/changed or if the stacking order
2839            of the layers has changed.
2840    
2841            * Thuban/Model/session.py: Rename and use new messages.
2842    
2843            * Thuban/UI/classifier.py: Remember if any changes have actually
2844            been applied so that if the dialog is cancelled without an application
2845            of changes we don't have to set a new classification.
2846            (ClassDataPreviewer): Pulled out the window specific code and put it
2847            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2848            symbols on any DC.
2849            
2850            * Thuban/UI/mainwindow.py: New code to open the legend.
2851    
2852            * Thuban/UI/view.py: Use new message names.
2853    
2854    2003-03-19  Jonathan Coles   <[email protected]>
2855    
2856            * Thuban/UI/main.py (verify_versions): New. Checks the versions
2857            of Python, wxPython, and some other libraries.
2858    
2859            * extensions/thuban/wxproj.cpp (check_version): Checks the given
2860            version against what wxproj was compiled with.
2861            (check_version_gtk): If wxproj was compiled with gtk then check
2862            the given version against the version of the gtk library
2863            currently being used.
2864    
2865    2003-03-14  Bernhard Herzog  <[email protected]>
2866    
2867            * test/test_command.py: Run the tests when the module is run as a
2868            script
2869    
2870    2003-03-14  Bernhard Herzog  <[email protected]>
2871    
2872            Implement selection of multiple selected shapes in the same layer:
2873    
2874            - Introduce a new class to hold the selection. This basically
2875              replaces the interactor which was nothing more than the
2876              selection anyway. A major difference is of course that the new
2877              selection class supports multiple selected shapes in one layer
2878            
2879            - Move the object that represents the selection from the
2880              application to the canvas. The canvas is a better place than the
2881              application because the selection represents which shapes and
2882              layer of the map displayed by the canvas are selected and
2883              affects how the map is drawn.
2884    
2885            - Make the selection and its messages publicly available through
2886              the mainwindow.
2887    
2888            - The non-modal dialogs do not get a reference to the interactor
2889              anymore as they can simply refer to their parent, the
2890              mainwindow, for the what the interactor had to offer.
2891    
2892            * Thuban/UI/selection.py: New module with a class to represent the
2893            selection.
2894    
2895            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2896            these unused messages
2897    
2898            * Thuban/UI/application.py (ThubanApplication.OnInit)
2899            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
2900            interactor is gone now.
2901            (ThubanApplication.CreateMainWindow): There is no interactor
2902            anymore so we pass None as the interactor argument for now for
2903            compatibility.
2904    
2905            * Thuban/UI/view.py (MapCanvas.delegated_messages)
2906            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
2907            Unsubscribe, delegate messages according to the delegated_messages
2908            class variable.
2909            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
2910            attributes from instance variables as described with the
2911            delegated_methods class variable.
2912            (MapCanvas.__init__): New instance variable selection holding the
2913            current selection
2914            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
2915            pass them on to the renderer
2916            (MapCanvas.SetMap): Clear the selection when a different map is
2917            selected.
2918            (MapCanvas.shape_selected): Simple force a complete redraw. The
2919            selection class now takes care of only issueing SHAPES_SELECTED
2920            messages when the set of selected shapes actually does change.
2921            (MapCanvas.SelectShapeAt): The selection is now managed in
2922            self.selection
2923    
2924            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
2925            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
2926            Unsubscribe, delegate messages according to the delegated_messages
2927            class variable.
2928            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
2929            attributes from instance variables as described with the
2930            delegated_methods class variable.
2931            (MainWindow.__init__): The interactor as ivar is gone. The
2932            parameter is still there for compatibility. The selection messages
2933            now come from the canvas.
2934            (MainWindow.current_layer, MainWindow.has_selected_layer):
2935            Delegate to the the canvas.
2936            (MainWindow.LayerShowTable, MainWindow.Classify)
2937            (MainWindow.identify_view_on_demand): The dialogs don't need the
2938            interactor parameter anymore.
2939    
2940            * Thuban/UI/tableview.py (TableFrame.__init__)
2941            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
2942            (LayerTableFrame.row_selected): The interactor is gone. It's job
2943            from the dialog's point of view is now done by the mainwindow,
2944            i.e. the parent. Subscribe to SHAPES_SELECTED instead
2945            of SELECTED_SHAPE
2946            
2947            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
2948            is gone. It's job from the dialog's point of view is now done by
2949            the mainwindow, i.e. the parent.
2950            
2951            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
2952            gone. It's job from the dialog's point of view is now done by the
2953            mainwindow, i.e. the parent.
2954    
2955            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
2956            gone. It's job from the dialog's point of view is now done by the
2957            mainwindow, i.e. the parent.
2958            (SessionTreeCtrl.__init__): New parameter mainwindow which is
2959            stored as self.mainwindow. The mainwindow is need so that the tree
2960            can still subscribe to the selection messages.
2961            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
2962            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
2963            selection is now accessible through the mainwindow. Subscribe to
2964            SHAPES_SELECTED instead of SELECTED_SHAPE
2965    
2966            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
2967            SHAPES_SELECTED message now.
2968            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
2969            so deal with multiple shapes
2970            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
2971            gone. It's job from the dialog's point of view is now done by the
2972            mainwindow, i.e. the parent.
2973    
2974            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
2975            parameter is now a list of shape ids.
2976            (RecordTable.SetTable): The second parameter is now a list of
2977            indices.
2978    
2979            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
2980            selected_shape parameter and ivar to selected_shapes. It's now a
2981            list of shape ids.
2982            (MapRenderer.draw_label_layer): Deal with multiple selected
2983            shapes. Rearrange the code a bit so that the setup and shape type
2984            distinctions are only executed once.
2985    
2986            * test/test_selection.py: Test cases for the selection class
2987    
2988    2003-03-11  Jonathan Coles   <[email protected]>
2989    
2990            * Thuban/Model/load.py: Temporary fix so that the xml reader
2991            doesn't cause Thuban to crash.
2992    
2993            * Thuban/Model/layer.py: Handle the cyclic references between
2994            a layer and its classification better, and be sure to disconnect
2995            the classification from the layer when the layer is destroyed
2996            so that we don't maintain a cyclic reference that may not be
2997            garbage collected.
2998    
2999            * Thuban/Model/classification.py: See comment for layer.py.
3000    
3001    2003-03-12  Jan-Oliver Wagner <[email protected]>
3002    
3003            * HOWTO-Release: New. Information on the steps for releasing
3004            a new version of Thuban.
3005    
3006    2003-03-11  Jonathan Coles   <[email protected]>
3007    
3008            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3009            Use True instead of true.
3010            (Classifier): Should have a single panel in which all the controls lie.
3011    
3012            * Thuban/UI/proj4dialog.py: Add normal border.
3013    
3014            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3015    
3016            * Thuban/UI/mainwindow.py: Use True instead of true.
3017    
3018            * setup.py: Update some definitions to use wxWindows2.4 files
3019    
3020            * Data/iceland_sample_class.thuban: Fixed file so that the
3021            field_type information is present.
3022    
3023    2003-03-10  Jonathan Coles   <[email protected]>
3024    
3025            * Thuban/UI/classifier.py (Classifier.__init__): Make the
3026            field type label grow so that when the text changes the
3027            size is updated correctly. This may be a wxWindows bug.
3028    
3029    2003-03-10  Jonathan Coles   <[email protected]>
3030    
3031            * Thuban/UI/application.py: Changed SESSION_CHANGED to
3032            SESSION_REPLACED.
3033    
3034            * Thuban/UI/classifier.py: Wrap text with _().
3035            (ClassGrid.CreateTable): Set dimensions and size hints here,
3036            instead of in Reset, so we only set the size once.
3037    
3038            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3039    
3040            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3041            Call Close() instead of Shutdown().
3042    
3043            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3044    
3045            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3046            Go back to using OnClose() instead of Shutdown().
3047    
3048    2003-03-10  Jonathan Coles   <[email protected]>
3049    
3050            * Thuban/UI/classifier.py (Classifier): SelectField() needed
3051            to know the old field index as well as the new one.
3052    
3053    2003-03-10  Jonathan Coles   <[email protected]>
3054    
3055            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3056            to correctly set the table information and call this from
3057            __init__ and from _OnFieldSelect so that all the information
3058            is up to date when the dialog opens and when a field is changed.
3059    
3060    2003-03-10  Jonathan Coles   <[email protected]>
3061    
3062            * Thuban/Model/classification.py (Classification): Don't use
3063            layer's message function directly, use the ClassChanged() method
3064            when then classification changes. SetField/SetFieldType/SetLayer
3065            must keep the information about field name and field type in
3066            sync when an owning layer is set or removed.
3067    
3068            * Thuban/Model/layer.py: Added ClassChanged() so that the
3069            classification can tell the layer when its data has changed.
3070            (Layer.SetClassification): Accepts None as an arguement to
3071            remove the current classification and correctly handles
3072            adding a new classification.
3073    
3074            * Thuban/Model/load.py: Comment out print statement
3075    
3076            * test/test_classification.py, test/test_save.py: New and
3077            improved tests.
3078    
3079    2003-03-07  Jonathan Coles   <[email protected]>
3080    
3081            * Thuban/Model/classification.py: Implemented __copy__ and
3082            __deepcopy__ for ClassGroup* and ClassGroupProperites so
3083            they can easily be copied by the classifier dialog.
3084            (ClassGroupProperites.__init__): The default line color should
3085            have been Color.Black.
3086    
3087            * Thuban/UI/classifier.py: Setting and Getting table values now
3088            uses a consistent set of functions.
3089            (Classifier): Now non-modal. Has field type label which changes
3090            as the field changes. Keep track of buttons in a list so that
3091            we can enable/disable the buttons when the None field is selected.
3092            (SelectPropertiesDialog): Add buttons to make the colors transparent.
3093    
3094            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3095            does what OnClose did, but can be called by the application to
3096            close a window. Needed when a session changes, and we have to
3097            close the classifier windows.
3098    
3099            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3100            Shuts down open dialogs. Used when a new session is created
3101            or a session is opened.
3102            (MainWindow.SaveSession): Should only call application.SaveSession()
3103            if we don't call SaveSessionAs first.
3104            (MainWindow.Classify): Allow different classifier dialogs for
3105            different layers.
3106    
3107            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3108            the parent class handle it. Add Shutdown() to unsubscibe from
3109            event notification and call the parent Shutdown(). This was
3110            necessary so the application can close the tree window.
3111    
3112    2003-03-06  Jonathan Coles   <[email protected]>
3113    
3114            * Thuban/Model/classification.py: Minor documentation changes,
3115            Addition of __eq__ and __ne__ methods.
3116            (Classification.SetLayer): prevent recursion between this method
3117            and Layer.SetClassification().
3118    
3119            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3120    
3121            * Thuban/Model/layer.py (SetClassification): prevent recursion
3122            between this method and Classification.SetLayer().
3123    
3124            * test/test_classification.py, test/test_load.py,
3125            test/test_session.py: Fixed and added tests for the classification
3126            classes.
3127    
3128  2003-03-06  Bernhard Herzog  <[email protected]>  2003-03-06  Bernhard Herzog  <[email protected]>
3129    
3130          * Thuban/UI/classifier.py (ClassGrid.__init__)          * Thuban/UI/classifier.py (ClassGrid.__init__)

Legend:
Removed from v.477  
changed lines
  Added in v.1191

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26