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

Legend:
Removed from v.634  
changed lines
  Added in v.1021

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26