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

Legend:
Removed from v.252  
changed lines
  Added in v.1118

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26