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

Legend:
Removed from v.190  
changed lines
  Added in v.1008

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26