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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26