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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26