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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26