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

Legend:
Removed from v.294  
changed lines
  Added in v.1093

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26