/[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 22 by bh, Tue Sep 4 16:45:57 2001 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]>
2973    
2974            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
2975            absolute filename.
2976    
2977    2002-08-22  Bernhard Herzog  <[email protected]>
2978    
2979            * Thuban/Model/table.py (Table.write_record): New method to write
2980            records.
2981            (Table.__init__): Open the DBF file for writing too.
2982    
2983            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
2984            into the underlying table.
2985    
2986            * extensions/shapelib/shapefil.h (DBFCommit),
2987            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
2988            commit any changes made to the DBF file.
2989    
2990            * Thuban/UI/mainwindow.py (make_check_current_tool)
2991            (_tool_command): Put the code that generates the "checked"
2992            callback into a separate function so that we can reuse it
2993            elsewhere
2994    
2995            * Thuban/Model/save.py (Saver): New class to handle serializing a
2996            session into an XML file. The main reason to introduce a class is
2997            that applications built on Thuban can derive from it so that they
2998            can save additional information in a session file.
2999            (save_session): Delegate almost all the work to the Saver class.
3000            Rename the filename argument to file because it may be a file like
3001            object now.
3002    
3003            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
3004            code. Remove the little test code which would be executed when the
3005            module is run as a script which didn't work anymore since it can't
3006            import the other Thuban modules.
3007            (ProcessSession, load_session): Refactor the ProcessSession to
3008            have one method for each element start and end tag so that derived
3009            classes can easily override the processing of individual tags.
3010            Also, always parse with namespaces enabled because applications
3011            built on top of Thuban will likely use namespaces if they extend
3012            the session file format.
3013    
3014    2002-08-21  Bernhard Herzog  <[email protected]>
3015    
3016            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3017            because thubaninit_contents will do it for us.
3018    
3019    2002-08-16  Jan-Oliver Wagner <[email protected]>
3020    
3021            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3022            tree window already open
3023    
3024    2002-08-15  Bernhard Herzog  <[email protected]>
3025    
3026            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
3027            with self.
3028    
3029            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
3030            when we have actually captured it.
3031    
3032            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
3033            shapefile and destroy the table.
3034    
3035            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
3036    
3037    2002-08-14  Bernhard Herzog  <[email protected]>
3038    
3039            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
3040            instance variable columns
3041            (RecordTable.GetTypeName): row and col may be negative in some
3042            cases.
3043    
3044            * setup.py (InstallLocal.initialize_options)
3045            (InstallLocal.finalize_options, InstallLocal.user_options): New
3046            option create-init-file to build a thubaninit.py when running
3047            install_local
3048            (InstallLocal.run): Create the thubaninit.py module when requested
3049            (thubaninit_contents): Split the template into several parts and
3050            create a new function thubaninit_contents that creates the
3051            contents of a thubaninit module.
3052            (ThubanInstall.run): Use the new function to create the thubaninit
3053            module.
3054    
3055    2002-07-30  Bernhard Herzog  <[email protected]>
3056    
3057            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
3058            cleanup.
3059            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
3060    
3061            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
3062            direct base class' Destroy method.
3063    
3064            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
3065            layers.
3066            (Map.Destroy): Destroy the label_layer as well and call the
3067            inherited Desatroymethod first so that no more messages are
3068            issued.
3069            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
3070            message if the stacking order actually has changed. Add
3071            doc-strings.
3072            (Map.BoundingBox): Correct the doc-string.
3073            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
3074            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
3075    
3076            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
3077            all labels.
3078    
3079    2002-07-29  Bernhard Herzog  <[email protected]>
3080    
3081            * Thuban/Model/map.py (Map.subscribe_layer_channels)
3082            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
3083            to a layer's channels into separate methods.
3084            (Map.RemoveLayer, Map.AddLayer): Call the new methods
3085            (Map.Destroy): Unsubscribe from a layer's channels before
3086            destroying it.
3087    
3088            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
3089            selected_layer parameter to searched_layer which is the layer to
3090            search in.
3091            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
3092            search to that layer. Return the selected layer and shape.
3093    
3094            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
3095            typo
3096    
3097    2002-07-24  Bernhard Herzog  <[email protected]>
3098    
3099            * Thuban/UI/application.py (ThubanApplication.create_session):
3100            Extend the doc string.
3101            (ThubanApplication.subscribe_session)
3102            (ThubanApplication.unsubscribe_session): New methods to
3103            subscribe/unsubscribe to/from session channels.
3104            (ThubanApplication.SetSession): Call the new methods here.
3105            (ThubanApplication.maps_changed, ThubanApplication.set_map):
3106            Renamed set_map to maps_changed. Its now a subscriber for
3107            MAPS_CHANGED.
3108    
3109            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
3110            x-coordinate in case of simple clicks
3111    
3112            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
3113            don't pass it as a parameter
3114    
3115            * Thuban/Model/session.py (Session.RemoveMap): New
3116    
3117            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3118            window size into a parameter.
3119    
3120    2002-07-23  Bernhard Herzog  <[email protected]>
3121    
3122            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3123            just commands.
3124    
3125            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
3126            parameter list a bit to allow setting the window title and the
3127            initial message in the status bar. Update the callers.
3128    
3129            * Thuban/UI/application.py (ThubanApplication.OnInit)
3130            (ThubanApplication.CreateMainWindow): Put the mainwindow
3131            instantiation into a separate method so that it can be overridden
3132            by a subclass.
3133    
3134    2002-07-19  Bernhard Herzog  <[email protected]>
3135    
3136            * Thuban/Model/session.py: Issue a CHANGED message every time
3137            another changed message is issued to make it easier to get
3138            notified of changes.
3139            (Session): Update the doc string
3140            (Session.forward): Issue changed-events as CHANGED as well.
3141            (Session.changed): Overwrite the inherited version to issue
3142            CHANGED events as well.
3143    
3144            * Thuban/UI/tree.py: We can now simply subscribe to the session's
3145            CHANGED channel to be informed of changes.
3146            (SessionTreeCtrl.session_channels): Not needed any longer.
3147            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3148            Only have to (un)subscribe CHANGED
3149    
3150            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3151    
3152            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
3153            for the wxPython locale bug to __init__.py so that it's
3154            automatically executed by anybody using UI code from Thuban.
3155    
3156    2002-07-18  Bernhard Herzog  <[email protected]>
3157    
3158            * Thuban/UI/main.py (main): app no longer needs to be global
3159    
3160            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
3161            as parameter and store it in an instance variable
3162            (MainWindow.invoke_command, MainWindow.update_command_ui)
3163            (MainWindow.save_modified_session, MainWindow.NewSession)
3164            (MainWindow.OpenSession, MainWindow.SaveSession)
3165            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
3166            application object.
3167    
3168            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
3169            the main window with self.
3170    
3171            * Thuban/UI/context.py: New module with the context class
3172    
3173            * Thuban/UI/command.py (Command): Update doc string.
3174    
3175            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
3176            MainWindow.update_command_ui): Pass an instance of the context
3177            class to the command's methods
3178            (check_current_tool, call_method): Handle the new context
3179            implementation
3180    
3181            * Examples/simple_extensions/simple_tool.py (simple_tool,
3182            check_simple_tool): Handle the new context implementation
3183    
3184            * Examples/simple_extensions/simple_command.py (simple_command):
3185            Handle the new context implementation. Update the comments about
3186            the context.
3187    
3188            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
3189            doc-string
3190            (ThubanApplication.Session): New method to return the session
3191            object
3192    
3193            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
3194            interactor's selected_layer may not be a layer of the current
3195            session when the tree is updated while a new session is being set.
3196    
3197    2002-07-17  Bernhard Herzog  <[email protected]>
3198    
3199            * Thuban/UI/tree.py (color_string): Removed. No longer used.
3200            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
3201            update_tree into update_tree and add_items. The tree now uses a
3202            more generic way to display the contents of the tree.
3203            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
3204    
3205            * Thuban/Model/layer.py (Layer.TreeInfo),
3206            Thuban/Model/extension.py (Extension.TreeInfo),
3207            Thuban/Model/map.py (Map.TreeInfo),
3208            Thuban/Model/session.py (Session.TreeInfo):
3209            Add TreeInfo methods to implement the new tree view update scheme
3210    
3211    2002-07-16  Bernhard Herzog  <[email protected]>
3212    
3213            * Thuban/UI/application.py: Don't use "import from" for the
3214            MainWindow. It can't always be resolved.
3215            (ThubanApplication.OnInit): change reference to MainWindow
3216            accordingly.
3217    
3218            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
3219            completely
3220    
3221    2002-07-10  Bernhard Herzog  <[email protected]>
3222    
3223            * setup.py (create_init_module): New configurable variable whose
3224            default depends on the platform we're running on.
3225            (ThubanInstall.initialize_options): Initialize
3226            self.create_init_module from the global create_init_module
3227            (ThubanInstall.user_options): indictate that the options
3228            create-init-module and init-module-dir have arguments.
3229    
3230            * setup.py: In the setup call change the version number to include
3231            cvs.
3232    
3233            * MANIFEST.in: Add the files in Examples
3234    
3235    2002-07-09  Bernhard Herzog  <[email protected]>
3236    
3237            * setup.py: In the setup call, use the thuban homepage as the
3238            value of the url parameter.
3239    
3240            * Examples: New subdirectory for examples.
3241    
3242            * Examples/simple_extensions/simple_tool.xpm,
3243            Examples/simple_extensions/simple_tool.py,
3244            Examples/simple_extensions/simple_command.py,
3245            Examples/simple_extensions/README: Simple examples showing how to
3246            add new commands and tools.
3247    
3248            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
3249            bdist_rpm that we also have an install script.
3250            (bdist_inno): Add 2002 to the copyright notice.
3251    
3252            * setup.py: Create a file in python's site-packages directory to
3253            make installation of Thuban as a library easier.
3254            (ThubanInstall.user_options): Add two new options,
3255            create-init-module and init-module-dir
3256            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
3257            filenames for installation in the default directories.
3258            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
3259            the inherited methods to capture some filenames before they're
3260            transformed too much by distutils.
3261            (ThubanInstall.run): Create the init module if requested.
3262            (ThubanInstall.thuban_init_filename): New method to return the
3263            full name of the init module.
3264            (ThubanInstall.get_outputs): Append the filename of the init
3265            module.
3266    
3267    2002-07-08  Bernhard Herzog  <[email protected]>
3268    
3269            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
3270            handle the prefix properly which means that the default for the
3271            installation prefix should be /usr for RPMs and /usr/local when
3272            doing a normal source install.
3273            (bdist_rpm_install_script): Script to override the default install
3274            commands in the specfile generated by the bdist_rpm command.
3275            (thuban_bdist_rpm.user_options): Add a prefix option
3276            (thuban_bdist_rpm.initialize_options): Init the prefix option.
3277            Create the script files for the spec files as empty files here
3278            (thuban_bdist_rpm._make_spec_file): Override the inherited method
3279            to fill the script files with content.
3280    
3281            * Thuban/Model/save.py (relative_filename): Wrapper around
3282            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
3283            argument. save_session now automatically uses this version,
3284            solving a problem when saving to a relative filename.
3285    
3286            * setup.py: In the setup call, make sure that the library
3287            directories are under $prefix/lib not directly under $prefix.
3288    
3289    2002-06-20  Jan-Oliver Wagner <[email protected]>
3290    
3291            * Thuban/Model/extension.py: new module to handle extension objects.
3292            * Thuban/Model/messages.py: new messages for extensions.
3293            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
3294            Session.AddExtension): new for handling extensions.
3295            Also some other minor changes to round up extension handling.
3296            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
3297            of Extension titles and title and names of its objects.
3298    
3299    2002-05-29  Bernhard Herzog  <[email protected]>
3300    
3301            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
3302            the events for a command.
3303            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
3304            Call bind_command_events to bind the events. add_toolbar_command
3305            can now bind events too so that it's possible to have commands
3306            that are only available through the toolbar.
3307            (MainWindow.init_ids): New instance variable events_bound to keep
3308            track of for which commands events have been bound.
3309    
3310    2002-05-28  Bernhard Herzog  <[email protected]>
3311    
3312            * Thuban/UI/menu.py: New module to build and manage menus.
3313    
3314            * Thuban/UI/mainwindow.py: Remove some unused imports.
3315            (MainWindow.__init__, main_menu): move the definition of the main
3316            menu from __init__ to the Menu instance main_menu.
3317            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
3318            build the menu bar and sub-menus from a menu description.
3319    
3320            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
3321            startup file
3322            (ThubanApplication.read_startup_files): New method to run
3323            ~/.thuban/thubanstart.py
3324    
3325            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
3326            Move the toolbar definition to the Menu instance main_toolbar.
3327            (MainWindow.build_toolbar): New method to build the toolbar
3328            similar to the build_menu methods
3329    
3330    2002-05-23  Bernhard Herzog  <[email protected]>
3331    
3332            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
3333            layer_outline_color. Fix it in the definition of the command too.
3334    
3335            * Thuban/UI/command.py (Command): Fix typo in doc string
3336    
3337    2002-05-22  Bernhard Herzog  <[email protected]>
3338    
3339            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
3340            in the docstring
3341    
3342    2002-05-15  Bernhard Herzog  <[email protected]>
3343    
3344            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
3345            when the shapefile is empty.
3346            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
3347            now return None for empty shapefiles. Update doc-strings.
3348    
3349            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
3350            the layer's bbox being None.
3351    
3352            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
3353            layer's bbox being None.
3354    
3355            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
3356            necessary.
3357            (MapCanvas.__init__): New instance variables, last_selected_layer
3358            and last_selected_shape to determine how the selection has
3359            changed.
3360    
3361            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
3362            AutoSizeColumns because it will cause a traversal of the entire
3363            table which for large .dbf files will take a very long time.
3364    
3365    2002-05-14  Bernhard Herzog  <[email protected]>
3366    
3367            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
3368            maximum depth for the tree than shapelib does by default.
3369    
3370    2002-05-10  Bernhard Herzog  <[email protected]>
3371    
3372            * setup.py (py_modules): The shptree modules doesn't have a
3373            wrapper, so don't include it in the py_modules
3374    
3375    2002-05-08  Bernhard Herzog  <[email protected]>
3376    
3377            * extensions/shapelib/shptree.c (compare_ints): Make arguments
3378            const void * as in the qsort prototype
3379            (SHPTreeFindLikelyShapes): Remove some unused variables.
3380    
3381            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
3382            maintains to redraw the window during a drag.
3383            (MapCanvas.unprojected_rect_around_point): New method to determine
3384            a small region around a point for hit-testing.
3385            (MapCanvas.find_shape_at): Only test the shapes in a small region
3386            around the point.
3387    
3388            * setup.py: Increment the version to 0.1.2
3389    
3390            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
3391            debug print and set session to None after unsubscribing
3392    
3393    2002-05-07  Bernhard Herzog  <[email protected]>
3394    
3395            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
3396            the file to have a .thuban extension.
3397    
3398            * Thuban/UI/tree.py (session_channels): New class constant with
3399            all the session channels to subscribe to to update the tree
3400            (SessionTreeCtrl.session_changed): Remember the session so that we
3401            can unsubscribe properly. Use the new class constant to
3402            unsubscribe from the old session and subscribe to the new one.
3403            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
3404            subscriptions of the SessionTreeCtrl.
3405            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
3406    
3407            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
3408            Session Tree" command to the file menu.
3409    
3410            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
3411            as update_region to the renderer.
3412    
3413            * Thuban/UI/renderer.py
3414            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
3415            update box is now directly a tuple, not a wxRect anymore.
3416    
3417            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
3418            prints.
3419    
3420    2002-05-07  Bernhard Herzog  <[email protected]>
3421    
3422            * setup.py: Add the shptree extension module. See
3423            extensions/pyshapelib/ChangeLog for more details.
3424    
3425            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
3426            extensions/shapelib/dbfopen.c: Really update to the versions of
3427            shapelib 1.2.9. For some reason it wasn't really done on
3428            2002-04-11.
3429    
3430            * extensions/shapelib/shptree.c: Modified version of shptree.c of
3431            shapelib 1.2.9. The only real difference is the use of qsort
3432            instead of a bubble sort implementation
3433    
3434            * Thuban/Model/layer.py (Layer.__init__): New instance variable
3435            shapetree to hold the shapelib quadtree for the shapefile
3436            (Layer.open_shapefile): Create the quad tree.
3437            (Layer.ShapesInRegion): New method to return the ids of shapes in
3438            a given region using the quad tree.
3439    
3440            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
3441            comment
3442            (draw_polygon_shape): Accept both arcs and polygons.
3443            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
3444            the api.
3445    
3446            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
3447            return the shape ids to be rendered in a given layer.
3448            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
3449            ids. Use draw_polygon_shape to draw arc shapes as well.
3450            (ScreenRenderer.RenderMap): New parameter for the rectangle that
3451            has to be updated
3452            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
3453            calling it's ShapesInRegion method.
3454    
3455            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3456            update_region for the update region.
3457            (MapCanvas.OnPaint): Maintain the update region
3458            (MapCanvas.do_redraw): Pass the bounding box of the update_region
3459            to the renderer when drawing the bitmap. Reset the update_region.
3460    
3461    2002-05-03  Bernhard Herzog  <[email protected]>
3462    
3463            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
3464            MainWindow.OpenSession): Change the file extension of the session
3465            files to .thuban
3466    
3467            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
3468            Move the map channels to be forwarded by the session into the
3469            class constant with forwarded_channels. Also add
3470            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
3471            forwarded_channels
3472    
3473            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
3474            typo and some rewording).
3475    
3476    2002-05-02  Bernhard Herzog  <[email protected]>
3477    
3478            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
3479            around to speed up most redraws:
3480            (MapCanvas.__init__): New instance variable bitmap which holds the
3481            bitmap
3482            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
3483            self.bitmap to draw.
3484            (MapCanvas.full_redraw): New method to force a full redraw
3485            including the bitmap
3486            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
3487            make sure the bitmap is redrawn.
3488            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
3489            MapCanvas.shape_selected): Call full_redraw instead of readraw to
3490            make sure the bitmap is redrawn.
3491            (MapCanvas.OnSize): New method to handle size events so that the
3492            bitmap can be redrawn.
3493    
3494    2002-04-29  Bernhard Herzog  <[email protected]>
3495    
3496            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3497            canvas' VIEW_POSITION event
3498            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
3499            Update the text in the status-bar accordingly.
3500    
3501            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
3502            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
3503            called.
3504            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
3505            current_position
3506            (MapCanvas.set_current_position): New method to set
3507            current_position. Issue a VIEW_POSITION event
3508            (MapCanvas.CurrentPosition): New public method to return the value
3509            of current_position. Should be called when the VIEW_POSITION event
3510            is processed.
3511            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
3512            Update the position.
3513            (MapCanvas.OnLeaveWindow): Set the position to None.
3514    
3515            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
3516            position in the statusbar
3517    
3518    2002-04-26  Frank Koormann <[email protected]>
3519    
3520            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
3521    
3522    2002-04-24  Frank Koormann <[email protected]>
3523    
3524            * Resources/Bitmaps/identify.xpm: shadow added
3525    
3526            * Resources/Bitmaps/fullextent.xpm: new
3527    
3528    2002-04-22  Jan-Oliver Wagner <[email protected]>
3529    
3530            * 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
3536    
3537            * Thuban/UI/tree.py (update_tree): added added map extent
3538    
3539            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
3540            icon; added map_full_extend as tool
3541    
3542    2002-04-19  Jan-Oliver Wagner <[email protected]>
3543    
3544            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
3545            saving _new_ sessions
3546    
3547            * Thuban/Model/session.py (create_empty_session): new session
3548            don't have a filename (set to None)
3549    
3550            * Thuban/UI/tree.py (update_tree): added filename and modified flag
3551    
3552            * Thuban/Model/load.py (ProcessSession): convert projection
3553            parameters from unicode to regular string
3554    
3555            * Data/iceland_sample.session: Added UTM Zone 26 projection.
3556    
3557    2002-04-11  Bernhard Herzog  <[email protected]>
3558    
3559            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
3560            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
3561            1.2.9
3562    
3563            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
3564            the pyshapelib directoy into the list of include dirs, so that
3565            pyshapelib_api.h can be found.
3566    
3567            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
3568            holds the pyshapelib C-API
3569            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
3570            pyshapelib_api to access the shapelib functions.
3571            (initwxproj): Import the c_api from the shapelib module and
3572            initialize pyshapelib_api.
3573    
3574    2002-04-04  Bernhard Herzog  <[email protected]>
3575    
3576            * setup.py (thuban_bdist_rpm.initialize_options): Use
3577            initialize_options to create the scripts for the rpm.
3578    
3579            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
3580    
3581    2002-04-03  Bernhard Herzog  <[email protected]>
3582    
3583            * setup.py: Increment version to 0.1.1
3584    
3585            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
3586            Layer" and "Remove Layer" commands from the layer menu to the map
3587            menu
3588    
3589    2002-02-15  Bernhard Herzog  <[email protected]>
3590    
3591            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
3592            argument (python <= 1.5.2 erroneously accepted multiuple
3593            arguments)
3594    
3595    2002-02-04  Bernhard Herzog  <[email protected]>
3596    
3597            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
3598            RecordGrid in the identifyview.
3599            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
3600            IdentifyListCtrl. The grid allows editing of the values.
3601    
3602            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
3603            implementing a grid for a single row of a thuban table.
3604    
3605            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
3606            layers by default. Easier to use than the previous default of only
3607            searching through the select layer which meant that if no layer
3608            was selected, you couldn't select a shape.
3609    
3610            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
3611    
3612            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
3613            stroke_width attribute
3614    
3615            * Thuban/Model/save.py (save_session): Write the new stroke_width
3616            attribute
3617    
3618            * Thuban/Model/load.py (ProcessSession.startElement): Read the
3619            stroke_width attribute
3620    
3621            * Thuban/Model/layer.py (Layer.__init__): New parameter and
3622            instance variable stroke_width
3623            (Layer.SetStrokeWidth): Set the stroke_width.
3624    
3625    2002-02-01  Bernhard Herzog  <[email protected]>
3626    
3627            * extensions/thuban/wxproj.cpp (project_points): Fix two
3628            off-by-one errors in the last loop that joins the various parts
3629            together.
3630    
3631    2002-01-14  Bernhard Herzog  <[email protected]>
3632    
3633            * setup.py (data_dist.make_distribution): Fix some typos
3634    
3635    2001-09-18  Bernhard Herzog  <[email protected]>
3636    
3637            * README: Slight tweaking in preparation for the 0.1 release
3638    
3639            * setup.cfg: Add section for sdist to create both tgz and zip
3640            archives
3641    
3642            * setup.py: increase version number to 0.1
3643            (data_dist): New command class for data distribution
3644    
3645    2001-09-14  Bernhard Herzog  <[email protected]>
3646    
3647            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
3648            Handle the case of no layer (i.e. layer is None) properly.
3649    
3650            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
3651            Set the initial selection of the combo boxes to reflect the
3652            projection we're starting with in a way that works on windows,
3653            too.
3654    
3655            * Thuban/Lib/connector.py (Connector.print_connections): Print the
3656            puiblisher's ids in hex to make it easier to compare them to the
3657            standard repr of python methods
3658    
3659            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
3660            messages
3661    
3662    2001-09-13  Bernhard Herzog  <[email protected]>
3663    
3664            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
3665            deselect the layer if no layer is selected
3666    
3667            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
3668            idle time when there actually is something to draw. If there's
3669            nothing to draw simply clear the window
3670            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
3671            (MapCanvas.SetMap): force a redraw in all cases because
3672            FitMapToWindow doesn't always do it.
3673            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
3674            specify the point to move into the center of the window
3675            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
3676            dragged, zoon in/out by a factor of 2
3677            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
3678            index, i.e. reversed drawing order) so that objects appearing to
3679            be in from of others are selected first. This is probably mostly
3680            relevant for point shapes where the symbols used may overlap
3681    
3682            * Thuban/Model/session.py (create_empty_session): Unset the
3683            modified bit before returning it
3684    
3685            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
3686            create_empty_session session to create the new, empty session.
3687    
3688            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
3689            the tool bitmaps.
3690            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
3691            the code that asks whether the session should be saved into the
3692            new method save_modified_session.
3693            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
3694            method to save modified session here too.
3695    
3696    2001-09-11  Bernhard Herzog  <[email protected]>
3697    
3698            * setup.py (InnoIconItem): fix typo
3699    
3700            (thuban_bdist_inno.run):
3701            (bdist_inno.run): Move the decision not to create symlinks on
3702            non-nt platforms to thuban_bdist_inno and do it unconditinally
3703            since we never want to create the symlinks here
3704    
3705    2001-09-10  Bernhard Herzog  <[email protected]>
3706    
3707            * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
3708            identify view immediately
3709    
3710            * Thuban/UI/controls.py: New file with two classes RecordListCtrl
3711            and SelectableRecordListCtrl that implement the code shared by the
3712            identify view and the label dialog
3713    
3714            * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
3715            new class RecordListCtrl
3716    
3717            * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
3718            return value of GetValue is None instead of using it as a boolean
3719            directly so that Zero numbers are handled properly.
3720            (LabelListCtrl): Derive from the new class
3721            SelectableRecordListCtrl
3722    
3723            * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
3724            (Proj4Dialog.dialogLayout): Make the window resizable and set the
3725            size of the text control explicitly to make the sizers work on
3726            both Windows and X.
3727    
3728    2001-09-07  Bernhard Herzog  <[email protected]>
3729    
3730            * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
3731            that can limit the search to the currently selected layer.
3732            (MapCanvas.SelectShapeAt): Make sure that the currently selected
3733            layer stays selected even when no shape is found
3734            (MapCanvas.FitRectToWindow): If the rect has zero with or zero
3735            height do nothing (avoids zero division errors)
3736    
3737    2001-09-06  Bernhard Herzog  <[email protected]>
3738    
3739            * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
3740            Correct the spelling of SessionTreeCtrl. dabbrev is too damn
3741            convenient :-)
3742            (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
3743            a new instvar layer_to_item to map layers to tree items
3744            (SessionTreeCtrl.layer_selected): Select the appropriate tree item
3745            to match the current selection in the interactor
3746    
3747            * Thuban/UI/interactor.py (Interactor.SelectedLayer):
3748            (Interactor.HasSelectedLayer): New methods to query the current
3749            selection
3750    
3751            * Thuban/UI/mainwindow.py (MainWindow.current_layer):
3752            (MainWindow.has_selected_layer): Simply call the appropriate
3753            interactor method
3754    
3755            * Thuban/UI/mainwindow.py (MainWindow.__init__):
3756            (MainWindow.LayerShowTable):
3757            (MainWindow.identify_view_on_demand): Store the interactor in an
3758            instvar and use that reference instead of going through main.app
3759    
3760            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
3761            * Thuban/UI/application.py (ThubanApplication.OnInit):
3762            * Thuban/UI/main.py (main): Create the session tree view in main
3763            with the new mainwindow method ShowSessionTree and not directly
3764            the application's OnInit method
3765    
3766            * Thuban/UI/tree.py (myTreeCtrlPanel):
3767            (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
3768            TreeCtrl isntead of a panel. This affects most method since we now
3769            refer to self instead of self.tree
3770            (SessionTreeView): New class implementing a non-modal dialog
3771            showing the session tree.
3772    
3773            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
3774            layer to the tableview dialog.
3775    
3776            * Thuban/UI/tableview.py: Add some doc-strings
3777            (TableGrid):
3778            (TableGrid.OnRangeSelect):
3779            (TableGrid.OnSelectCell):
3780            (TableFrame.__init__):
3781            (TableFrame.row_selected):
3782            Selecting rows in the grid view now updates the selected shapes
3783            through the TableFrame. To achieve this we derive TableGrid from
3784            Publisher and introduce the message type ROW_SELECTED which the
3785            TableFrame subscribes to and which is issued by OnRangeSelect and
3786            OnSelectCell
3787    
3788            (DataTable.SelectRow): Removed because it's no longer needed in
3789            the row/shape selection scheme
3790    
3791            * Thuban/UI/dialogs.py: New file implementing common classes for
3792            dialogs
3793    
3794            * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
3795            the SELECTED_SHAPE message anymore. This is now handled by the
3796            parent.
3797            (TableGrid.select_shape): Only update the selection if the shape
3798            is not None.
3799            (TableFrame): Inherit from the new NonModalDialog class.
3800            (TableFrame.__init__, TableFrame.select_shape): Handle the
3801            SELECT_SHAPE message.
3802            (TableFrame.OnClose): Extend the inherited method to unsubscribe
3803            SELECT_SHAPE
3804    
3805            * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
3806            (MainWindow.add_dialog):
3807            (MainWindow.dialog_open):
3808            (MainWindow.remove_dialog):
3809            (MainWindow.get_open_dialog): New methods to maintain a dictionary
3810            of opened non-modal dialogs.
3811    
3812            (MainWindow.__init__): Initialize the new non-modal dictionary
3813            management code
3814            (MainWindow.LayerShowTable): maintain separate dialogs for each
3815            table using the non-modal dialog management code to only open a
3816            view once for each table.
3817    
3818            (MainWindow.IdentifyTool):
3819            (MainWindow.__init__):
3820            (MainWindow.identify_view_on_demand): Don't open the identify view
3821            in IdentifyTool anymore. This will be done automatically by the
3822            new method identify_view_on_demand which handles the
3823            SELECTED_SHAPE message so that the identify view will be opened on
3824            demand
3825    
3826            * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
3827            the interactor argument. The SELECTED_SHAPE message is now handled
3828            by the parent.
3829            (IdentifyView.__init__): Add the interactor argument so that we
3830            can handle the SELECTED_SHAPE message here
3831            (IdentifyView.selected_shape): New method to handle the
3832            SELECTED_SHAPE messages
3833    
3834            * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
3835            NonModalDialog class
3836            (IdentifyView.OnClose): Extend the inherited version to
3837            unsubscribe SELECT_SHAPE
3838    
3839            * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
3840    
3841    2001-09-05  Bernhard Herzog  <[email protected]>
3842    
3843            * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
3844    
3845            * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
3846            interactor to pass through to the MapCanvas
3847    
3848            * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
3849            argument to the MainWindow constructor to get rid of the ugly hack
3850            that made main.app available early just so that the mapcanvas
3851            could access the interactor object.
3852    
3853  2001-09-04  Bernhard Herzog  <[email protected]>  2001-09-04  Bernhard Herzog  <[email protected]>
3854    
3855          * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method          * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
# Line 39  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 76  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.22  
changed lines
  Added in v.1006

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26