/[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 554 by jonathan, Tue Mar 25 16:20:51 2003 UTC revision 1059 by frank, Tue May 27 11:30:46 2003 UTC
# Line 1  Line 1 
1    2003-05-27  Frank Koormann  <[email protected]>
2            
3            Nonmodal dialogs without parent (i.e. they can fall behind the main
4            window)
5    
6            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7            all dialogs in the dialogs dictionary and the canvas.
8    
9            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
10            parent, i.e. can fall behind other windows.
11            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
12            dictionary before removing it.
13    
14            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
15    
16            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
17            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
18            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
19    
20    2003-05-27  Bernhard Herzog  <[email protected]>
21    
22            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
23            tableview dialog
24            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
25            Also, don't use the table's titles as the dialog names. The titles
26            aren't guaranteed to be unique.
27            (MainWindow.TableOpen): Open a table view dialog after opening the
28            table
29    
30    2003-05-27  Bernhard Herzog  <[email protected]>
31    
32            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
33            effect can be achieved by simply closing the window showing the
34            table.
35            (MainWindow.TableHide): Removed.
36            (main_menu): Removed "table_hide"
37    
38    2003-05-27  Frank Koormann  <[email protected]>
39    
40            Fix legend tree display problems under Win32
41    
42            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
43            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
44            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
45    
46            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
47    
48    2003-05-27  Jan-Oliver Wagner <[email protected]>
49    
50            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
51            'after' now allows to insert separators almost anywhere in the menu.
52    
53    2003-05-27  Frank Koormann  <[email protected]>
54    
55            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
56            "S" of selection box label to hint on hot key (Alt-S). Works under
57            Win32 but is ignored under GTK.
58    
59    2003-05-26  Frank Koormann  <[email protected]>
60    
61            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
62            Center Choices.
63    
64    2003-05-26  Bernhard Herzog  <[email protected]>
65    
66            Remove the Precision methods again. They're too DBF specific to be
67            part of the table interface and they're only used in table_to_dbf
68            anyway.
69            
70            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
71            fixed precision of 12 for doubles.
72            (TransientTableBase.Precision): Removed
73            (AutoTransientTable.Width): Delegate to self.table.
74    
75            * Thuban/Model/table.py (DBFTable.Precision)
76            (MemoryTable.Precision): Removed.
77            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
78            (table_to_dbf): Use a fixed precision of 12 for floats unless the
79            column object specifies something else.
80    
81            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
82            test for table_to_dbf
83    
84    2003-05-26  Bernhard Herzog  <[email protected]>
85    
86            * test/test_transientdb.py
87            (TestTransientTable.run_iceland_political_tests): Fix a comment.
88    
89    2003-05-26  Bernhard Herzog  <[email protected]>
90    
91            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
92            implementation. Mark parts of the file format strings for
93            localization.
94    
95            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
96            file and add the table to the tables managed by the session
97    
98            * test/test_session.py (TestSessionSimple.test_open_table_file):
99            New. test case for OpenTableFile
100    
101    2003-05-26  Jan-Oliver Wagner <[email protected]>
102    
103            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
104            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
105            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
106            Replace the true/false of wxWindows by True/False of Python 2.2.1.
107    
108    2003-05-26  Jan-Oliver Wagner <[email protected]>
109    
110            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
111            already a selection present, update the grid accordingly.
112    
113            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
114            resizeable and increase its initial size.
115    
116    2003-05-26  Frank Koormann  <[email protected]>
117    
118            Table export functionality
119    
120            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
121            Return width (in characters) for a column.
122            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
123            (table_to_dbf): Write table to dbf file.
124            (table_to_csv): Write table to csv file.
125    
126            * Thuban/Model/transientdb.py (TransientTableBase.Width,
127            TransientTableBase.Precision): Return column width and precision.
128    
129            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
130            or table_to_csv depending on file selection.
131    
132            * test/test_dbf_table.py:
133            Test table_to_dbf (extension of former part of test).
134    
135            * test/test_csv_table.py:
136            Test table_to_csv.
137    
138    2003-05-23  Jan-Oliver Wagner <[email protected]>
139    
140            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
141            Use QueryTableFrame instead of TableFrame.
142    
143            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
144            table window with 'Layer Table:' instead of 'Table:'.
145    
146    2003-05-23  Jan-Oliver Wagner <[email protected]>
147    
148            Give all tables a title via mix-in TitledObject.LayerShowTable
149    
150            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
151            only if it exists.
152    
153            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
154            and call its init-method with a default title. Remove Title() method.
155    
156            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
157            AutoTransientTable): mix-in TitledObject and call its init-method with
158            a default title. Remove Title() method.
159    
160    2003-05-23  Bernhard Herzog  <[email protected]>
161    
162            * Thuban/Model/session.py (Session.AddShapeStore): Define
163            AddShapeStore analogously to AddTable.
164    
165            * test/test_session.py (TestSessionSimple.test_add_shapestore):
166            New. Test for AddShapeStore
167    
168    2003-05-23  Jan-Oliver Wagner <[email protected]>
169    
170            Introducing QueryTableFrame and a very coarse ShowTable implementation.
171    
172            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
173            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
174            The latter implements the selection GUI without dependency on a layer.
175            LayerTableFrame now is derived from QueryTableFrame and connects
176            to a layer.
177    
178            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
179            implementation that still needs work.
180    
181            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
182    
183    2003-05-22  Frank Koormann  <[email protected]>
184    
185            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
186            Added "outer_join = False" as optional parameter.
187            (TransientJoinedTable.create): If outer join is true, perform a
188            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
189            the left table. Records not matching are filled with 0 / None.
190    
191            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
192            (JoinDialog.OnJoin): Consider outer join check box.
193    
194    2003-05-22  Bernhard Herzog  <[email protected]>
195    
196            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
197            somewhat safer way. Storing the traceback in a local variable can
198            lead to memory leaks
199    
200    2003-05-22  Bernhard Herzog  <[email protected]>
201    
202            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
203            the wxMessageDialog's Destroy() method.
204    
205    2003-05-22  Frank Koormann  <[email protected]>
206    
207            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
208            TransientTable.Title()
209    
210    2003-05-22  Frank Koormann  <[email protected]>
211    
212            Join Dialog, initial version.
213    
214            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
215    
216            * Thuban/UI/join.py (JoinDialog): Functional implementation of
217            former framework. Renamed Table1/Table2 to LeftTable/RightTable
218            in all occurences.
219    
220            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
221            Typo fixed.
222    
223    2003-05-22  Bernhard Herzog  <[email protected]>
224    
225            Give the tables titles so that the GUI can display more meaningful
226            names. For now the titles are fixed but depend on e.g. filenames
227            or the titles of the joined tables.
228    
229            * Thuban/Model/transientdb.py (TransientTable.Title)
230            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
231    
232            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
233    
234            * test/test_transientdb.py
235            (TestTransientTable.test_auto_transient_table_title): New. Test
236            for the Title method
237            (TestTransientTable.test_transient_joined_table)
238            (TestTransientTable.test_transient_table): Add test for the Title
239            methods
240    
241            * test/test_memory_table.py (TestMemoryTable.test_title): New.
242            Test for the Title method
243    
244            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
245            the Title method
246    
247    2003-05-22  Bernhard Herzog  <[email protected]>
248    
249            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
250            Provide a better way to destroy the layers
251            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
252            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
253            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
254            the new way to destroy the layers.
255            (TestLayer.test_derived_store): New. Test for using a layer with a
256            DerivedShapeStore
257    
258            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
259            filename if the shape store actually has one.
260    
261    2003-05-22  Bernhard Herzog  <[email protected]>
262    
263            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
264            for the filename
265    
266            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
267            for the FileName method
268            (TestDBFTableWriting.test_write): Fix spelling of filename
269    
270    2003-05-22  Thomas Koester  <[email protected]>
271    
272            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
273            from SciParam that now really is immutable.
274    
275    2003-05-22  Frank Koormann  <[email protected]>
276    
277            Layer Top/Bottom placement added to legend.
278    
279            * Thuban/UI/legend.py
280            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
281            bound to tool events.
282            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
283            New, methods binding the event methods with the map methods.
284    
285            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
286            layer at top/bottom of layer stack.
287    
288            * Resources/Bitmaps/top_layer.xpm: New button icon.
289    
290            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
291    
292    2003-05-22  Bernhard Herzog  <[email protected]>
293    
294            * Thuban/Model/session.py (Session.RemoveTable): New method to
295            remove tables
296    
297            * test/test_session.py (TestSessionSimple.test_remove_table): New.
298            Test for RemoveTable
299    
300    2003-05-22  Thomas Koester  <[email protected]>
301    
302            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
303            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
304    
305    2003-05-22  Bernhard Herzog  <[email protected]>
306    
307            Implement a way to discover dependencies between tables and
308            shapestores.
309    
310            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
311            (TransientJoinedTable.Dependencies)
312            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
313            interface
314            (TransientJoinedTable.__init__): Keep tack of the original table
315            objects in addition to the corresponding transient tables.
316    
317            * Thuban/Model/table.py (DBFTable.Dependencies)
318            (MemoryTable.Dependencies): New. Implement the dependencies
319            interface
320    
321            * Thuban/Model/data.py (ShapeTable): New. Helper class for
322            ShapefileStore
323            (ShapefileStore.__init__): Use ShapeTable instead of
324            AutoTransientTable
325            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
326            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
327            methods for filename and type
328            (ShapefileStore.Dependencies): New. Implement the dependencies
329            interface
330            (DerivedShapeStore): New class to replace SimpleStore. The main
331            difference to SimpleStore is that it depends not on a shapefile
332            but another shapestore which expresses the dependencies a bit
333            better
334            (SimpleStore.__init__): Add deprecation warning.
335    
336            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
337            Test for the Dependencies method.
338    
339            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
340            New. Test for the Dependencies method.
341    
342            * test/test_transientdb.py
343            (TestTransientTable.test_auto_transient_table_dependencies): New.
344            Test for the Dependencies method.
345            (TestTransientTable.test_transient_joined_table): Add test for the
346            Dependencies method.
347    
348            * test/test_session.py (TestSessionSimple.setUp)
349            (TestSessionSimple.tearDown): New. Implement a better way to
350            destroy the sessions.
351            (TestSessionSimple.test_initial_state)
352            (TestSessionSimple.test_add_table): Bind session to self.session
353            so that it's destroyed by tearDown
354            (TestSessionSimple.test_open_shapefile): New. Test for
355            OpenShapefile and the object it returns
356    
357    2003-05-22  Bernhard Herzog  <[email protected]>
358    
359            * Thuban/Model/session.py (Session.AddTable): New method to
360            register tables with the session.
361            (Session.Tables): Return the tables registered with AddTable too.
362    
363            * test/test_session.py (TestSessionSimple.test_add_table): New.
364            Test case for the AddTable method
365    
366    2003-05-22  Frank Koormann  <[email protected]>
367    
368            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
369            lower right corner, center labels for selections, initialize controls
370            in reasonable order for keyboard navigation.
371    
372            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
373            (ProjFrame.__DoOnProjAvail): Determine position of current projection
374            using the wxListBox.FindString() method. Still a problem (#1886)
375    
376            * Thuban/UI/classifier.py
377            (Classifier.__init__, SelectPropertiesDialog.__init__)
378    
379            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
380            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
381            different classification types from here to __init__.
382            (GenUniquePanel.__init__): Set the column width of the first field
383            in the Field ListCtrl to the full width.
384    
385            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
386            Button to 'Export'. Center Buttons in Selection Box, set Focus to
387            Grid.
388            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
389            changes focus to the Selection when pressing "Alt-S".
390    
391            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
392            the text if not visible. The italic font sometimes exceeds the
393            rendering area.
394    
395    2003-05-21  Jonathan Coles   <[email protected]>
396    
397            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
398            to OnClose so that Thuban closes correctly.
399    
400            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
401            DockFrame.OnClose, not DockFrame._OnClose.
402    
403    2003-05-21  Jonathan Coles   <[email protected]>
404    
405            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
406            references to 'inf' and use new Range __init__ to pass floats
407            directly rather than converting them to strings first.
408            Fixes RTBug #1876.
409    
410            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
411            Use new Range ___init__ to pass floats.
412    
413            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
414            filename is a valid image file. Throw IOError otherwise.
415    
416            * Thuban/Model/range.py: Brought over new Range from SciParam that
417            is immutable and has an __init__ which can accept floats.
418    
419            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
420            into try block. AddLayer doesn't throw any exceptions anymore.
421            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
422            try block.
423    
424            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
425            the first item in choices. Fixes RTBug #1882.
426    
427            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
428            has gone to 0 which is a serious problem. abort.
429            (MapRenderer.draw_raster_layer): Catch IOError seperately and
430            print the error from GDAL.
431    
432            * Thuban/UI/tableview.py (TableGrid.__init__): Call
433            ToggleEventListeners to turn on listening.
434            (TableGrid.ToggleEventListeners): New. Turns event listening on
435            and off so as to prevent excessive messages.
436            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
437            to suppress excessive messages when selecting many rows.
438            Fixes RTBug #1880.
439    
440            * Thuban/UI/view.py: Added checks against if scale == 0. This
441            is a serious problem that can occur when an image without
442            geo data is loading and causes the map projection bounds to
443            go to infinity. Right now, the solution is to simply try
444            to recover.
445    
446            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
447            to set the MFILEReceiver attributes even if the data is NULL.
448    
449            * extensions/thuban/gdalwarp.cpp: Improved the error handling
450            and passed GDAL messages back up to the Python layer. Also
451            tried to fix some memory leaks that were present in the original
452            utility but didn't matter because the program aborted.
453    
454            * test/test_range.py: Copied over tests from SciParam. Removed
455            tests against importing. Fixes RTBug #1867.
456    
457    2003-05-21  Bernhard Herzog  <[email protected]>
458    
459            * test/test_load.py: Remove unused imports and restructure the
460            test code
461            (LoadSessionTest): Split into one class for each test and turn
462            LoadSessionTest itself into the base class for all such session
463            tests.
464            (ClassificationTest): New base class for load tests that test
465            classifications
466            (TestSingleLayer, TestLayerVisibility, TestClassification)
467            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
468            for the individual tests
469    
470            * test/support.py (FileLoadTestCase.filename): New base class for
471            file loading tests
472    
473    2003-05-21  Jan-Oliver Wagner <[email protected]>
474    
475            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
476            Mercator' to 'UTM Zone 32' as a more convenient example.
477            Added 'Gauss Krueger Zone 6'.
478    
479            * Data/iceland_sample_raster.thuban: political polygon now
480            filled transparent to have the raster image visible at once.
481    
482    2003-05-21  Frank Koormann  <[email protected]>
483    
484            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
485            OnClose() to keep in sync with extensions. Internally Thuban
486            still uses "underscored" names.
487    
488    2003-05-20  Jonathan Coles   <[email protected]>
489    
490            This puts back Raster layer support. These layers support projections
491            through the GDAL library. Currently, the CVS version is being used.
492            There are no Debian packages available although this may change soon.
493            A GDAL driver was extended to support writing to memory rather to
494            files.
495    
496            There is still some work that needs to be done, such as some error
497            handling when loading invalid images or when there is a problem
498            projecting the image. This putback simply checks in the majority
499            of the work.
500    
501            * setup.py: Add gdalwarp library extension.
502    
503            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
504            Defaults to False, but can be overridden by subclasses if they
505            support classification.
506            (RasterLayer): New. Defines a new layer that represents an
507            image.
508    
509            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
510            tag handler.
511            (SessionLoader.start_layer): Encode the filename.
512            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
513            New. Supports reading a rasterlayer tag.
514    
515            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
516    
517            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
518            get a string in Latin1. If we get such as string convert it to
519            unicode first, otherwise leave if alone before encoding.
520            (SessionSaver.write_layer): Add support for writing both Layers
521            and RasterLayers.
522    
523            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
524            The right argument may not be a string, it could also be a Column.
525    
526            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
527            Make initial window size 600x400. Fixes RTBug #1872.
528    
529            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
530            the dialog is constructed so that we can support layers that
531            do not have classifications.
532            (Classifier._OnTry): Only build a classification if the layer
533            supports one.
534    
535            * Thuban/UI/legend.py: Change all checks that a layer is an
536            instance of Layer into checks against BaseLayer.
537            (LegendTree.__FillTreeLayer): Only add children to a branch if
538            the layer supports classification.
539    
540            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
541            MainWindow.OpenSession): Don't proceed with an action if the
542            user chooses Cancel when they are asked to save changes.
543            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
544            user to select an image file. Create a new RasterLayer and add
545            it to the map.
546    
547            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
548            for rendering RasterLayer layers.
549            (MapRenderer.draw_raster_layer): Actually method that calls
550            the GDALWarp python wrapper and constructs an image from the
551            data returned.
552    
553            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
554            Choices symbols to match those used in the table query method.
555            Replace deprecated method calls on table with new method names.
556    
557            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
558            how small the scale can get. This still needs more testing.
559    
560            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
561            Provides a driver to output in .bmp format.
562    
563            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
564            New. Provides IO routines which write to memory, rather than a file.
565    
566            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
567            of the gdalwarp utility provided in GDAL. Added function calls
568            that can be accessed from python.
569    
570            * Data/iceland_sample_raster.thuban: New. Sample file that uses
571            a raster layer.
572    
573            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
574            layer image data.
575    
576            * Doc/thuban.dtd: Added rasterlayer attribute definition.
577    
578            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
579            tests associated with the raster layer code.
580    
581            * test/test_transientdb.py
582            (TestTransientTable.test_auto_transient_table_query): Added a test
583            for using a Column object as the "right" parameter to a query.
584    
585    2003-05-19  Frank Koormann  <[email protected]>
586    
587            * Thuban/version.py (get_changelog_date):
588            Catch exceptions if ChangeLog does not exist.
589    
590            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
591    
592    2003-05-19  Frank Koormann  <[email protected]>
593    
594            Extended version information for Thuban
595    
596            * Thuban/version.py: New, version information for Thuban: Last
597            modification date and last ChangeLog entry date.
598    
599            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
600            information: Display Thuban, wxPython and Python version.
601    
602    2003-05-16  Bernhard Herzog  <[email protected]>
603    
604            * Thuban/Model/save.py: Remove some unused imports including the
605            __future__ import for nested_scopes as Thuban relies on Python 2.2
606            now.
607            (XMLWriter.encode): Remove the special case for a None argument.
608            In the saver encode is always called with a string argument.
609    
610    2003-05-16  Bernhard Herzog  <[email protected]>
611    
612            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
613            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
614            of the bug was that e.g. float("1.2") would fail. Thuban now
615            requires 2.4.x.
616            
617    2003-05-16  Frank Koormann   <[email protected]>
618    
619            Printing enhancement and WMF export (under Win32)
620    
621            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
622            ScreenRenderer. Renders Map, Legend and Scalebar for export.
623            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
624            PrintRender.
625    
626            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
627            to fullfil information needed for PrinterRenderer.
628            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
629            (MapCanvas.Print): Adapted to new MapPrintout.
630            (OutputTransform): General calculations to transform from canvas
631            coordinates to export/printing devices.
632    
633            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
634            new method_command to call ExportMap, with platform dependency (only
635            __WXMSW__)
636      
637            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
638            of scalebar drawing area as new parameters.
639            
640            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
641    
642            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
643            Update to extended scalebar.DrawScalebar header.
644    
645            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
646    
647            * test/test_scalebar.py: Made test executable as standalone.
648    
649    2003-05-16  Bernhard Herzog  <[email protected]>
650    
651            * Thuban/Model/table.py (Table): Remove this compatibility alias
652            for DBFTable.
653    
654            * test/test_table.py: Import DBFTable as Table because that alias
655            doesn't exist anymore.
656    
657            * Thuban/UI/classgen.py: Remove some unused imports
658    
659    2003-05-14  Jonathan Coles   <[email protected]>
660    
661            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
662            Fix docstring.
663            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
664            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
665            values of the supplied range to determine the beginning and end
666            bounds of the generated classes.
667    
668            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
669            do not have a leading 0 (.5 is now accepted as well as 0.5).
670    
671            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
672            call to ClassGenerator.GenUniformDistribution.
673    
674            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
675            layout bug with the 'Projection' label.
676    
677            * test/support.py (FloatTestCase): New. Needed for the Range tests.
678    
679            * test/test_range.py: New. Imported from SciParam.
680    
681    2003-05-12  Jonathan Coles   <[email protected]>
682    
683            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
684            to table.UniqueValues() with calls that retrieve all the values
685            from the table. This will need to be replaced by a method on table
686            which can simply return the list (perhaps more efficiently).
687    
688    2003-05-12  Jonathan Coles   <[email protected]>
689    
690            The return value of ClassGenerator.CalculateQuantiles has changed.
691            Refer to the documentation for details.
692    
693            * test/test_classgen.py: Modified Quantile tests to use the
694            new return values.
695    
696            * Thuban/Model/classgen.py
697            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
698            use new return values from CalculateQuantiles to produce the correct
699            range bounds in the Classification.
700            (ClassGenerator.CalculateQuantiles): Add more comments describing
701            the return values and parameters. Make minor adjustments to improve
702            the legibility of the code. Fix problem with adjusted not being set
703            in most cases.
704    
705    2003-05-12  Frank Koormann <[email protected]>
706            
707            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
708            and latin1. Fixes #1851 finally.
709    
710    2003-05-09  Jonathan Coles   <[email protected]>
711    
712            * test/test_classgen.py: New. Tests the Quantile algorithm.
713    
714            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
715            Clean up debugging statement, add comments, fix a small bug in the
716            returned adjusted percentiles.
717            
718    2003-05-09  Jonathan Coles   <[email protected]>
719    
720            Introduces Range class from SciParam into the ClassGroupRange class,
721            and such ranges can now be saved and loaded from disk.
722    
723            Quantiles are now available in the Classification Generator.
724    
725            Initial support for building Queries on a table. Doesn't do anything
726            but run some tests.
727    
728            * Thuban/Model/classification.py: Explicit imports.
729            (ClassGroupRange): Use the Range class to store the underlying
730            range information. The interface remains the same, except for
731            GetRange(), and you can also supply a Range object as the min
732            parameter to SetRange or __init__.
733    
734            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
735            string appropriately for use in Thuban. Fixes RTbug #1851.
736            (SessionLoader.end_projection): Handle the context of the
737            projection tag a bit better by looking at what objects are not
738            None. There was an assumption that a projection tag for a map
739            could occur before any layers.
740            (SessionLoader.start_clrange): Provide backward compatibility for
741            reading min/max values as well as the new range parameter.
742    
743            * Thuban/Model/map.py: Explicit imports.
744    
745            * Thuban/Model/resource.py: Import _.
746            (ProjFileSaver.write): write header using projfile.dtd.
747    
748            * Thuban/Model/save.py: Explicit imports.
749            (XMLWriter.encode): New. Encode the given string from a format
750            used by Thuban into UTF-8. Fixes RTbug #1851.
751    
752            * Thuban/UI/classgen.py: Explicit imports.
753            (ClassGenDialog.__init__): Clean up the code and add support
754            for Quantiles.
755            (ClassGenDialog.OnOK): Add support for Quantiles.
756            (GenQuantilesPanel): New. Input panel for Quantiles.
757            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
758            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
759    
760            * Thuban/Model/classgen.py: New. Contains all the classes named above.
761    
762            * Thuban/UI/classifier.py: Explicit imports.
763            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
764            ClassTable.SetValueAsCustom): Reworked to use new Range class.
765    
766            * Thuban/UI/legend.py: Explicit imports.
767    
768            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
769            a Table menu and associated method calls.
770            (MainWindow.choose_color): Removed. No longer needed.
771    
772            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
773            should be disabled if no projection is selected in the available
774            list.
775    
776            * Thuban/UI/renderer.py: Explicit imports.
777    
778            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
779            with correctly selecting the rows and issuing the right events.
780            Be sure to call Skip() to allow the grid to do some of its own
781            handling which allows the rows to actually be selected.
782            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
783            selecting multiple shapes.
784            (LayerTableFrame): Support for building Queries.
785            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
786    
787            * Thuban/UI/tree.py: Explicit imports.
788    
789            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
790            table view can call it.
791    
792            * test/test_classification.py: Explicit imports.
793            (TestClassification.test_ClassGroupRange): Fix test for new
794            Range class.
795    
796            * Doc/thuban.dtd: Add range parameter for clrange.
797    
798            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
799            object in ClassGroupRange, and also uesd for inputting ranges in
800            the classifer table and elsewhere.
801    
802            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
803            yet.
804    
805    2003-05-09  Frank Koormann <[email protected]>
806    
807            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
808    
809    2003-05-08  Frank Koormann <[email protected]>
810    
811            Coding style updates
812    
813            * test/test_scalebar.py: Replaced tab indentation by spaces.
814    
815            * Thuban/UI/scalebar.py: Explicit imports.
816    
817    2003-05-08  Frank Koormann <[email protected]>
818    
819            * Thuban/UI/scalebar.py
820            (ScaleBar.DrawScalebar): Format string bug fixed.
821    
822    2003-05-08  Frank Koormann <[email protected]>
823    
824            Reorganization of scalebar component (no wx in Thuban/Model)
825    
826            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
827            (deriveInterval):
828            Calculate scalebar interval and unit which fits in width for scale.
829            (roundInterval): Round float.
830    
831            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
832    
833            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
834    
835            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
836    
837    2003-05-08  Frank Koormann <[email protected]>
838    
839            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
840            Initialize ScaleBar with canvas.map
841    
842            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
843            round intervals to display smarter lengths
844            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
845            layer. If the maps has no projection applied grey the scalebar.
846    
847    2003-05-07  Frank Koormann <[email protected]>
848            
849            Basic Scalebar features added.
850    
851            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
852    
853            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
854            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
855            and the renderer.
856    
857            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
858    
859            * Thuban/UI/messages.py: SCALE_CHANGED added.
860    
861    2003-05-07  Bernhard Herzog  <[email protected]>
862    
863            * Thuban/Model/session.py (Session.__init__): New instance
864            variable shapestores to hold a list of all open shapestore objects
865            (Session.ShapeStores): New. Accessor method for the shapestores
866            list.
867            (Session._add_shapestore, Session._clean_weak_store_refs): New.
868            Internal methods to maintain the shapestores list.
869            (Session.Tables): New. Return all tables open in the session.
870            (Session.OpenShapefile): Insert the new ShapeStore into the
871            shapestores list.
872    
873            * test/test_session.py (TestSessionSimple.test_initial_state): Add
874            tests for ShapeStores and Tables
875            (TestSessionWithContent.test_shape_stores)
876            (TestSessionWithContent.test_tables): New. Test cases for
877            ShapeStores and Tables
878    
879    2003-05-07  Bernhard Herzog  <[email protected]>
880    
881            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
882            Add comments about the optimizations used.
883            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
884            Implement the ReadValue table interface method.
885    
886            * test/test_transientdb.py
887            (TestTransientTable.run_iceland_political_tests)
888            (TestTransientTable.test_transient_joined_table): Add tests for
889            ReadValue
890    
891    2003-05-07  Frank Koormann <[email protected]>
892    
893            * Resources/Bitmaps/fulllayerextent.xpm,
894            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
895            new icons.
896    
897    2003-05-06  Bernhard Herzog  <[email protected]>
898    
899            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
900            New. Simply delegate to the transient table's version.
901    
902            * test/test_transientdb.py
903            (TestTransientTable.test_auto_transient_table_query): New. Test
904            case for AutoTransientTable's SimpleQuery
905    
906    2003-05-06  Bernhard Herzog  <[email protected]>
907    
908            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
909            Implement a simple query method for the query dialog
910            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
911            the row index or shapeid.
912            (TransientTable.create): Insert the right value of the row index
913            (TransientJoinedTable.create): Copy the row index of the left
914            table to the joined result table
915    
916            * test/test_transientdb.py
917            (TestTransientTable.test_transient_table_read_twice): Fix
918            doc-string
919            (TestTransientTable.test_transient_table_query): New. Test for the
920            SimpleQuery method
921    
922    2003-05-06  Bernhard Herzog  <[email protected]>
923    
924            Convert all table users to use the new table interface. This only
925            covers Thuban itself, not GREAT-ER or other applications built on
926            Thuban yet, so the compatibility interface stays in place for the
927            time being but it now issues DeprecationWarnings.
928    
929            Finally, the new Table interface has a new method, HasColumn.
930    
931            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
932            issue deprecation warnings when they're. The warnings refer to the
933            caller of the method.
934            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
935            for the deprecation warnings
936    
937            * test/test_table.py: Ignore the deprecation warnings for the old
938            table in the tests in this module. The purpose of the tests is to
939            test the old interface, after all.
940    
941            * test/test_transientdb.py
942            (TestTransientTable.run_iceland_political_tests): Use the
943            constants for the types. Add a test for HasColumn
944            (TestTransientTable.test_transient_joined_table): Adapt to new
945            table interface. Add a test for HasColumn
946            (TestTransientTable.test_transient_table_read_twice): Adapt to new
947            table interface
948    
949            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
950            Adapt to new table interface
951    
952            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
953            new table interface
954    
955            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
956            (RecordTable.SetTable): Adapt to new table interface
957    
958            * Thuban/UI/classifier.py (Classifier.__init__)
959            (Classifier.__init__): Adapt to new table interface
960    
961            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
962            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
963            to new table interface
964    
965            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
966            (AutoTransientTable.HasColumn): Implement the new table interface
967            method
968            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
969            (AutoTransientTable.UniqueValues): Adapt to new table interface
970    
971            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
972            Adapt to new table interface
973    
974            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
975            simplify opening shapefiles a bit easier.
976            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
977            (TestLayer.test_point_layer): Use the new helper method
978            (TestLayer.test_get_field_type): New. Test for the GetFieldType
979            method
980    
981            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
982            the new table method
983    
984            * test/test_memory_table.py (TestMemoryTable.test_has_column):
985            Test for the new table method HasColumn
986    
987    2003-05-06  Jonathan Coles   <[email protected]>
988    
989            Addresses the "Selection Extent" wish of RTbug #1787.
990    
991            * Resources/Bitmaps/fulllayerextent.xpm,
992            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
993            extent. These are just place holders for the real bitmaps.
994    
995            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
996            calculate the bounding box once (the first time compute_bbox() is
997            called).
998            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
999            the bounding box for the shapes in lat/long coordinates.
1000    
1001            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1002            option.
1003            (MainWindow.has_selected_shapes): New. Returns true if there are
1004            any selected shapes.
1005            (MainWindow.FullSelectionExtent): New. Calls
1006            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1007            (_has_selected_shapes): New. Returns true if there are any
1008            selected shapes.
1009    
1010            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1011            true if there are any selected shapes.
1012    
1013            * Thuban/UI/view.py (MapCanvas): Added delegated method
1014            HasSelectedShapes.
1015            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1016            shapes on the canvas using the map projection (if any).
1017    
1018            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1019            for Layer.ShapesBoundingBox().
1020    
1021    2003-05-06  Bernhard Herzog  <[email protected]>
1022    
1023            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1024    
1025    2003-05-05  Jonathan Coles   <[email protected]>
1026    
1027            Addresses the "Full Layer Extent" wish of RTbug #1787.
1028    
1029            * Resources/Projections/defaults.proj: Added UK National Grid.
1030    
1031            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1032            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1033            when the user selects the menu option.
1034    
1035            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1036            scales the given layer on the canvas using the map projection.
1037    
1038    2003-05-05  Bernhard Herzog  <[email protected]>
1039    
1040            Convert the table implementations to a new table interface. All
1041            tables use a common mixin class to provide backwards compatibility
1042            until all table users have been updated.
1043    
1044            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1045            provide backwards compatibility for table classes implementing the
1046            new interface
1047            (DBFTable, MemoryTable): Implement the new table interface. Use
1048            OldTableInterfaceMixin as base for compatibility
1049            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1050            and MemoryTable resp.
1051    
1052            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1053            the new table interface.
1054    
1055            * test/test_memory_table.py: New. Test cases for the MemoryTable
1056            with the new table interface.
1057    
1058            * test/test_table.py: Document the all tests in this file as only
1059            for backwards compatibility. The equivalent tests for the new
1060            interface are in test_memory_table.py and test_dbf_table.py
1061            (MemoryTableTest.test_read): field_info should be returning tuples
1062            with four items
1063            (MemoryTableTest.test_write): Make doc-string a more precise.
1064    
1065            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1066            table interface. Derive from from OldTableInterfaceMixin for
1067            compatibility.
1068            (TransientTableBase.create): New intance variable column_map to
1069            map from names and indices to column objects
1070            (TransientTable.create): Use the new table interface of the input
1071            table
1072            (AutoTransientTable): Convert to new table interface. Derive from
1073            from OldTableInterfaceMixin for compatibility.
1074            (AutoTransientTable.write_record): Removed. It's not implemented
1075            yet and we still have to decide how to handle writing with the new
1076            table and data framework.
1077    
1078            * test/test_transientdb.py
1079            (TestTransientTable.run_iceland_political_tests)
1080            (TestTransientTable.test_transient_joined_table): Use the new
1081            table interface
1082    
1083    2003-05-05  Jonathan Coles   <[email protected]>
1084    
1085            This is namely a collection of UI updates to improve user interactivity.
1086            Tabbing between controls now exists and you can use ESC to close dialog
1087            boxes; ENTER will active the default button.
1088    
1089            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1090            order that the controls are created so that tabbing works correctly.
1091            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1092            wxDialog can handle the default button correctly.
1093            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1094            same reasons as for OnOK.
1095            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1096            when we ask the table for the maximum/minimum values of a field
1097            which could take a very long time.
1098    
1099            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1100            order that the controls are created so that tabbing works correctly.
1101            (SelectPropertiesDialog.__init__): Rearrange the order that the
1102            controls are created so that tabbing works correctly.
1103    
1104            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1105            to derive from a wxDialog but behave like the original implementation
1106            which was derived from a wxFrame. wxDialog provides useful key
1107            handling functionality like ESC calling OnCancel and ENTER calling
1108            OnOK which is lost with wxFrame.
1109    
1110            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1111            new dialogs.
1112    
1113            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1114            order that the controls are created so that tabbing works correctly.
1115            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1116            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1117            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1118            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1119            can provide the "UK National Grid" as a default projection.
1120            (UTMPanel.__init__): Rearrange the order that the controls are
1121            created so that tabbing works correctly.
1122    
1123    2003-05-05  Bernhard Herzog  <[email protected]>
1124    
1125            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1126            (project_point): If a map projection but no layer projection is
1127            given, convert degrees to radians before applying the map
1128            projection.
1129    
1130            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1131            (TableGrid.allow_messages): New methods to make it possible to
1132            inhibit message sending.
1133            (TableGrid.issue): Only send the message if not inhibited.
1134            (LayerTableGrid.select_shape): Use the new methods to make sure
1135            that no ROW_SELECTED message is sent while we're updating the
1136            selected rows to match the selected shapes.
1137    
1138    2003-05-02  Jan-Oliver Wagner <[email protected]>
1139    
1140            Implementation of MemoryTable.
1141    
1142            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1143            implementation that operates on a list of tuples. All of the data
1144            are kept in the memory.
1145    
1146            * test/test_table.py (MemoryTableTest): New.
1147    
1148            * test/test_transientdb.py (SimpleTable): Removed.
1149            (TestTransientTable.test_transient_joined_table,
1150            (TestTransientTable.test_transient_table_read_twice): Replaced
1151            SimpleTable by MemoryTable.
1152    
1153    2003-04-30  Jonathan Coles   <[email protected]>
1154    
1155            * Data/iceland_sample.thuban: Now contains correct projections
1156            for each of the layers.
1157    
1158            * Resources/Projections/defaults.proj: Geographic projection
1159            contains unit conversion parameter.
1160    
1161    2003-04-30  Jonathan Coles   <[email protected]>
1162    
1163            The most important part of this putback is the projection changes.
1164            It should now be possible to specify the projection that a layer
1165            is in and then specify a different projection for the map. The
1166            projection dialog has an extra parameter for a geographic projection
1167            which lets the user select if the input is in degrees or radians.
1168    
1169            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1170            to say that the parameter is a tuple of unprojected
1171            points (which is what the callers to this method were assuming).
1172            Also, since the points are unprojected we need to projected them.
1173    
1174            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1175            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1176            groups are selected, move the layer up/down. Fixes RTbug #1833.
1177    
1178            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1179    
1180            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1181            parameter in call to SetClientData.
1182            (GeoPanel): Add support for selecting the units that the
1183            source data is in (Radians or Degrees).
1184    
1185            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1186            the rendering loop by reducing the number of if's, removing the
1187            unnecessary try/except block, and checking if the old group
1188            is the same as the new one (which happens a lot if there is
1189            no classification, or lots of shapes are in the same group).
1190    
1191            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1192            around the redraw routine to try to catch problems that the user
1193            may create by selecting invalid projections for the data set and
1194            map. Clears the display if there are any problems and prints the
1195            error.
1196            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1197            rectangle.
1198    
1199            * extensions/thuban/wxproj.cpp (project_point): First invert the
1200            supplied point (which should be in projected coordinates) using
1201            the layer's projection and then project the point using the
1202            map's projection.
1203            (project_points): Use project_point() to project each point.
1204    
1205    2003-04-30  Jan-Oliver Wagner <[email protected]>
1206    
1207            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1208            don't set the Classification to None if the classfication field
1209            is None (ie only a DEFAULT).
1210    
1211    2003-04-30  Bernhard Herzog  <[email protected]>
1212    
1213            * Thuban/UI/view.py: Fix some typos.
1214    
1215            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1216            not pop up the dialog if the selection becomes empty (this could
1217            happen if e.g. a new selection is opened while the identify tool
1218            is active and dialog had been closed)
1219    
1220    2003-04-30  Bernhard Herzog  <[email protected]>
1221    
1222            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1223            instance variable read_record_last_result
1224            (TransientTableBase.read_record): Make sure reading the same
1225            record twice works. The implementation uses the new instance
1226            variable read_record_last_result
1227    
1228            * test/test_transientdb.py
1229            (TestTransientTable.test_transient_table_read_twice): New test
1230            case for the above bug-fix.
1231    
1232    2003-04-29  Jonathan Coles   <[email protected]>
1233    
1234            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1235    
1236            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1237    
1238            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1239            (ClassTable.SetValueAsCustom): Rename keyword argument in
1240            ClassGroup* constructors to match argument name.
1241    
1242    2003-04-29  Bernhard Herzog  <[email protected]>
1243    
1244            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1245            transient DB if it exists to make sure it doesn't leave a journal
1246            file in the temp directory.
1247    
1248            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1249            self.conn to None after closing the connection to make sure it's
1250            not closed twice
1251    
1252    2003-04-29  Jonathan Coles   <[email protected]>
1253    
1254            Add a visible parameter in the layer XML tag. The default value is
1255            "true". If anything other than "false" is specified we also assume
1256            "true". Addresses RTbug #1025.
1257    
1258            * Doc/thuban.dtd: Add visible parameter to a layer.
1259    
1260            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1261            of visible from 1 to True.
1262            (Layer.__init__): Change default value of visible from 1 to True.
1263    
1264            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1265            parameter.
1266    
1267            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1268            parameter.
1269    
1270            * test/test_load.py: Add new test data contents_test_visible.
1271            (LoadSessionTest.setUp): save test data.
1272            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1273            is loaded correctly.
1274    
1275            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1276            for saving an invisible layer.
1277    
1278    2003-04-29  Jonathan Coles   <[email protected]>
1279    
1280            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1281            legend dialog box and tell it to change its map to the one
1282            supplied to SetMap(). Fixes RTbug #1770.
1283    
1284    2003-04-29  Bernhard Herzog  <[email protected]>
1285    
1286            Next step of table implementation. Introduce a transient database
1287            using SQLite that some of the data is copied to on demand. This
1288            allows us to do joins and other operations that require an index
1289            for good performance with reasonable efficiency. Thuban now needs
1290            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1291            haven't tested that.
1292            
1293            * Thuban/Model/transientdb.py: New. Transient database
1294            implementation.
1295    
1296            * test/test_transientdb.py: New. Tests for the transient DB
1297            classes.
1298    
1299            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1300            classes to help automatically remove temporary files and
1301            directories.
1302            (Session.__init__): New instance variables temp_dir for the
1303            temporary directory and transient_db for the SQLite database
1304            (Session.temp_directory): New. Create a temporary directory if not
1305            yet done and return its name. Use AutoRemoveDir to have it
1306            automatically deleted
1307            (Session.TransientDB): Instantiate the transient database if not
1308            done yet and return it.
1309    
1310            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1311            AutoTransientTable so that data is copied to the transient DB on
1312            demand.
1313            (SimpleStore): New class that simply combines a table and a
1314            shapefile
1315    
1316            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1317            DBFTable and update its doc-string to reflect the fact that this
1318            is only the table interface to a DBF file. Table is now an alias
1319            for DBFTable for temporary backwards compatibility.
1320    
1321            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1322            the last reference to the session goes away so that the temporary
1323            files are removed properly.
1324    
1325            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1326            reference to the session to make sure the temporary files are
1327            removed.
1328    
1329    2003-04-29  Bernhard Herzog  <[email protected]>
1330    
1331            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1332            the __parser instance variable into a normal local variable in
1333            read. It's only used there and read will never be called more than
1334            once. Plus it introduces a reference cycle that keeps can keep the
1335            session object alive for a long time.
1336    
1337    2003-04-29  Jonathan Coles   <[email protected]>
1338    
1339            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1340            Projection an immutable item. Fixes RTbug #1825.
1341            (Projection.__init__): Initialize instance variables here.
1342            (ProjFile.Replace): New. Replace the given projection object with
1343            the new projection object. This solves the problem of needing the
1344            mutator Projection.SetProjection() in the ProjFrame class and
1345            allows a projection to change parameters without changing its
1346            location in the file.
1347    
1348            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1349            be of type wxSAVE and should verify overwriting a file.
1350    
1351            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1352            ProjFile.Replace() method instead of the mutator
1353            Projection.SetProjection(). Also requires that we reassign the
1354            client data to the new projection.
1355    
1356            * test/test_proj.py (TestProjection.test): Test GetName() and
1357            GetAllParameters()
1358            (TestProjFile.test): Remove tests for Set*() methods. Add tests
1359            for Replace().
1360    
1361    2003-04-25  Jonathan Coles   <[email protected]>
1362    
1363            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1364            to save the name of the projection.
1365    
1366            * test/test_save.py (SaveSessionTest.testLayerProjection): New
1367            test to verify layer projections are saved correctly.
1368    
1369    2003-04-25  Jonathan Coles   <[email protected]>
1370    
1371            * Thuban/Model/proj.py (Projection.SetName): Set the name
1372            to "Unknown" if name is None.
1373            (Projection.SetAllParameters): New. Set the projection's
1374            parameter list to the one supplied.
1375            (Projection.SetProjection): New. Set the projection's
1376            properties to those of the supplied Projection.
1377    
1378            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1379            the dialog title to include the map's title.
1380            (MainWindow.LayerProjection): Set the dialog title to include
1381            the layer's title.
1382    
1383            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1384            error dialogs into a single method call.
1385            (ProjFrame.__VerifyButtons): Add more states to check.
1386            (ProjFrame.__GetProjection): Return the current state of an
1387            edited projection or None.
1388            (ProjFrame.__FillAvailList): Remove checks for states that
1389            shouldn't exist.
1390            (ProjFrame._OnNew): Clear all selected items and supply
1391            a projection panel if necessary.
1392    
1393            * test/test_proj.py (TestProjFile.test): Add tests for
1394            ProjFile.SetAllParameters, ProjFile.SetProjection,
1395            ProjFile.SetName.
1396    
1397    2003-04-25  Jonathan Coles   <[email protected]>
1398    
1399            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1400            takes an optional argument to select the current projection.
1401            This does not guarantee that the item is visible due to
1402            limited wxWindows functionality. Fixes RTBug #1821.
1403    
1404    2003-04-25  Jonathan Coles   <[email protected]>
1405    
1406            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
1407            the projection name and use it when constructing the Projection
1408            object.
1409    
1410            * Thuban/Model/proj.py (Projection.__init__): Change the default
1411            value for 'name' to None and then test if name is equal to None
1412            in the body of the constructor. This way the caller doesn't have to
1413            know what the default value should be. Namely, useful in load.py
1414            where we have to pick a default value if the 'name' parameter
1415            doesn't exist in the XML file.
1416    
1417            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
1418            Tests a file where a layer has a projection.
1419    
1420    2003-04-25  Jonathan Coles   <[email protected]>
1421    
1422            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
1423            tree for projection information.
1424    
1425            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
1426            XMLReader.GetFileName.
1427            (SessionLoader): Added support for loading projection tags that
1428            appear inside a layer.
1429    
1430            * Thuban/Model/proj.py (ProjFile): Document the class. Move
1431            back to using a list because the order of the projections in
1432            the file is important to maintain. Fixes RTbug #1817.
1433    
1434            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
1435            to ProjFile.GetFilename.
1436    
1437            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
1438            information.
1439    
1440            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
1441            ProjFrame._OnSaveAs. Removed old dead code from previous
1442            implementation.
1443            (ProjFrame._OnExport): Add support for exporting more than one
1444            projection to a single file.
1445            (ProjFrame.__FillAvailList): use string formatting (% operator)
1446            to build strings that are (partly) translated. Fixes RTbug #1818.
1447    
1448            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
1449            class.
1450    
1451    2003-04-24  Bernhard Herzog  <[email protected]>
1452    
1453            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
1454    
1455            * po/fr.po: New. French translation by Daniel Calvelo Aros
1456    
1457            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
1458            empty strings.
1459    
1460    2003-04-24  Jonathan Coles   <[email protected]>
1461    
1462            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
1463            implement the interface that the ProjFrame dialog expects.
1464    
1465            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
1466            name of the projection to be changed.
1467            (ProjFile): Use a dictionary instead of a list so that removing
1468            projections is easier and we are sure about uniqueness.
1469            (ProjFile.Remove): Remove the given projection object.
1470    
1471            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
1472            Return a list with only one projection file instead of searching for
1473            any projection file. This simplifies many things if the user can
1474            only have one system file and one user file.
1475    
1476            * Thuban/UI/classgen.py: Change all references to
1477            genCombo to genChoice.
1478    
1479            * Thuban/UI/mainwindow.py: Add a Projection option under the
1480            layer menu.
1481            (MainWindow.LayerProjection): New. Open up a projection window
1482            for a layer.
1483    
1484            * Thuban/UI/projdialog.py: Large changes to how the dialog is
1485            laid out. Use three panels instead of one. One for the list of
1486            projections, one for the edit controls, and one for the buttons.
1487            Fixed resizing problems so that the dialog resizes correctly
1488            when the projection panel changes. Added import/export, save, and
1489            new buttons/functionality.
1490    
1491    2003-04-24  Bernhard Herzog  <[email protected]>
1492    
1493            First step towards table management. Introduce a simple data
1494            abstraction so that we replace the data a layer uses more easily
1495            in the next step.
1496    
1497            * Thuban/Model/data.py: New file with a simple data abstraction
1498            that bundles shapefile and dbffile into one object.
1499    
1500            * Thuban/Model/session.py (Session.OpenShapefile): New method to
1501            open shapefiles and return a shape store object
1502    
1503            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
1504            object instead of a shapefile filename. This introduces a new
1505            instance variable store holding the datastore. For intermediate
1506            backwards compatibility keep the old instance variables.
1507            (open_shapefile): Removed. No longer needed with the shape store.
1508            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
1509            get the shape store used by a layer.
1510            (Layer.Destroy): No need to explicitly destroy the shapefile or
1511            table anymore.
1512    
1513            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
1514            (MainWindow.AddLayer): Use the session's OpenShapefile method to
1515            open shapefiles
1516    
1517            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
1518            session's OpenShapefile method to open shapefiles
1519    
1520            * test/test_classification.py
1521            (TestClassification.test_classification): Use the session's
1522            OpenShapefile method to open shapefiles and build the filename in
1523            a more platform independed way
1524    
1525            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1526            Implement to have a session to use in the tests
1527            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1528            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
1529            session's OpenShapefile method to open shapefiles
1530            (TestLayerLegend.setUp): Instantiate a session so that we can use
1531            it to open shapefiles.
1532            (TestLayerLegend.tearDown): Make sure that all references to
1533            layers and session are removed otherwise we may get a resource
1534            leak
1535    
1536            * test/test_map.py (TestMapAddLayer.test_add_layer)
1537            (TestMapWithContents.setUp): Instantiate a session so that we can
1538            use it to open shapefiles.
1539            (TestMapWithContents.tearDown): Make sure that all references to
1540            layers, maps and sessions are removed otherwise we may get a
1541            resource leak
1542            ("__main__"): use support.run_tests() so that more info about
1543            uncollected garbage is printed
1544    
1545            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
1546            session's OpenShapefile method to open shapefiles
1547            ("__main__"): use support.run_tests() so that more info about
1548            uncollected garbage is printed
1549    
1550            * test/test_selection.py (TestSelection.tearDown): Make sure that
1551            all references to the session and the selection are removed
1552            otherwise we may get a resource leak
1553            (TestSelection.get_layer): Instantiate a session so that we can
1554            use it to open shapefiles.
1555            ("__main__"): use support.run_tests() so that more info about
1556            uncollected garbage is printed
1557    
1558            * test/test_session.py (TestSessionBase.tearDown)
1559            (TestSessionWithContent.tearDown): Make sure that all references
1560            to the session and layers are removed otherwise we may get a
1561            resource leak
1562            (TestSessionWithContent.setUp): Use the session's OpenShapefile
1563            method to open shapefiles
1564    
1565    2003-04-24  Jonathan Coles   <[email protected]>
1566    
1567            * Thuban/Model/load.py (XMLReader.read): Should have been checking
1568            if the file_or_filename object had the 'read' attribute.
1569    
1570    2003-04-23  Jonathan Coles   <[email protected]>
1571    
1572            * Thuban/Model/resource.py: Fixes RTbug #1813.
1573            (ReadProjFile): Add documentation about which exceptions are raised.
1574            Always pass the exceptions up to the caller.
1575            (GetProjFiles): If the directory can't be read return an empty list.
1576            If any of the proj files can't be read skip that file and go
1577            on to the next one.
1578    
1579            * test/test_proj.py: Added test cases to handle nonexistent files,
1580            unreadable files, and files that don't parse correctly.
1581    
1582    2003-04-23  Jonathan Coles   <[email protected]>
1583    
1584            Projection dialog. Allows the user to select from a list
1585            of projection templates and optionally edit them and save new ones.
1586    
1587            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
1588            (ProjPanel): Base class for projection specific panels.
1589            (TMPanel): Projection panel for Transverse Mercartor.
1590            (UTMPanel): Projection panel for Universal Transverse Mercartor.
1591            (LCCPanel): Projection panel for Lambert Conic Conformal.
1592            (GeoPanel): Projetion panel for Geographic Projection.
1593    
1594    2003-04-23  Jonathan Coles   <[email protected]>
1595    
1596            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
1597            promote symmetry. There now exists XMLReader and XMLWriter.
1598            (XMLReader.read): New. Call to read the given file descriptor or
1599            filename.
1600            (XMLReader.close): New. Make sure the file is closed.
1601            (XMLReader.GetFileName): New. Return just the file name that is being
1602            read from.
1603            (XMLReader.GetDirectory): New. Return just the directory of the file
1604            that is being read.
1605            (XMLReader.AddDispatchers): New. Take a dictionary which contains
1606            the names of functions to call as the XML tree is parsed.
1607            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
1608            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
1609            (SessionLoader): Removed class variables start_dispatcher and
1610            end_dispatcher since this functionality is now part of a class
1611            instance. Fixes RTbug #1808.
1612            (SessionLoader.__init__): Add dispatcher functions.
1613            (load_xmlfile): Code was moved into the XMLReader.read().
1614            (load_session): Use modified SessionLoader.
1615    
1616            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
1617            map's projection.
1618    
1619            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
1620            GetAllParameters.
1621            (Projection.GetParameter): Returns the value for the given parameter.
1622    
1623            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
1624            (GetProjFiles): Renamed from GetProjections. Now returns a list
1625            of ProjFile objects.
1626            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
1627            a list of ProjFile objects whose files are not user defined.
1628            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
1629            list of ProjFile objects whose files are user defined.
1630            (ProjFileReader): Extend new XMLReader.
1631    
1632            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
1633            promote symmetry.
1634    
1635            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
1636            control instead of a wxComboBox. wxChoice controls do not generate
1637            events as the uses highlights possible choices which fixes problems
1638            with resizing the dialog when the use selects an option.
1639    
1640            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
1641            control instead of a wxComboBox.
1642    
1643            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
1644            dialog.
1645    
1646            * test/test_proj.py (TestProjection.test): New tests for GetParameter
1647            method.
1648    
1649    2003-04-22  Bernhard Herzog  <[email protected]>
1650    
1651            * Thuban/UI/mainwindow.py: Remove some unused imports and global
1652            constants
1653    
1654            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1655            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
1656    
1657    2003-04-17  Bernhard Herzog  <[email protected]>
1658    
1659            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
1660            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
1661            anymore.
1662            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
1663            (Layer.ShapeType, Layer.Shape): No need to call
1664            self.open_shapefile since it's always called in __init__
1665    
1666            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
1667            In wxPython 2.4 there's no need to extend MainLoop anymore since
1668            wxPython itself makes sure OnExit is called.
1669    
1670    2003-04-16  Jonathan Coles   <[email protected]>
1671    
1672            Initial putback of projection management code. Includes new
1673            classes to read and write projection files. The current load
1674            and save classes were abstracted a bit so they could be reused.
1675            The Projection class was extended to provide new methods and
1676            have a name.
1677    
1678            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
1679            general XML reading methods that were part of ProcessSession.
1680    
1681            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
1682            name.
1683            (ProjFile): New. Represents a file that contains projection
1684            information.
1685    
1686            * Thuban/Model/resource.py: New. Contains general utilities
1687            for read and writing projection files.
1688    
1689            * Thuban/Model/save.py (XMLSaver): New. Contains all the
1690            general XML writing methods that were part of SessionSaver.
1691            (SessionSaver): Renamed from Saver.
1692    
1693            * test/test_proj.py: New test cases for the projection
1694            file read and write functions.
1695    
1696    2003-04-16  Jonathan Coles   <[email protected]>
1697    
1698            * Thuban/Model/classification.py: Use repr() around values
1699            in the ClassGroup*.__repr__() methods so it is clearer when
1700            a value is a string and when it is a number.
1701    
1702            * test/test_load.py: Rework the classification test to test
1703            that we can load old files.
1704            (testLabels): Test a file where the groups have labels.
1705    
1706    2003-04-16  Bernhard Herzog  <[email protected]>
1707    
1708            Safer implementation of the performance enhancements of the
1709            low-level renderer:
1710            
1711            * extensions/thuban/wxproj.cpp (extract_projection)
1712            (extract_pointer): Rename extract_projection to extract_pointer
1713            and redefine its purpose to return the pointer stored in a CObject
1714            returned by the object's cobject method. Update all callers.
1715            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
1716            handling of these low-level parameters so that each s_draw_info
1717            instance is handled as a CObject at python level that also
1718            contains real references to the actual python objects which
1719            contain the values in the struct. Add free_draw_info as the
1720            destructor.
1721            (draw_polygon_shape): Add the py_draw_info parameter which must a
1722            cobject containing an s_draw_info pointer.
1723    
1724            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
1725            method to instantiat the low-level render parameter
1726            (MapRenderer.draw_shape_layer): Use the new method. Remove some
1727            commented out code.
1728            (MapRenderer.draw_polygon_shape): Make the first parameter not the
1729            layer but the low-level render parameter
1730            (ScreenRenderer.draw_shape_layer): Use the low-level render
1731            parameter.
1732    
1733    2003-04-15  Jonathan Coles   <[email protected]>
1734    
1735            * Thuban/Model/classification.py: Implemented __repr__ for
1736            the ClassGroup* classes to make debugging a bit easier.
1737            (ClassGroup.SetLabel): Check that the string is an instance
1738            of StringTypes not StringType. Accounts for Unicode strings.
1739    
1740            * Thuban/Model/color.py: Implemented __repr__ to make
1741            debugging a bit easier.
1742    
1743            * Thuban/Model/save.py (Saver.write_classification): Need to
1744            save the group label.
1745    
1746            * test/test_load.py (testClassification): New. Loads the
1747            iceland_sample_test.thuban file and checks if it was loaded
1748            correctly.
1749    
1750    2003-04-15  Jonathan Coles   <[email protected]>
1751    
1752            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
1753            to improve rendering performance by initializing the variables
1754            that are not change each time draw_polygon_shape() is called.
1755            The values are stored in a global struct draw_info.
1756            (draw_polygon_shape): Removed initialization code that is
1757            now in draw_polygon_init().
1758    
1759            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
1760            drawing initialization call to draw_polygon_init()
1761            (MapRenderer.draw_polygon_shape): Use new signature of
1762            draw_polygon_shape.
1763    
1764            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
1765            weirdness by setting the range to (1, maxint).
1766    
1767            * Thuban/Model/classification.py (ClassGroupProperties): Make
1768            instance variables private and optimize comparison operator
1769            by first checking if the color references are the same.
1770            (ClassGroupSingleton): Make instance variables private.
1771            (ClassGroupRange): Make instance variables private.
1772    
1773            * HOWTO-Release: Filled in missing steps for releasing packages.
1774    
1775    2003-04-15  Bernhard Herzog  <[email protected]>
1776    
1777            First stab at internationalized messages:
1778    
1779            * Thuban/__init__.py (_): Implement the translation function for
1780            real using the python gettext module.
1781    
1782            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
1783            translate empty strings.
1784    
1785            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1786            Add a missing space to a warning message
1787    
1788            * po/README: New. Notes about the management of the translation
1789            files.
1790    
1791            * po/Makefile: New. Makefile to help manage the translation files.
1792    
1793            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
1794    
1795            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
1796            translations and support files in po/
1797    
1798            * setup.py (data_files): Add the *.mo files to the data_files too
1799    
1800            * README: Add note about the translations when building from CVS
1801    
1802    2003-04-14  Jonathan Coles   <[email protected]>
1803    
1804            * Thuban/UI/dock.py: Fixes some window resizing problems most
1805            noticable under windows. Always assume the button bitmaps will
1806            be there. Code clean up.
1807            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
1808            images for the dock/undock button to the same images.
1809            Work around for RTbug #1801.
1810    
1811            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
1812            be allowed to grow within the sizer. Fixes a bug under Windows
1813            where the toolbar wasn't being drawn.
1814    
1815    2003-04-14  Frank Koormann   <[email protected]>
1816    
1817            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
1818            Updated design to try to make the button functionality more
1819            transparent.
1820    
1821    2003-04-14  Jonathan Coles   <[email protected]>
1822    
1823            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
1824            finalize the intialization of the panel.
1825    
1826            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
1827            creation of the panel. Should be the last thing called in the
1828            initializer of a subclass.
1829    
1830            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
1831            set the current selections in the combo boxes. This is needed
1832            under Windows.
1833    
1834            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
1835            level panel to the dialog so that the background colors are
1836            consistent under Windows.
1837    
1838    2003-04-11  Jonathan Coles   <[email protected]>
1839    
1840            * Thuban/UI/classgen.py: Change color ramps to start at white
1841            not black.
1842    
1843            * Thuban/UI/legend.py: Enable/disable the legend buttons when
1844            the legend changes. Fixes RTbug #1793.
1845    
1846            * test/test_classification.py: Added test for copying of
1847            classifications.
1848    
1849    2003-04-11  Jonathan Coles   <[email protected]>
1850    
1851            * Thuban/UI/resource.py: New. Centralize the loading of resources
1852            such as bitmaps.
1853    
1854            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
1855            added images to the move buttons, added 'reverse' button.
1856            (CustomRampPanel.__init__): Added images to the move buttons.
1857            (GreyRamp): New. Generates a ramp from white to black.
1858            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
1859    
1860            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
1861            ID_PROPERTY_*.
1862            (Classifier.__init__): Minor changes to the layout.
1863            (Classifier._OnTitleChanged): Listen for when the user edits the
1864            title and update the dialog's title and the layer's title.
1865    
1866            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
1867    
1868            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
1869            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
1870            if the layer's title changes.
1871    
1872            * Thuban/UI/mainwindow.py: Added new menu item and associated code
1873            to open a dialog to rename the map.
1874            (MainWindow): Use new resource class to import bitmaps.
1875    
1876    2003-04-11  Jonathan Coles   <[email protected]>
1877    
1878            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
1879            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
1880            Resources/Bitmaps/group_use_none.xpm,
1881            Resources/Bitmaps/group_use_not.xpm,
1882            Resources/Bitmaps/hide_layer.xpm,
1883            Resources/Bitmaps/layer_properties.xpm,
1884            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
1885            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
1886            New.
1887    
1888    2003-04-10  Jonathan Coles   <[email protected]>
1889    
1890            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
1891            Should pass group to ClassGroup constructor.
1892    
1893    2003-04-10  Jonathan Coles   <[email protected]>
1894    
1895            * Thuban/Model/classification.py: (ClassGroup): Move all the common
1896            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
1897            here. Implement SetVisible(), IsVisible().
1898            (ClassGroup.__init__): Add group parameter which acts as a copy
1899            constructor.
1900    
1901            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
1902            "Visible" check boxes.
1903            (Classifier): Rename the buttons and refactor the code to match
1904            the new labels.
1905    
1906            * Thuban/UI/legend.py: Classify button is now called "Properties".
1907            Refactored the code to change variable names.
1908            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
1909    
1910            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
1911            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
1912            renamed to MainWindow.LayerEditProperties.
1913            (MainWindow.ToggleLegend): Don't include map name in legend title.
1914            (MainWindow.SetMap): Added the map name to the window title.
1915            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
1916            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
1917            Functionality is found in the layer properties dialog.
1918    
1919            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1920            draw visible groups.
1921    
1922    2003-04-09  Jonathan Coles   <[email protected]>
1923    
1924            * Thuban/UI/classgen.py: Modifications to allow simple
1925            addition and selection of new color schemes.
1926            (MonochromaticRamp): New. Generates a ramp between two colors.
1927            (RedRamp): New. Generates a ramp of all red.
1928            (GreenRamp): New. Generates a ramp of all green.
1929            (BlueRamp): New. Generates a ramp of all blue.
1930    
1931    2003-04-09  Jonathan Coles   <[email protected]>
1932    
1933            * Thuban/Model/classification.py (Classification.__deepcopy__):
1934            Need to copy over field and fieldType attributes.
1935    
1936            * Thuban/Model/table.py (Table.field_range): New. Retrive the
1937            maximum and minimum values over the entire table for a given
1938            field.
1939            (Table.GetUniqueValues): New. Retrieve all the unique values
1940            in the table for a given field.
1941    
1942            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
1943            (GenUniquePanel): New. Controls to allow the user to select
1944            which unique field values they would like in the classification.
1945            (CustomRampPanel): Code that was in ClassGenDialog that allows
1946            the user to select the properties for a custom ramp.
1947            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
1948    
1949            * Thuban/UI/classifier.py: Removed a lot of debugging code.
1950            (Classifier._SetClassification): Callback method so that the
1951            class generator can set the classification in the grid.
1952            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
1953            editing of a group properties class into a wxWindows control.
1954    
1955            * Thuban/UI/dock.py: It was decided that if the user closes
1956            a dockable window the window should simply hide itself. That
1957            way if the user wants to show the dock again it appears in the
1958            same place as it was when it was closed.
1959            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
1960            (DockableWindow._OnButtonClose): Hide the window instead of
1961            destroying it.
1962            (DockableWindow._OnClose): Hide the window instead of
1963            destroying it.
1964    
1965            * Thuban/UI/legend.py (LegendTree): Use a private method to
1966            consistently set the font and style of the text. Fixes RTbug #1786.
1967    
1968            * Thuban/UI/mainwindow.py: Import just the Classifier class.
1969    
1970    2003-04-07  Bernhard Herzog  <[email protected]>
1971    
1972            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
1973            to the map module
1974    
1975    2003-04-07  Bernhard Herzog  <[email protected]>
1976    
1977            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
1978            favor of ToggleSessionTree
1979            (MainWindow.ToggleSessionTree): New method to toggle visibility of
1980            the session tree.
1981            (MainWindow.SessionTreeShown): New method to return whether the
1982            session tree is currently shown.
1983            (MainWindow.ToggleLegend): New method to toggle visibility of the
1984            legend
1985            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
1986            LegendShown
1987            (MainWindow.LegendShown): New method to return whether the legend
1988            is currently shown.
1989            (_method_command): Add checked parameter so we can define check
1990            menu items
1991            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
1992            mainwindow methods.
1993            (show_session_tree, show_legend commands): Removed.
1994            (toggle_session_tree, toggle_legend commands): New commands to
1995            toggle the visibility of the dialogs
1996    
1997    2003-04-07  Jonathan Coles   <[email protected]>
1998    
1999            * Thuban/UI/classgen.py: Fix Windows problem.
2000    
2001            * Thuban/UI/dock.py: Fix Windows problem.
2002    
2003            * Thuban/UI/mainwindow.py: Use False instead of false.
2004            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2005    
2006    2003-04-07  Jonathan Coles   <[email protected]>
2007    
2008            Since we now say that the order of the groups in a classification
2009            matters, it makes sense to be able to manipulate that order. Most
2010            of the changes to Thuban/Model/classification.py are to that end.
2011    
2012            * Thuban/Model/classification.py (Classification.AppendGroup,
2013            Classification.InsertGroup, Classification.ReplaceGroup,
2014            Classification.RemoveGroup, Classification.GetGroup): Do as the
2015            names imply.
2016            (Classification.FindGroup): This was called GetGroup, but GetGroup
2017            takes an index, while FindGroup takes a value.
2018            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2019            REFERENCE. Currently there is a cyclic reference between the layer
2020            and its classification. If the classification doesn't need to know
2021            its owning layer we can change this, since it may make sense to be
2022            able to use the same classification with different layers.
2023    
2024            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2025    
2026            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2027            not AddGroup()
2028    
2029            * Thuban/UI/classifier.py: Now that we can depend on the order in
2030            a Classification and have methods to manipulate that order we don't
2031            need to use our own data structures in the grid. We can simply make
2032            the grid/table access the information they need from a copy of
2033            the classification object.
2034            (Classifier._OnCloseBtn): Event handler for when the user clicks
2035            'Close'. This is needed so if the user applies changes and then
2036            continues to change the table the user has the option of discarding
2037            the most recent changes and keeping what they applied.
2038    
2039            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2040            into the same group.
2041    
2042            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2043            with a really old version of proj, PJ_VERSION won't even be defined.
2044            If it isn't defined then just compile so that the function always
2045            returns Py_False.
2046    
2047            * test/test_classification.py: Fix tests to use the renamed methods.
2048            Still need to write tests for the new methods.
2049    
2050    2003-04-04  Jonathan Coles   <[email protected]>
2051    
2052            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2053            call to SetSelection out of the method and before the call
2054            to __SelectField in __init__. This prevents a recursion of events
2055            when _OnFieldSelect is triggered by the user.
2056    
2057    2003-04-04  Jonathan Coles   <[email protected]>
2058    
2059            * Thuban/Model/classification.py: Rename Color.None to
2060            Color.Transparent.
2061            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2062            Don't bother copying the color, since Colors are immutable.
2063    
2064            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2065            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2066            Thuban/UI/renderer.py, Thuban/UI/view.py:
2067            Rename Color.None to Color.Transparent.
2068        
2069            * test/test_classification.py, test/test_load.py: Rename Color.None
2070            to Color.Transparent.
2071    
2072    2003-04-04  Jonathan Coles   <[email protected]>
2073    
2074            * Thuban/Model/classification.py: Fix assert calls.
2075            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2076            Copy the color parameter rather than hold onto a reference.
2077    
2078            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2079            the color object.
2080            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2081            are sure there exists only one refernce to Color.None in the system.
2082            This allows us to use 'is' rather than the comparision functions.
2083            
2084            * Thuban/Model/save.py: Fix assert calls.
2085            
2086            * Thuban/UI/classifier.py: Fix assert calls.
2087            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2088            dialog to edit the groups properties.
2089            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2090            correctly if a cell is resized.
2091            (ClassTable.SetClassification): New. Changes the classification
2092            that is in the table.
2093            (ClassTable.__SetRow): Allow groups to be prepended.
2094            (Classifier): New code for opening the EditProperties and
2095            GenerateRanges dialogs.
2096            (SelectPropertiesDialog.__GetColor): Only set the color in the
2097            color dialog if the current color is not None.
2098            
2099            * Thuban/UI/dock.py: Fix assert calls.
2100            
2101            * Thuban/UI/legend.py: Fix assert calls.
2102            
2103            * Thuban/UI/renderer.py: Fix assert calls.
2104            
2105            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2106            classifications.
2107            (GenRangePanel): Panel specific to range generation.
2108            (GenSingletonPanel): Panel specific to singleton generation.
2109            (ClassGenerator): Class responsible for actually generating
2110            the classification from the data gathered in the dialog box.
2111            (PropertyRamp): Generates properties whose values range from
2112            a starting property to an ending property.
2113    
2114    2003-04-03  Bernhard Herzog  <[email protected]>
2115    
2116            * test/support.py (print_garbage_information): New function that
2117            prints information about still connected messages and memory
2118            leaks.
2119            (run_suite): Removed.
2120            (run_tests): New function for use as a replacement of
2121            unittest.main in the test_* files. This one calls
2122            print_garbage_information at the end.
2123    
2124            * test/runtests.py (main): Use support.print_garbage_information
2125    
2126            * test/test_layer.py: Use support.run_tests instead of
2127            unittest.main so we get memory leak information
2128            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2129            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2130            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2131            to fix a memory leak.
2132    
2133            * test/test_classification.py: Use support.run_tests instead of
2134            unittest.main so we get memory leak information
2135            (TestClassification.test_classification): Call the layer's Destroy
2136            method to fix a memory leak.
2137    
2138    2003-04-02  Bernhard Herzog  <[email protected]>
2139    
2140            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2141            Handle the reference counts of the return value and errors in
2142            PyArg_ParseTuple correctly.
2143    
2144            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2145            sure the filename is absolute to avoid problems when saving the
2146            session again
2147    
2148            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2149    
2150    2003-04-01  Jonathan Coles   <[email protected]>
2151    
2152            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2153            that there actually are points in the returned list of points
2154            before trying to index into the list. The list may be empty if
2155            the shape is a Null Shape.
2156    
2157    2003-04-01  Bernhard Herzog  <[email protected]>
2158    
2159            * test/test_map.py: Don't use from <module> import *
2160    
2161    2003-04-01  Jonathan Coles   <[email protected]>
2162    
2163            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2164            LAYER_LEGEND_CHANGED
2165    
2166            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2167            self.Destroy() to close the window after yesterday's changes.
2168    
2169            * test/test_map.py, test/test_session.py: Fix messages that
2170            are sent from maps and layers.
2171    
2172    2003-03-31  Jonathan Coles   <[email protected]>
2173    
2174            * Thuban/UI/classifier.py: Commented out some debugging statements.
2175            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2176            RTbug #1769.
2177    
2178            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2179            position (although position doesn't work yet under GTK).
2180            (DockableWindow.Destroy): New. Called when the window must be
2181            closed. Namely needed when the DockFrame closes and must close
2182            its children.
2183            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2184    
2185            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2186            when then window is told to close.
2187            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2188            comment in source for more info.
2189    
2190            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2191    
2192            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2193            symmetry with other such methods.
2194            (MainWindow.ShowLegend): Show the legend docked by default.
2195    
2196    2003-03-28  Jonathan Coles   <[email protected]>
2197    
2198            * Thuban/UI/classifier.py: Support for highlighting a specific
2199            group within the grid when the classification dialog is opened.
2200            Also contains a lot of debugging printouts which will later
2201            be removed.
2202    
2203            * Thuban/UI/dock.py: Complete rework on the dock code so that
2204            that it is fairly removed from the rest of the Thuban application.
2205            It is easy to add new docks which the rest of the program having
2206            to be aware of them.
2207    
2208            * Thuban/UI/legend.py: Modifications to support selecting a
2209            specific group in the classification dialog. Changed how layers
2210            are drawn when the layer is visible/invisible.
2211    
2212            * Thuban/UI/mainwindow.py: Removed legend specific code and
2213            replaced it with calls to the new dock code.
2214    
2215            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2216            to check if scale > 0. Trying to track down a divide by zero.
2217    
2218    2003-03-26  Jonathan Coles   <[email protected]>
2219    
2220            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2221            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2222            now part of DockableWindow.
2223            (LegendPanel.DoOnSelChanged): Select the current layer in the
2224            map.
2225            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2226            with the selected layer and/or group.
2227    
2228    2003-03-26  Jonathan Coles   <[email protected]>
2229    
2230            This putback contains the code for dockable windows. There is
2231            no support in wxWindows as of this date for windows that can
2232            attach themselves to other windows.
2233    
2234            The current model contains a DockableWindow which has a parent
2235            window for when it is detached and a dock window that it puts
2236            its contents in when it is docked. The contents of a DockableWindow
2237            must be a DockPanel. DockPanel itself derives from wxPanel.
2238    
2239            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2240            message, not a LAYER_LEGEND_CHANGED message.
2241    
2242            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2243    
2244            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2245            as one of the style properties for the fieldTypeText item to
2246            be sure that its size is correct when the text changes.
2247    
2248            * Thuban/UI/dock.py: New. Classes for the DockPanel and
2249            DockableWindow.
2250    
2251            * Thuban/UI/legend.py: Added some more buttons and made the
2252            LegendPanel a DockPanel.
2253    
2254            * Thuban/UI/mainwindow.py: Added sash windows to the main window
2255            and supporting functions for manipulating the sashes.
2256            (MainWindow.ShowLegend): Create a DockableWindow with the
2257            LegendPanel as the contents.
2258    
2259            * Thuban/UI/messages.py: Added DOCKABLE_* messages
2260    
2261            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2262            not LAYER_LEGEND_CHANGED, messages.
2263    
2264  2003-03-25  Jonathan Coles   <[email protected]>  2003-03-25  Jonathan Coles   <[email protected]>
2265    
2266          * setup.py: Added custom script bdist_rpm_build_script so that          * setup.py: Added custom script bdist_rpm_build_script so that

Legend:
Removed from v.554  
changed lines
  Added in v.1059

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26