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

Legend:
Removed from v.277  
changed lines
  Added in v.1006

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26