/[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 662 by jonathan, Mon Apr 14 14:16:14 2003 UTC revision 1015 by jan, Fri May 23 09:26:40 2003 UTC
# Line 1  Line 1 
1    2003-05-23  Jan-Oliver Wagner <[email protected]>
2    
3            Introducing QueryTableFrame and a very coarse ShowTable implementation.
4    
5            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
6            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7            The latter implements the selection GUI without dependency on a layer.
8            LayerTableFrame now is derived from QueryTableFrame and connects
9            to a layer.
10    
11            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
12            implementation that still needs work.
13    
14            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
15    
16    2003-05-22  Frank Koormann  <[email protected]>
17    
18            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
19            Added "outer_join = False" as optional parameter.
20            (TransientJoinedTable.create): If outer join is true, perform a
21            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
22            the left table. Records not matching are filled with 0 / None.
23    
24            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
25            (JoinDialog.OnJoin): Consider outer join check box.
26    
27    2003-05-22  Bernhard Herzog  <[email protected]>
28    
29            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
30            somewhat safer way. Storing the traceback in a local variable can
31            lead to memory leaks
32    
33    2003-05-22  Bernhard Herzog  <[email protected]>
34    
35            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
36            the wxMessageDialog's Destroy() method.
37    
38    2003-05-22  Frank Koormann  <[email protected]>
39    
40            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
41            TransientTable.Title()
42    
43    2003-05-22  Frank Koormann  <[email protected]>
44    
45            Join Dialog, initial version.
46    
47            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
48    
49            * Thuban/UI/join.py (JoinDialog): Functional implementation of
50            former framework. Renamed Table1/Table2 to LeftTable/RightTable
51            in all occurences.
52    
53            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
54            Typo fixed.
55    
56    2003-05-22  Bernhard Herzog  <[email protected]>
57    
58            Give the tables titles so that the GUI can display more meaningful
59            names. For now the titles are fixed but depend on e.g. filenames
60            or the titles of the joined tables.
61    
62            * Thuban/Model/transientdb.py (TransientTable.Title)
63            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
64    
65            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
66    
67            * test/test_transientdb.py
68            (TestTransientTable.test_auto_transient_table_title): New. Test
69            for the Title method
70            (TestTransientTable.test_transient_joined_table)
71            (TestTransientTable.test_transient_table): Add test for the Title
72            methods
73    
74            * test/test_memory_table.py (TestMemoryTable.test_title): New.
75            Test for the Title method
76    
77            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
78            the Title method
79    
80    2003-05-22  Bernhard Herzog  <[email protected]>
81    
82            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
83            Provide a better way to destroy the layers
84            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
85            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
86            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
87            the new way to destroy the layers.
88            (TestLayer.test_derived_store): New. Test for using a layer with a
89            DerivedShapeStore
90    
91            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
92            filename if the shape store actually has one.
93    
94    2003-05-22  Bernhard Herzog  <[email protected]>
95    
96            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
97            for the filename
98    
99            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
100            for the FileName method
101            (TestDBFTableWriting.test_write): Fix spelling of filename
102    
103    2003-05-22  Thomas Koester  <[email protected]>
104    
105            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
106            from SciParam that now really is immutable.
107    
108    2003-05-22  Frank Koormann  <[email protected]>
109    
110            Layer Top/Bottom placement added to legend.
111    
112            * Thuban/UI/legend.py
113            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
114            bound to tool events.
115            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
116            New, methods binding the event methods with the map methods.
117    
118            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
119            layer at top/bottom of layer stack.
120    
121            * Resources/Bitmaps/top_layer.xpm: New button icon.
122    
123            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
124    
125    2003-05-22  Bernhard Herzog  <[email protected]>
126    
127            * Thuban/Model/session.py (Session.RemoveTable): New method to
128            remove tables
129    
130            * test/test_session.py (TestSessionSimple.test_remove_table): New.
131            Test for RemoveTable
132    
133    2003-05-22  Thomas Koester  <[email protected]>
134    
135            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
136            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
137    
138    2003-05-22  Bernhard Herzog  <[email protected]>
139    
140            Implement a way to discover dependencies between tables and
141            shapestores.
142    
143            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
144            (TransientJoinedTable.Dependencies)
145            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
146            interface
147            (TransientJoinedTable.__init__): Keep tack of the original table
148            objects in addition to the corresponding transient tables.
149    
150            * Thuban/Model/table.py (DBFTable.Dependencies)
151            (MemoryTable.Dependencies): New. Implement the dependencies
152            interface
153    
154            * Thuban/Model/data.py (ShapeTable): New. Helper class for
155            ShapefileStore
156            (ShapefileStore.__init__): Use ShapeTable instead of
157            AutoTransientTable
158            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
159            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
160            methods for filename and type
161            (ShapefileStore.Dependencies): New. Implement the dependencies
162            interface
163            (DerivedShapeStore): New class to replace SimpleStore. The main
164            difference to SimpleStore is that it depends not on a shapefile
165            but another shapestore which expresses the dependencies a bit
166            better
167            (SimpleStore.__init__): Add deprecation warning.
168    
169            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
170            Test for the Dependencies method.
171    
172            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
173            New. Test for the Dependencies method.
174    
175            * test/test_transientdb.py
176            (TestTransientTable.test_auto_transient_table_dependencies): New.
177            Test for the Dependencies method.
178            (TestTransientTable.test_transient_joined_table): Add test for the
179            Dependencies method.
180    
181            * test/test_session.py (TestSessionSimple.setUp)
182            (TestSessionSimple.tearDown): New. Implement a better way to
183            destroy the sessions.
184            (TestSessionSimple.test_initial_state)
185            (TestSessionSimple.test_add_table): Bind session to self.session
186            so that it's destroyed by tearDown
187            (TestSessionSimple.test_open_shapefile): New. Test for
188            OpenShapefile and the object it returns
189    
190    2003-05-22  Bernhard Herzog  <[email protected]>
191    
192            * Thuban/Model/session.py (Session.AddTable): New method to
193            register tables with the session.
194            (Session.Tables): Return the tables registered with AddTable too.
195    
196            * test/test_session.py (TestSessionSimple.test_add_table): New.
197            Test case for the AddTable method
198    
199    2003-05-22  Frank Koormann  <[email protected]>
200    
201            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
202            lower right corner, center labels for selections, initialize controls
203            in reasonable order for keyboard navigation.
204    
205            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
206            (ProjFrame.__DoOnProjAvail): Determine position of current projection
207            using the wxListBox.FindString() method. Still a problem (#1886)
208    
209            * Thuban/UI/classifier.py
210            (Classifier.__init__, SelectPropertiesDialog.__init__)
211    
212            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
213            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
214            different classification types from here to __init__.
215            (GenUniquePanel.__init__): Set the column width of the first field
216            in the Field ListCtrl to the full width.
217    
218            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
219            Button to 'Export'. Center Buttons in Selection Box, set Focus to
220            Grid.
221            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
222            changes focus to the Selection when pressing "Alt-S".
223    
224            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
225            the text if not visible. The italic font sometimes exceeds the
226            rendering area.
227    
228    2003-05-21  Jonathan Coles   <[email protected]>
229    
230            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
231            to OnClose so that Thuban closes correctly.
232    
233            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
234            DockFrame.OnClose, not DockFrame._OnClose.
235    
236    2003-05-21  Jonathan Coles   <[email protected]>
237    
238            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
239            references to 'inf' and use new Range __init__ to pass floats
240            directly rather than converting them to strings first.
241            Fixes RTBug #1876.
242    
243            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
244            Use new Range ___init__ to pass floats.
245    
246            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
247            filename is a valid image file. Throw IOError otherwise.
248    
249            * Thuban/Model/range.py: Brought over new Range from SciParam that
250            is immutable and has an __init__ which can accept floats.
251    
252            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
253            into try block. AddLayer doesn't throw any exceptions anymore.
254            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
255            try block.
256    
257            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
258            the first item in choices. Fixes RTBug #1882.
259    
260            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
261            has gone to 0 which is a serious problem. abort.
262            (MapRenderer.draw_raster_layer): Catch IOError seperately and
263            print the error from GDAL.
264    
265            * Thuban/UI/tableview.py (TableGrid.__init__): Call
266            ToggleEventListeners to turn on listening.
267            (TableGrid.ToggleEventListeners): New. Turns event listening on
268            and off so as to prevent excessive messages.
269            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
270            to suppress excessive messages when selecting many rows.
271            Fixes RTBug #1880.
272    
273            * Thuban/UI/view.py: Added checks against if scale == 0. This
274            is a serious problem that can occur when an image without
275            geo data is loading and causes the map projection bounds to
276            go to infinity. Right now, the solution is to simply try
277            to recover.
278    
279            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
280            to set the MFILEReceiver attributes even if the data is NULL.
281    
282            * extensions/thuban/gdalwarp.cpp: Improved the error handling
283            and passed GDAL messages back up to the Python layer. Also
284            tried to fix some memory leaks that were present in the original
285            utility but didn't matter because the program aborted.
286    
287            * test/test_range.py: Copied over tests from SciParam. Removed
288            tests against importing. Fixes RTBug #1867.
289    
290    2003-05-21  Bernhard Herzog  <[email protected]>
291    
292            * test/test_load.py: Remove unused imports and restructure the
293            test code
294            (LoadSessionTest): Split into one class for each test and turn
295            LoadSessionTest itself into the base class for all such session
296            tests.
297            (ClassificationTest): New base class for load tests that test
298            classifications
299            (TestSingleLayer, TestLayerVisibility, TestClassification)
300            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
301            for the individual tests
302    
303            * test/support.py (FileLoadTestCase.filename): New base class for
304            file loading tests
305    
306    2003-05-21  Jan-Oliver Wagner <[email protected]>
307    
308            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
309            Mercator' to 'UTM Zone 32' as a more convenient example.
310            Added 'Gauss Krueger Zone 6'.
311    
312            * Data/iceland_sample_raster.thuban: political polygon now
313            filled transparent to have the raster image visible at once.
314    
315    2003-05-21  Frank Koormann  <[email protected]>
316    
317            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
318            OnClose() to keep in sync with extensions. Internally Thuban
319            still uses "underscored" names.
320    
321    2003-05-20  Jonathan Coles   <[email protected]>
322    
323            This puts back Raster layer support. These layers support projections
324            through the GDAL library. Currently, the CVS version is being used.
325            There are no Debian packages available although this may change soon.
326            A GDAL driver was extended to support writing to memory rather to
327            files.
328    
329            There is still some work that needs to be done, such as some error
330            handling when loading invalid images or when there is a problem
331            projecting the image. This putback simply checks in the majority
332            of the work.
333    
334            * setup.py: Add gdalwarp library extension.
335    
336            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
337            Defaults to False, but can be overridden by subclasses if they
338            support classification.
339            (RasterLayer): New. Defines a new layer that represents an
340            image.
341    
342            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
343            tag handler.
344            (SessionLoader.start_layer): Encode the filename.
345            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
346            New. Supports reading a rasterlayer tag.
347    
348            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
349    
350            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
351            get a string in Latin1. If we get such as string convert it to
352            unicode first, otherwise leave if alone before encoding.
353            (SessionSaver.write_layer): Add support for writing both Layers
354            and RasterLayers.
355    
356            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
357            The right argument may not be a string, it could also be a Column.
358    
359            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
360            Make initial window size 600x400. Fixes RTBug #1872.
361    
362            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
363            the dialog is constructed so that we can support layers that
364            do not have classifications.
365            (Classifier._OnTry): Only build a classification if the layer
366            supports one.
367    
368            * Thuban/UI/legend.py: Change all checks that a layer is an
369            instance of Layer into checks against BaseLayer.
370            (LegendTree.__FillTreeLayer): Only add children to a branch if
371            the layer supports classification.
372    
373            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
374            MainWindow.OpenSession): Don't proceed with an action if the
375            user chooses Cancel when they are asked to save changes.
376            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
377            user to select an image file. Create a new RasterLayer and add
378            it to the map.
379    
380            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
381            for rendering RasterLayer layers.
382            (MapRenderer.draw_raster_layer): Actually method that calls
383            the GDALWarp python wrapper and constructs an image from the
384            data returned.
385    
386            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
387            Choices symbols to match those used in the table query method.
388            Replace deprecated method calls on table with new method names.
389    
390            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
391            how small the scale can get. This still needs more testing.
392    
393            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
394            Provides a driver to output in .bmp format.
395    
396            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
397            New. Provides IO routines which write to memory, rather than a file.
398    
399            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
400            of the gdalwarp utility provided in GDAL. Added function calls
401            that can be accessed from python.
402    
403            * Data/iceland_sample_raster.thuban: New. Sample file that uses
404            a raster layer.
405    
406            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
407            layer image data.
408    
409            * Doc/thuban.dtd: Added rasterlayer attribute definition.
410    
411            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
412            tests associated with the raster layer code.
413    
414            * test/test_transientdb.py
415            (TestTransientTable.test_auto_transient_table_query): Added a test
416            for using a Column object as the "right" parameter to a query.
417    
418    2003-05-19  Frank Koormann  <[email protected]>
419    
420            * Thuban/version.py (get_changelog_date):
421            Catch exceptions if ChangeLog does not exist.
422    
423            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
424    
425    2003-05-19  Frank Koormann  <[email protected]>
426    
427            Extended version information for Thuban
428    
429            * Thuban/version.py: New, version information for Thuban: Last
430            modification date and last ChangeLog entry date.
431    
432            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
433            information: Display Thuban, wxPython and Python version.
434    
435    2003-05-16  Bernhard Herzog  <[email protected]>
436    
437            * Thuban/Model/save.py: Remove some unused imports including the
438            __future__ import for nested_scopes as Thuban relies on Python 2.2
439            now.
440            (XMLWriter.encode): Remove the special case for a None argument.
441            In the saver encode is always called with a string argument.
442    
443    2003-05-16  Bernhard Herzog  <[email protected]>
444    
445            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
446            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
447            of the bug was that e.g. float("1.2") would fail. Thuban now
448            requires 2.4.x.
449            
450    2003-05-16  Frank Koormann   <[email protected]>
451    
452            Printing enhancement and WMF export (under Win32)
453    
454            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
455            ScreenRenderer. Renders Map, Legend and Scalebar for export.
456            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
457            PrintRender.
458    
459            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
460            to fullfil information needed for PrinterRenderer.
461            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
462            (MapCanvas.Print): Adapted to new MapPrintout.
463            (OutputTransform): General calculations to transform from canvas
464            coordinates to export/printing devices.
465    
466            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
467            new method_command to call ExportMap, with platform dependency (only
468            __WXMSW__)
469      
470            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
471            of scalebar drawing area as new parameters.
472            
473            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
474    
475            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
476            Update to extended scalebar.DrawScalebar header.
477    
478            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
479    
480            * test/test_scalebar.py: Made test executable as standalone.
481    
482    2003-05-16  Bernhard Herzog  <[email protected]>
483    
484            * Thuban/Model/table.py (Table): Remove this compatibility alias
485            for DBFTable.
486    
487            * test/test_table.py: Import DBFTable as Table because that alias
488            doesn't exist anymore.
489    
490            * Thuban/UI/classgen.py: Remove some unused imports
491    
492    2003-05-14  Jonathan Coles   <[email protected]>
493    
494            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
495            Fix docstring.
496            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
497            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
498            values of the supplied range to determine the beginning and end
499            bounds of the generated classes.
500    
501            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
502            do not have a leading 0 (.5 is now accepted as well as 0.5).
503    
504            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
505            call to ClassGenerator.GenUniformDistribution.
506    
507            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
508            layout bug with the 'Projection' label.
509    
510            * test/support.py (FloatTestCase): New. Needed for the Range tests.
511    
512            * test/test_range.py: New. Imported from SciParam.
513    
514    2003-05-12  Jonathan Coles   <[email protected]>
515    
516            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
517            to table.UniqueValues() with calls that retrieve all the values
518            from the table. This will need to be replaced by a method on table
519            which can simply return the list (perhaps more efficiently).
520    
521    2003-05-12  Jonathan Coles   <[email protected]>
522    
523            The return value of ClassGenerator.CalculateQuantiles has changed.
524            Refer to the documentation for details.
525    
526            * test/test_classgen.py: Modified Quantile tests to use the
527            new return values.
528    
529            * Thuban/Model/classgen.py
530            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
531            use new return values from CalculateQuantiles to produce the correct
532            range bounds in the Classification.
533            (ClassGenerator.CalculateQuantiles): Add more comments describing
534            the return values and parameters. Make minor adjustments to improve
535            the legibility of the code. Fix problem with adjusted not being set
536            in most cases.
537    
538    2003-05-12  Frank Koormann <[email protected]>
539            
540            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
541            and latin1. Fixes #1851 finally.
542    
543    2003-05-09  Jonathan Coles   <[email protected]>
544    
545            * test/test_classgen.py: New. Tests the Quantile algorithm.
546    
547            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
548            Clean up debugging statement, add comments, fix a small bug in the
549            returned adjusted percentiles.
550            
551    2003-05-09  Jonathan Coles   <[email protected]>
552    
553            Introduces Range class from SciParam into the ClassGroupRange class,
554            and such ranges can now be saved and loaded from disk.
555    
556            Quantiles are now available in the Classification Generator.
557    
558            Initial support for building Queries on a table. Doesn't do anything
559            but run some tests.
560    
561            * Thuban/Model/classification.py: Explicit imports.
562            (ClassGroupRange): Use the Range class to store the underlying
563            range information. The interface remains the same, except for
564            GetRange(), and you can also supply a Range object as the min
565            parameter to SetRange or __init__.
566    
567            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
568            string appropriately for use in Thuban. Fixes RTbug #1851.
569            (SessionLoader.end_projection): Handle the context of the
570            projection tag a bit better by looking at what objects are not
571            None. There was an assumption that a projection tag for a map
572            could occur before any layers.
573            (SessionLoader.start_clrange): Provide backward compatibility for
574            reading min/max values as well as the new range parameter.
575    
576            * Thuban/Model/map.py: Explicit imports.
577    
578            * Thuban/Model/resource.py: Import _.
579            (ProjFileSaver.write): write header using projfile.dtd.
580    
581            * Thuban/Model/save.py: Explicit imports.
582            (XMLWriter.encode): New. Encode the given string from a format
583            used by Thuban into UTF-8. Fixes RTbug #1851.
584    
585            * Thuban/UI/classgen.py: Explicit imports.
586            (ClassGenDialog.__init__): Clean up the code and add support
587            for Quantiles.
588            (ClassGenDialog.OnOK): Add support for Quantiles.
589            (GenQuantilesPanel): New. Input panel for Quantiles.
590            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
591            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
592    
593            * Thuban/Model/classgen.py: New. Contains all the classes named above.
594    
595            * Thuban/UI/classifier.py: Explicit imports.
596            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
597            ClassTable.SetValueAsCustom): Reworked to use new Range class.
598    
599            * Thuban/UI/legend.py: Explicit imports.
600    
601            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
602            a Table menu and associated method calls.
603            (MainWindow.choose_color): Removed. No longer needed.
604    
605            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
606            should be disabled if no projection is selected in the available
607            list.
608    
609            * Thuban/UI/renderer.py: Explicit imports.
610    
611            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
612            with correctly selecting the rows and issuing the right events.
613            Be sure to call Skip() to allow the grid to do some of its own
614            handling which allows the rows to actually be selected.
615            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
616            selecting multiple shapes.
617            (LayerTableFrame): Support for building Queries.
618            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
619    
620            * Thuban/UI/tree.py: Explicit imports.
621    
622            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
623            table view can call it.
624    
625            * test/test_classification.py: Explicit imports.
626            (TestClassification.test_ClassGroupRange): Fix test for new
627            Range class.
628    
629            * Doc/thuban.dtd: Add range parameter for clrange.
630    
631            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
632            object in ClassGroupRange, and also uesd for inputting ranges in
633            the classifer table and elsewhere.
634    
635            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
636            yet.
637    
638    2003-05-09  Frank Koormann <[email protected]>
639    
640            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
641    
642    2003-05-08  Frank Koormann <[email protected]>
643    
644            Coding style updates
645    
646            * test/test_scalebar.py: Replaced tab indentation by spaces.
647    
648            * Thuban/UI/scalebar.py: Explicit imports.
649    
650    2003-05-08  Frank Koormann <[email protected]>
651    
652            * Thuban/UI/scalebar.py
653            (ScaleBar.DrawScalebar): Format string bug fixed.
654    
655    2003-05-08  Frank Koormann <[email protected]>
656    
657            Reorganization of scalebar component (no wx in Thuban/Model)
658    
659            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
660            (deriveInterval):
661            Calculate scalebar interval and unit which fits in width for scale.
662            (roundInterval): Round float.
663    
664            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
665    
666            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
667    
668            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
669    
670    2003-05-08  Frank Koormann <[email protected]>
671    
672            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
673            Initialize ScaleBar with canvas.map
674    
675            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
676            round intervals to display smarter lengths
677            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
678            layer. If the maps has no projection applied grey the scalebar.
679    
680    2003-05-07  Frank Koormann <[email protected]>
681            
682            Basic Scalebar features added.
683    
684            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
685    
686            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
687            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
688            and the renderer.
689    
690            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
691    
692            * Thuban/UI/messages.py: SCALE_CHANGED added.
693    
694    2003-05-07  Bernhard Herzog  <[email protected]>
695    
696            * Thuban/Model/session.py (Session.__init__): New instance
697            variable shapestores to hold a list of all open shapestore objects
698            (Session.ShapeStores): New. Accessor method for the shapestores
699            list.
700            (Session._add_shapestore, Session._clean_weak_store_refs): New.
701            Internal methods to maintain the shapestores list.
702            (Session.Tables): New. Return all tables open in the session.
703            (Session.OpenShapefile): Insert the new ShapeStore into the
704            shapestores list.
705    
706            * test/test_session.py (TestSessionSimple.test_initial_state): Add
707            tests for ShapeStores and Tables
708            (TestSessionWithContent.test_shape_stores)
709            (TestSessionWithContent.test_tables): New. Test cases for
710            ShapeStores and Tables
711    
712    2003-05-07  Bernhard Herzog  <[email protected]>
713    
714            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
715            Add comments about the optimizations used.
716            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
717            Implement the ReadValue table interface method.
718    
719            * test/test_transientdb.py
720            (TestTransientTable.run_iceland_political_tests)
721            (TestTransientTable.test_transient_joined_table): Add tests for
722            ReadValue
723    
724    2003-05-07  Frank Koormann <[email protected]>
725    
726            * Resources/Bitmaps/fulllayerextent.xpm,
727            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
728            new icons.
729    
730    2003-05-06  Bernhard Herzog  <[email protected]>
731    
732            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
733            New. Simply delegate to the transient table's version.
734    
735            * test/test_transientdb.py
736            (TestTransientTable.test_auto_transient_table_query): New. Test
737            case for AutoTransientTable's SimpleQuery
738    
739    2003-05-06  Bernhard Herzog  <[email protected]>
740    
741            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
742            Implement a simple query method for the query dialog
743            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
744            the row index or shapeid.
745            (TransientTable.create): Insert the right value of the row index
746            (TransientJoinedTable.create): Copy the row index of the left
747            table to the joined result table
748    
749            * test/test_transientdb.py
750            (TestTransientTable.test_transient_table_read_twice): Fix
751            doc-string
752            (TestTransientTable.test_transient_table_query): New. Test for the
753            SimpleQuery method
754    
755    2003-05-06  Bernhard Herzog  <[email protected]>
756    
757            Convert all table users to use the new table interface. This only
758            covers Thuban itself, not GREAT-ER or other applications built on
759            Thuban yet, so the compatibility interface stays in place for the
760            time being but it now issues DeprecationWarnings.
761    
762            Finally, the new Table interface has a new method, HasColumn.
763    
764            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
765            issue deprecation warnings when they're. The warnings refer to the
766            caller of the method.
767            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
768            for the deprecation warnings
769    
770            * test/test_table.py: Ignore the deprecation warnings for the old
771            table in the tests in this module. The purpose of the tests is to
772            test the old interface, after all.
773    
774            * test/test_transientdb.py
775            (TestTransientTable.run_iceland_political_tests): Use the
776            constants for the types. Add a test for HasColumn
777            (TestTransientTable.test_transient_joined_table): Adapt to new
778            table interface. Add a test for HasColumn
779            (TestTransientTable.test_transient_table_read_twice): Adapt to new
780            table interface
781    
782            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
783            Adapt to new table interface
784    
785            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
786            new table interface
787    
788            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
789            (RecordTable.SetTable): Adapt to new table interface
790    
791            * Thuban/UI/classifier.py (Classifier.__init__)
792            (Classifier.__init__): Adapt to new table interface
793    
794            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
795            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
796            to new table interface
797    
798            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
799            (AutoTransientTable.HasColumn): Implement the new table interface
800            method
801            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
802            (AutoTransientTable.UniqueValues): Adapt to new table interface
803    
804            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
805            Adapt to new table interface
806    
807            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
808            simplify opening shapefiles a bit easier.
809            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
810            (TestLayer.test_point_layer): Use the new helper method
811            (TestLayer.test_get_field_type): New. Test for the GetFieldType
812            method
813    
814            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
815            the new table method
816    
817            * test/test_memory_table.py (TestMemoryTable.test_has_column):
818            Test for the new table method HasColumn
819    
820    2003-05-06  Jonathan Coles   <[email protected]>
821    
822            Addresses the "Selection Extent" wish of RTbug #1787.
823    
824            * Resources/Bitmaps/fulllayerextent.xpm,
825            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
826            extent. These are just place holders for the real bitmaps.
827    
828            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
829            calculate the bounding box once (the first time compute_bbox() is
830            called).
831            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
832            the bounding box for the shapes in lat/long coordinates.
833    
834            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
835            option.
836            (MainWindow.has_selected_shapes): New. Returns true if there are
837            any selected shapes.
838            (MainWindow.FullSelectionExtent): New. Calls
839            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
840            (_has_selected_shapes): New. Returns true if there are any
841            selected shapes.
842    
843            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
844            true if there are any selected shapes.
845    
846            * Thuban/UI/view.py (MapCanvas): Added delegated method
847            HasSelectedShapes.
848            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
849            shapes on the canvas using the map projection (if any).
850    
851            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
852            for Layer.ShapesBoundingBox().
853    
854    2003-05-06  Bernhard Herzog  <[email protected]>
855    
856            * Resources/Projections/defaults.proj: Fix spelling of Mercator
857    
858    2003-05-05  Jonathan Coles   <[email protected]>
859    
860            Addresses the "Full Layer Extent" wish of RTbug #1787.
861    
862            * Resources/Projections/defaults.proj: Added UK National Grid.
863    
864            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
865            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
866            when the user selects the menu option.
867    
868            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
869            scales the given layer on the canvas using the map projection.
870    
871    2003-05-05  Bernhard Herzog  <[email protected]>
872    
873            Convert the table implementations to a new table interface. All
874            tables use a common mixin class to provide backwards compatibility
875            until all table users have been updated.
876    
877            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
878            provide backwards compatibility for table classes implementing the
879            new interface
880            (DBFTable, MemoryTable): Implement the new table interface. Use
881            OldTableInterfaceMixin as base for compatibility
882            (DBFColumn, MemoryColumn): New. Column description for DBFTable
883            and MemoryTable resp.
884    
885            * test/test_dbf_table.py: New. Test cases for the DBFTable with
886            the new table interface.
887    
888            * test/test_memory_table.py: New. Test cases for the MemoryTable
889            with the new table interface.
890    
891            * test/test_table.py: Document the all tests in this file as only
892            for backwards compatibility. The equivalent tests for the new
893            interface are in test_memory_table.py and test_dbf_table.py
894            (MemoryTableTest.test_read): field_info should be returning tuples
895            with four items
896            (MemoryTableTest.test_write): Make doc-string a more precise.
897    
898            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
899            table interface. Derive from from OldTableInterfaceMixin for
900            compatibility.
901            (TransientTableBase.create): New intance variable column_map to
902            map from names and indices to column objects
903            (TransientTable.create): Use the new table interface of the input
904            table
905            (AutoTransientTable): Convert to new table interface. Derive from
906            from OldTableInterfaceMixin for compatibility.
907            (AutoTransientTable.write_record): Removed. It's not implemented
908            yet and we still have to decide how to handle writing with the new
909            table and data framework.
910    
911            * test/test_transientdb.py
912            (TestTransientTable.run_iceland_political_tests)
913            (TestTransientTable.test_transient_joined_table): Use the new
914            table interface
915    
916    2003-05-05  Jonathan Coles   <[email protected]>
917    
918            This is namely a collection of UI updates to improve user interactivity.
919            Tabbing between controls now exists and you can use ESC to close dialog
920            boxes; ENTER will active the default button.
921    
922            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
923            order that the controls are created so that tabbing works correctly.
924            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
925            wxDialog can handle the default button correctly.
926            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
927            same reasons as for OnOK.
928            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
929            when we ask the table for the maximum/minimum values of a field
930            which could take a very long time.
931    
932            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
933            order that the controls are created so that tabbing works correctly.
934            (SelectPropertiesDialog.__init__): Rearrange the order that the
935            controls are created so that tabbing works correctly.
936    
937            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
938            to derive from a wxDialog but behave like the original implementation
939            which was derived from a wxFrame. wxDialog provides useful key
940            handling functionality like ESC calling OnCancel and ENTER calling
941            OnOK which is lost with wxFrame.
942    
943            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
944            new dialogs.
945    
946            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
947            order that the controls are created so that tabbing works correctly.
948            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
949            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
950            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
951            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
952            can provide the "UK National Grid" as a default projection.
953            (UTMPanel.__init__): Rearrange the order that the controls are
954            created so that tabbing works correctly.
955    
956    2003-05-05  Bernhard Herzog  <[email protected]>
957    
958            * extensions/thuban/wxproj.cpp: Fix some of the comments.
959            (project_point): If a map projection but no layer projection is
960            given, convert degrees to radians before applying the map
961            projection.
962    
963            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
964            (TableGrid.allow_messages): New methods to make it possible to
965            inhibit message sending.
966            (TableGrid.issue): Only send the message if not inhibited.
967            (LayerTableGrid.select_shape): Use the new methods to make sure
968            that no ROW_SELECTED message is sent while we're updating the
969            selected rows to match the selected shapes.
970    
971    2003-05-02  Jan-Oliver Wagner <[email protected]>
972    
973            Implementation of MemoryTable.
974    
975            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
976            implementation that operates on a list of tuples. All of the data
977            are kept in the memory.
978    
979            * test/test_table.py (MemoryTableTest): New.
980    
981            * test/test_transientdb.py (SimpleTable): Removed.
982            (TestTransientTable.test_transient_joined_table,
983            (TestTransientTable.test_transient_table_read_twice): Replaced
984            SimpleTable by MemoryTable.
985    
986    2003-04-30  Jonathan Coles   <[email protected]>
987    
988            * Data/iceland_sample.thuban: Now contains correct projections
989            for each of the layers.
990    
991            * Resources/Projections/defaults.proj: Geographic projection
992            contains unit conversion parameter.
993    
994    2003-04-30  Jonathan Coles   <[email protected]>
995    
996            The most important part of this putback is the projection changes.
997            It should now be possible to specify the projection that a layer
998            is in and then specify a different projection for the map. The
999            projection dialog has an extra parameter for a geographic projection
1000            which lets the user select if the input is in degrees or radians.
1001    
1002            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1003            to say that the parameter is a tuple of unprojected
1004            points (which is what the callers to this method were assuming).
1005            Also, since the points are unprojected we need to projected them.
1006    
1007            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1008            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1009            groups are selected, move the layer up/down. Fixes RTbug #1833.
1010    
1011            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1012    
1013            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1014            parameter in call to SetClientData.
1015            (GeoPanel): Add support for selecting the units that the
1016            source data is in (Radians or Degrees).
1017    
1018            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1019            the rendering loop by reducing the number of if's, removing the
1020            unnecessary try/except block, and checking if the old group
1021            is the same as the new one (which happens a lot if there is
1022            no classification, or lots of shapes are in the same group).
1023    
1024            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1025            around the redraw routine to try to catch problems that the user
1026            may create by selecting invalid projections for the data set and
1027            map. Clears the display if there are any problems and prints the
1028            error.
1029            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1030            rectangle.
1031    
1032            * extensions/thuban/wxproj.cpp (project_point): First invert the
1033            supplied point (which should be in projected coordinates) using
1034            the layer's projection and then project the point using the
1035            map's projection.
1036            (project_points): Use project_point() to project each point.
1037    
1038    2003-04-30  Jan-Oliver Wagner <[email protected]>
1039    
1040            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1041            don't set the Classification to None if the classfication field
1042            is None (ie only a DEFAULT).
1043    
1044    2003-04-30  Bernhard Herzog  <[email protected]>
1045    
1046            * Thuban/UI/view.py: Fix some typos.
1047    
1048            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1049            not pop up the dialog if the selection becomes empty (this could
1050            happen if e.g. a new selection is opened while the identify tool
1051            is active and dialog had been closed)
1052    
1053    2003-04-30  Bernhard Herzog  <[email protected]>
1054    
1055            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1056            instance variable read_record_last_result
1057            (TransientTableBase.read_record): Make sure reading the same
1058            record twice works. The implementation uses the new instance
1059            variable read_record_last_result
1060    
1061            * test/test_transientdb.py
1062            (TestTransientTable.test_transient_table_read_twice): New test
1063            case for the above bug-fix.
1064    
1065    2003-04-29  Jonathan Coles   <[email protected]>
1066    
1067            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1068    
1069            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1070    
1071            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1072            (ClassTable.SetValueAsCustom): Rename keyword argument in
1073            ClassGroup* constructors to match argument name.
1074    
1075    2003-04-29  Bernhard Herzog  <[email protected]>
1076    
1077            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1078            transient DB if it exists to make sure it doesn't leave a journal
1079            file in the temp directory.
1080    
1081            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1082            self.conn to None after closing the connection to make sure it's
1083            not closed twice
1084    
1085    2003-04-29  Jonathan Coles   <[email protected]>
1086    
1087            Add a visible parameter in the layer XML tag. The default value is
1088            "true". If anything other than "false" is specified we also assume
1089            "true". Addresses RTbug #1025.
1090    
1091            * Doc/thuban.dtd: Add visible parameter to a layer.
1092    
1093            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1094            of visible from 1 to True.
1095            (Layer.__init__): Change default value of visible from 1 to True.
1096    
1097            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1098            parameter.
1099    
1100            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1101            parameter.
1102    
1103            * test/test_load.py: Add new test data contents_test_visible.
1104            (LoadSessionTest.setUp): save test data.
1105            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1106            is loaded correctly.
1107    
1108            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1109            for saving an invisible layer.
1110    
1111    2003-04-29  Jonathan Coles   <[email protected]>
1112    
1113            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1114            legend dialog box and tell it to change its map to the one
1115            supplied to SetMap(). Fixes RTbug #1770.
1116    
1117    2003-04-29  Bernhard Herzog  <[email protected]>
1118    
1119            Next step of table implementation. Introduce a transient database
1120            using SQLite that some of the data is copied to on demand. This
1121            allows us to do joins and other operations that require an index
1122            for good performance with reasonable efficiency. Thuban now needs
1123            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1124            haven't tested that.
1125            
1126            * Thuban/Model/transientdb.py: New. Transient database
1127            implementation.
1128    
1129            * test/test_transientdb.py: New. Tests for the transient DB
1130            classes.
1131    
1132            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1133            classes to help automatically remove temporary files and
1134            directories.
1135            (Session.__init__): New instance variables temp_dir for the
1136            temporary directory and transient_db for the SQLite database
1137            (Session.temp_directory): New. Create a temporary directory if not
1138            yet done and return its name. Use AutoRemoveDir to have it
1139            automatically deleted
1140            (Session.TransientDB): Instantiate the transient database if not
1141            done yet and return it.
1142    
1143            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1144            AutoTransientTable so that data is copied to the transient DB on
1145            demand.
1146            (SimpleStore): New class that simply combines a table and a
1147            shapefile
1148    
1149            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1150            DBFTable and update its doc-string to reflect the fact that this
1151            is only the table interface to a DBF file. Table is now an alias
1152            for DBFTable for temporary backwards compatibility.
1153    
1154            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1155            the last reference to the session goes away so that the temporary
1156            files are removed properly.
1157    
1158            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1159            reference to the session to make sure the temporary files are
1160            removed.
1161    
1162    2003-04-29  Bernhard Herzog  <[email protected]>
1163    
1164            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1165            the __parser instance variable into a normal local variable in
1166            read. It's only used there and read will never be called more than
1167            once. Plus it introduces a reference cycle that keeps can keep the
1168            session object alive for a long time.
1169    
1170    2003-04-29  Jonathan Coles   <[email protected]>
1171    
1172            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1173            Projection an immutable item. Fixes RTbug #1825.
1174            (Projection.__init__): Initialize instance variables here.
1175            (ProjFile.Replace): New. Replace the given projection object with
1176            the new projection object. This solves the problem of needing the
1177            mutator Projection.SetProjection() in the ProjFrame class and
1178            allows a projection to change parameters without changing its
1179            location in the file.
1180    
1181            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1182            be of type wxSAVE and should verify overwriting a file.
1183    
1184            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1185            ProjFile.Replace() method instead of the mutator
1186            Projection.SetProjection(). Also requires that we reassign the
1187            client data to the new projection.
1188    
1189            * test/test_proj.py (TestProjection.test): Test GetName() and
1190            GetAllParameters()
1191            (TestProjFile.test): Remove tests for Set*() methods. Add tests
1192            for Replace().
1193    
1194    2003-04-25  Jonathan Coles   <[email protected]>
1195    
1196            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1197            to save the name of the projection.
1198    
1199            * test/test_save.py (SaveSessionTest.testLayerProjection): New
1200            test to verify layer projections are saved correctly.
1201    
1202    2003-04-25  Jonathan Coles   <[email protected]>
1203    
1204            * Thuban/Model/proj.py (Projection.SetName): Set the name
1205            to "Unknown" if name is None.
1206            (Projection.SetAllParameters): New. Set the projection's
1207            parameter list to the one supplied.
1208            (Projection.SetProjection): New. Set the projection's
1209            properties to those of the supplied Projection.
1210    
1211            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1212            the dialog title to include the map's title.
1213            (MainWindow.LayerProjection): Set the dialog title to include
1214            the layer's title.
1215    
1216            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1217            error dialogs into a single method call.
1218            (ProjFrame.__VerifyButtons): Add more states to check.
1219            (ProjFrame.__GetProjection): Return the current state of an
1220            edited projection or None.
1221            (ProjFrame.__FillAvailList): Remove checks for states that
1222            shouldn't exist.
1223            (ProjFrame._OnNew): Clear all selected items and supply
1224            a projection panel if necessary.
1225    
1226            * test/test_proj.py (TestProjFile.test): Add tests for
1227            ProjFile.SetAllParameters, ProjFile.SetProjection,
1228            ProjFile.SetName.
1229    
1230    2003-04-25  Jonathan Coles   <[email protected]>
1231    
1232            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1233            takes an optional argument to select the current projection.
1234            This does not guarantee that the item is visible due to
1235            limited wxWindows functionality. Fixes RTBug #1821.
1236    
1237    2003-04-25  Jonathan Coles   <[email protected]>
1238    
1239            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
1240            the projection name and use it when constructing the Projection
1241            object.
1242    
1243            * Thuban/Model/proj.py (Projection.__init__): Change the default
1244            value for 'name' to None and then test if name is equal to None
1245            in the body of the constructor. This way the caller doesn't have to
1246            know what the default value should be. Namely, useful in load.py
1247            where we have to pick a default value if the 'name' parameter
1248            doesn't exist in the XML file.
1249    
1250            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
1251            Tests a file where a layer has a projection.
1252    
1253    2003-04-25  Jonathan Coles   <[email protected]>
1254    
1255            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
1256            tree for projection information.
1257    
1258            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
1259            XMLReader.GetFileName.
1260            (SessionLoader): Added support for loading projection tags that
1261            appear inside a layer.
1262    
1263            * Thuban/Model/proj.py (ProjFile): Document the class. Move
1264            back to using a list because the order of the projections in
1265            the file is important to maintain. Fixes RTbug #1817.
1266    
1267            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
1268            to ProjFile.GetFilename.
1269    
1270            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
1271            information.
1272    
1273            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
1274            ProjFrame._OnSaveAs. Removed old dead code from previous
1275            implementation.
1276            (ProjFrame._OnExport): Add support for exporting more than one
1277            projection to a single file.
1278            (ProjFrame.__FillAvailList): use string formatting (% operator)
1279            to build strings that are (partly) translated. Fixes RTbug #1818.
1280    
1281            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
1282            class.
1283    
1284    2003-04-24  Bernhard Herzog  <[email protected]>
1285    
1286            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
1287    
1288            * po/fr.po: New. French translation by Daniel Calvelo Aros
1289    
1290            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
1291            empty strings.
1292    
1293    2003-04-24  Jonathan Coles   <[email protected]>
1294    
1295            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
1296            implement the interface that the ProjFrame dialog expects.
1297    
1298            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
1299            name of the projection to be changed.
1300            (ProjFile): Use a dictionary instead of a list so that removing
1301            projections is easier and we are sure about uniqueness.
1302            (ProjFile.Remove): Remove the given projection object.
1303    
1304            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
1305            Return a list with only one projection file instead of searching for
1306            any projection file. This simplifies many things if the user can
1307            only have one system file and one user file.
1308    
1309            * Thuban/UI/classgen.py: Change all references to
1310            genCombo to genChoice.
1311    
1312            * Thuban/UI/mainwindow.py: Add a Projection option under the
1313            layer menu.
1314            (MainWindow.LayerProjection): New. Open up a projection window
1315            for a layer.
1316    
1317            * Thuban/UI/projdialog.py: Large changes to how the dialog is
1318            laid out. Use three panels instead of one. One for the list of
1319            projections, one for the edit controls, and one for the buttons.
1320            Fixed resizing problems so that the dialog resizes correctly
1321            when the projection panel changes. Added import/export, save, and
1322            new buttons/functionality.
1323    
1324    2003-04-24  Bernhard Herzog  <[email protected]>
1325    
1326            First step towards table management. Introduce a simple data
1327            abstraction so that we replace the data a layer uses more easily
1328            in the next step.
1329    
1330            * Thuban/Model/data.py: New file with a simple data abstraction
1331            that bundles shapefile and dbffile into one object.
1332    
1333            * Thuban/Model/session.py (Session.OpenShapefile): New method to
1334            open shapefiles and return a shape store object
1335    
1336            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
1337            object instead of a shapefile filename. This introduces a new
1338            instance variable store holding the datastore. For intermediate
1339            backwards compatibility keep the old instance variables.
1340            (open_shapefile): Removed. No longer needed with the shape store.
1341            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
1342            get the shape store used by a layer.
1343            (Layer.Destroy): No need to explicitly destroy the shapefile or
1344            table anymore.
1345    
1346            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
1347            (MainWindow.AddLayer): Use the session's OpenShapefile method to
1348            open shapefiles
1349    
1350            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
1351            session's OpenShapefile method to open shapefiles
1352    
1353            * test/test_classification.py
1354            (TestClassification.test_classification): Use the session's
1355            OpenShapefile method to open shapefiles and build the filename in
1356            a more platform independed way
1357    
1358            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1359            Implement to have a session to use in the tests
1360            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1361            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
1362            session's OpenShapefile method to open shapefiles
1363            (TestLayerLegend.setUp): Instantiate a session so that we can use
1364            it to open shapefiles.
1365            (TestLayerLegend.tearDown): Make sure that all references to
1366            layers and session are removed otherwise we may get a resource
1367            leak
1368    
1369            * test/test_map.py (TestMapAddLayer.test_add_layer)
1370            (TestMapWithContents.setUp): Instantiate a session so that we can
1371            use it to open shapefiles.
1372            (TestMapWithContents.tearDown): Make sure that all references to
1373            layers, maps and sessions are removed otherwise we may get a
1374            resource leak
1375            ("__main__"): use support.run_tests() so that more info about
1376            uncollected garbage is printed
1377    
1378            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
1379            session's OpenShapefile method to open shapefiles
1380            ("__main__"): use support.run_tests() so that more info about
1381            uncollected garbage is printed
1382    
1383            * test/test_selection.py (TestSelection.tearDown): Make sure that
1384            all references to the session and the selection are removed
1385            otherwise we may get a resource leak
1386            (TestSelection.get_layer): Instantiate a session so that we can
1387            use it to open shapefiles.
1388            ("__main__"): use support.run_tests() so that more info about
1389            uncollected garbage is printed
1390    
1391            * test/test_session.py (TestSessionBase.tearDown)
1392            (TestSessionWithContent.tearDown): Make sure that all references
1393            to the session and layers are removed otherwise we may get a
1394            resource leak
1395            (TestSessionWithContent.setUp): Use the session's OpenShapefile
1396            method to open shapefiles
1397    
1398    2003-04-24  Jonathan Coles   <[email protected]>
1399    
1400            * Thuban/Model/load.py (XMLReader.read): Should have been checking
1401            if the file_or_filename object had the 'read' attribute.
1402    
1403    2003-04-23  Jonathan Coles   <[email protected]>
1404    
1405            * Thuban/Model/resource.py: Fixes RTbug #1813.
1406            (ReadProjFile): Add documentation about which exceptions are raised.
1407            Always pass the exceptions up to the caller.
1408            (GetProjFiles): If the directory can't be read return an empty list.
1409            If any of the proj files can't be read skip that file and go
1410            on to the next one.
1411    
1412            * test/test_proj.py: Added test cases to handle nonexistent files,
1413            unreadable files, and files that don't parse correctly.
1414    
1415    2003-04-23  Jonathan Coles   <[email protected]>
1416    
1417            Projection dialog. Allows the user to select from a list
1418            of projection templates and optionally edit them and save new ones.
1419    
1420            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
1421            (ProjPanel): Base class for projection specific panels.
1422            (TMPanel): Projection panel for Transverse Mercartor.
1423            (UTMPanel): Projection panel for Universal Transverse Mercartor.
1424            (LCCPanel): Projection panel for Lambert Conic Conformal.
1425            (GeoPanel): Projetion panel for Geographic Projection.
1426    
1427    2003-04-23  Jonathan Coles   <[email protected]>
1428    
1429            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
1430            promote symmetry. There now exists XMLReader and XMLWriter.
1431            (XMLReader.read): New. Call to read the given file descriptor or
1432            filename.
1433            (XMLReader.close): New. Make sure the file is closed.
1434            (XMLReader.GetFileName): New. Return just the file name that is being
1435            read from.
1436            (XMLReader.GetDirectory): New. Return just the directory of the file
1437            that is being read.
1438            (XMLReader.AddDispatchers): New. Take a dictionary which contains
1439            the names of functions to call as the XML tree is parsed.
1440            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
1441            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
1442            (SessionLoader): Removed class variables start_dispatcher and
1443            end_dispatcher since this functionality is now part of a class
1444            instance. Fixes RTbug #1808.
1445            (SessionLoader.__init__): Add dispatcher functions.
1446            (load_xmlfile): Code was moved into the XMLReader.read().
1447            (load_session): Use modified SessionLoader.
1448    
1449            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
1450            map's projection.
1451    
1452            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
1453            GetAllParameters.
1454            (Projection.GetParameter): Returns the value for the given parameter.
1455    
1456            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
1457            (GetProjFiles): Renamed from GetProjections. Now returns a list
1458            of ProjFile objects.
1459            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
1460            a list of ProjFile objects whose files are not user defined.
1461            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
1462            list of ProjFile objects whose files are user defined.
1463            (ProjFileReader): Extend new XMLReader.
1464    
1465            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
1466            promote symmetry.
1467    
1468            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
1469            control instead of a wxComboBox. wxChoice controls do not generate
1470            events as the uses highlights possible choices which fixes problems
1471            with resizing the dialog when the use selects an option.
1472    
1473            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
1474            control instead of a wxComboBox.
1475    
1476            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
1477            dialog.
1478    
1479            * test/test_proj.py (TestProjection.test): New tests for GetParameter
1480            method.
1481    
1482    2003-04-22  Bernhard Herzog  <[email protected]>
1483    
1484            * Thuban/UI/mainwindow.py: Remove some unused imports and global
1485            constants
1486    
1487            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1488            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
1489    
1490    2003-04-17  Bernhard Herzog  <[email protected]>
1491    
1492            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
1493            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
1494            anymore.
1495            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
1496            (Layer.ShapeType, Layer.Shape): No need to call
1497            self.open_shapefile since it's always called in __init__
1498    
1499            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
1500            In wxPython 2.4 there's no need to extend MainLoop anymore since
1501            wxPython itself makes sure OnExit is called.
1502    
1503    2003-04-16  Jonathan Coles   <[email protected]>
1504    
1505            Initial putback of projection management code. Includes new
1506            classes to read and write projection files. The current load
1507            and save classes were abstracted a bit so they could be reused.
1508            The Projection class was extended to provide new methods and
1509            have a name.
1510    
1511            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
1512            general XML reading methods that were part of ProcessSession.
1513    
1514            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
1515            name.
1516            (ProjFile): New. Represents a file that contains projection
1517            information.
1518    
1519            * Thuban/Model/resource.py: New. Contains general utilities
1520            for read and writing projection files.
1521    
1522            * Thuban/Model/save.py (XMLSaver): New. Contains all the
1523            general XML writing methods that were part of SessionSaver.
1524            (SessionSaver): Renamed from Saver.
1525    
1526            * test/test_proj.py: New test cases for the projection
1527            file read and write functions.
1528    
1529    2003-04-16  Jonathan Coles   <[email protected]>
1530    
1531            * Thuban/Model/classification.py: Use repr() around values
1532            in the ClassGroup*.__repr__() methods so it is clearer when
1533            a value is a string and when it is a number.
1534    
1535            * test/test_load.py: Rework the classification test to test
1536            that we can load old files.
1537            (testLabels): Test a file where the groups have labels.
1538    
1539    2003-04-16  Bernhard Herzog  <[email protected]>
1540    
1541            Safer implementation of the performance enhancements of the
1542            low-level renderer:
1543            
1544            * extensions/thuban/wxproj.cpp (extract_projection)
1545            (extract_pointer): Rename extract_projection to extract_pointer
1546            and redefine its purpose to return the pointer stored in a CObject
1547            returned by the object's cobject method. Update all callers.
1548            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
1549            handling of these low-level parameters so that each s_draw_info
1550            instance is handled as a CObject at python level that also
1551            contains real references to the actual python objects which
1552            contain the values in the struct. Add free_draw_info as the
1553            destructor.
1554            (draw_polygon_shape): Add the py_draw_info parameter which must a
1555            cobject containing an s_draw_info pointer.
1556    
1557            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
1558            method to instantiat the low-level render parameter
1559            (MapRenderer.draw_shape_layer): Use the new method. Remove some
1560            commented out code.
1561            (MapRenderer.draw_polygon_shape): Make the first parameter not the
1562            layer but the low-level render parameter
1563            (ScreenRenderer.draw_shape_layer): Use the low-level render
1564            parameter.
1565    
1566    2003-04-15  Jonathan Coles   <[email protected]>
1567    
1568            * Thuban/Model/classification.py: Implemented __repr__ for
1569            the ClassGroup* classes to make debugging a bit easier.
1570            (ClassGroup.SetLabel): Check that the string is an instance
1571            of StringTypes not StringType. Accounts for Unicode strings.
1572    
1573            * Thuban/Model/color.py: Implemented __repr__ to make
1574            debugging a bit easier.
1575    
1576            * Thuban/Model/save.py (Saver.write_classification): Need to
1577            save the group label.
1578    
1579            * test/test_load.py (testClassification): New. Loads the
1580            iceland_sample_test.thuban file and checks if it was loaded
1581            correctly.
1582    
1583    2003-04-15  Jonathan Coles   <[email protected]>
1584    
1585            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
1586            to improve rendering performance by initializing the variables
1587            that are not change each time draw_polygon_shape() is called.
1588            The values are stored in a global struct draw_info.
1589            (draw_polygon_shape): Removed initialization code that is
1590            now in draw_polygon_init().
1591    
1592            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
1593            drawing initialization call to draw_polygon_init()
1594            (MapRenderer.draw_polygon_shape): Use new signature of
1595            draw_polygon_shape.
1596    
1597            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
1598            weirdness by setting the range to (1, maxint).
1599    
1600            * Thuban/Model/classification.py (ClassGroupProperties): Make
1601            instance variables private and optimize comparison operator
1602            by first checking if the color references are the same.
1603            (ClassGroupSingleton): Make instance variables private.
1604            (ClassGroupRange): Make instance variables private.
1605    
1606            * HOWTO-Release: Filled in missing steps for releasing packages.
1607    
1608    2003-04-15  Bernhard Herzog  <[email protected]>
1609    
1610            First stab at internationalized messages:
1611    
1612            * Thuban/__init__.py (_): Implement the translation function for
1613            real using the python gettext module.
1614    
1615            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
1616            translate empty strings.
1617    
1618            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1619            Add a missing space to a warning message
1620    
1621            * po/README: New. Notes about the management of the translation
1622            files.
1623    
1624            * po/Makefile: New. Makefile to help manage the translation files.
1625    
1626            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
1627    
1628            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
1629            translations and support files in po/
1630    
1631            * setup.py (data_files): Add the *.mo files to the data_files too
1632    
1633            * README: Add note about the translations when building from CVS
1634    
1635    2003-04-14  Jonathan Coles   <[email protected]>
1636    
1637            * Thuban/UI/dock.py: Fixes some window resizing problems most
1638            noticable under windows. Always assume the button bitmaps will
1639            be there. Code clean up.
1640            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
1641            images for the dock/undock button to the same images.
1642            Work around for RTbug #1801.
1643    
1644            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
1645            be allowed to grow within the sizer. Fixes a bug under Windows
1646            where the toolbar wasn't being drawn.
1647    
1648    2003-04-14  Frank Koormann   <[email protected]>
1649    
1650            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
1651            Updated design to try to make the button functionality more
1652            transparent.
1653    
1654  2003-04-14  Jonathan Coles   <[email protected]>  2003-04-14  Jonathan Coles   <[email protected]>
1655    
1656          * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to          * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to

Legend:
Removed from v.662  
changed lines
  Added in v.1015

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26