/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Diff of /branches/greater-ms3/thuban/ChangeLog

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

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

Legend:
Removed from v.304  
changed lines
  Added in v.1137

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26