/[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 523 by jan, Wed Mar 12 17:08:23 2003 UTC revision 1040 by bh, Mon May 26 17:31:33 2003 UTC
# Line 1  Line 1 
1    2003-05-26  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
4            implementation. Mark parts of the file format strings for
5            localization.
6    
7            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8            file and add the table to the tables managed by the session
9    
10            * test/test_session.py (TestSessionSimple.test_open_table_file):
11            New. test case for OpenTableFile
12    
13    2003-05-26  Jan-Oliver Wagner <[email protected]>
14    
15            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
16            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
17            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
18            Replace the true/false of wxWindows by True/False of Python 2.2.1.
19    
20    2003-05-26  Jan-Oliver Wagner <[email protected]>
21    
22            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
23            already a selection present, update the grid accordingly.
24    
25            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
26            resizeable and increase its initial size.
27    
28    2003-05-26  Frank Koormann  <[email protected]>
29    
30            Table export functionality
31    
32            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
33            Return width (in characters) for a column.
34            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
35            (table_to_dbf): Write table to dbf file.
36            (table_to_csv): Write table to csv file.
37    
38            * Thuban/Model/transientdb.py (TransientTableBase.Width,
39            TransientTableBase.Precision): Return column width and precision.
40    
41            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
42            or table_to_csv depending on file selection.
43    
44            * test/test_dbf_table.py:
45            Test table_to_dbf (extension of former part of test).
46    
47            * test/test_csv_table.py:
48            Test table_to_csv.
49    
50    2003-05-23  Jan-Oliver Wagner <[email protected]>
51    
52            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
53            Use QueryTableFrame instead of TableFrame.
54    
55            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
56            table window with 'Layer Table:' instead of 'Table:'.
57    
58    2003-05-23  Jan-Oliver Wagner <[email protected]>
59    
60            Give all tables a title via mix-in TitledObject.LayerShowTable
61    
62            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
63            only if it exists.
64    
65            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
66            and call its init-method with a default title. Remove Title() method.
67    
68            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
69            AutoTransientTable): mix-in TitledObject and call its init-method with
70            a default title. Remove Title() method.
71    
72    2003-05-23  Bernhard Herzog  <[email protected]>
73    
74            * Thuban/Model/session.py (Session.AddShapeStore): Define
75            AddShapeStore analogously to AddTable.
76    
77            * test/test_session.py (TestSessionSimple.test_add_shapestore):
78            New. Test for AddShapeStore
79    
80    2003-05-23  Jan-Oliver Wagner <[email protected]>
81    
82            Introducing QueryTableFrame and a very coarse ShowTable implementation.
83    
84            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
85            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
86            The latter implements the selection GUI without dependency on a layer.
87            LayerTableFrame now is derived from QueryTableFrame and connects
88            to a layer.
89    
90            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
91            implementation that still needs work.
92    
93            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
94    
95    2003-05-22  Frank Koormann  <[email protected]>
96    
97            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
98            Added "outer_join = False" as optional parameter.
99            (TransientJoinedTable.create): If outer join is true, perform a
100            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
101            the left table. Records not matching are filled with 0 / None.
102    
103            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
104            (JoinDialog.OnJoin): Consider outer join check box.
105    
106    2003-05-22  Bernhard Herzog  <[email protected]>
107    
108            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
109            somewhat safer way. Storing the traceback in a local variable can
110            lead to memory leaks
111    
112    2003-05-22  Bernhard Herzog  <[email protected]>
113    
114            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
115            the wxMessageDialog's Destroy() method.
116    
117    2003-05-22  Frank Koormann  <[email protected]>
118    
119            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
120            TransientTable.Title()
121    
122    2003-05-22  Frank Koormann  <[email protected]>
123    
124            Join Dialog, initial version.
125    
126            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
127    
128            * Thuban/UI/join.py (JoinDialog): Functional implementation of
129            former framework. Renamed Table1/Table2 to LeftTable/RightTable
130            in all occurences.
131    
132            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
133            Typo fixed.
134    
135    2003-05-22  Bernhard Herzog  <[email protected]>
136    
137            Give the tables titles so that the GUI can display more meaningful
138            names. For now the titles are fixed but depend on e.g. filenames
139            or the titles of the joined tables.
140    
141            * Thuban/Model/transientdb.py (TransientTable.Title)
142            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
143    
144            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
145    
146            * test/test_transientdb.py
147            (TestTransientTable.test_auto_transient_table_title): New. Test
148            for the Title method
149            (TestTransientTable.test_transient_joined_table)
150            (TestTransientTable.test_transient_table): Add test for the Title
151            methods
152    
153            * test/test_memory_table.py (TestMemoryTable.test_title): New.
154            Test for the Title method
155    
156            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
157            the Title method
158    
159    2003-05-22  Bernhard Herzog  <[email protected]>
160    
161            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
162            Provide a better way to destroy the layers
163            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
164            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
165            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
166            the new way to destroy the layers.
167            (TestLayer.test_derived_store): New. Test for using a layer with a
168            DerivedShapeStore
169    
170            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
171            filename if the shape store actually has one.
172    
173    2003-05-22  Bernhard Herzog  <[email protected]>
174    
175            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
176            for the filename
177    
178            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
179            for the FileName method
180            (TestDBFTableWriting.test_write): Fix spelling of filename
181    
182    2003-05-22  Thomas Koester  <[email protected]>
183    
184            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
185            from SciParam that now really is immutable.
186    
187    2003-05-22  Frank Koormann  <[email protected]>
188    
189            Layer Top/Bottom placement added to legend.
190    
191            * Thuban/UI/legend.py
192            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
193            bound to tool events.
194            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
195            New, methods binding the event methods with the map methods.
196    
197            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
198            layer at top/bottom of layer stack.
199    
200            * Resources/Bitmaps/top_layer.xpm: New button icon.
201    
202            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
203    
204    2003-05-22  Bernhard Herzog  <[email protected]>
205    
206            * Thuban/Model/session.py (Session.RemoveTable): New method to
207            remove tables
208    
209            * test/test_session.py (TestSessionSimple.test_remove_table): New.
210            Test for RemoveTable
211    
212    2003-05-22  Thomas Koester  <[email protected]>
213    
214            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
215            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
216    
217    2003-05-22  Bernhard Herzog  <[email protected]>
218    
219            Implement a way to discover dependencies between tables and
220            shapestores.
221    
222            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
223            (TransientJoinedTable.Dependencies)
224            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
225            interface
226            (TransientJoinedTable.__init__): Keep tack of the original table
227            objects in addition to the corresponding transient tables.
228    
229            * Thuban/Model/table.py (DBFTable.Dependencies)
230            (MemoryTable.Dependencies): New. Implement the dependencies
231            interface
232    
233            * Thuban/Model/data.py (ShapeTable): New. Helper class for
234            ShapefileStore
235            (ShapefileStore.__init__): Use ShapeTable instead of
236            AutoTransientTable
237            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
238            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
239            methods for filename and type
240            (ShapefileStore.Dependencies): New. Implement the dependencies
241            interface
242            (DerivedShapeStore): New class to replace SimpleStore. The main
243            difference to SimpleStore is that it depends not on a shapefile
244            but another shapestore which expresses the dependencies a bit
245            better
246            (SimpleStore.__init__): Add deprecation warning.
247    
248            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
249            Test for the Dependencies method.
250    
251            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
252            New. Test for the Dependencies method.
253    
254            * test/test_transientdb.py
255            (TestTransientTable.test_auto_transient_table_dependencies): New.
256            Test for the Dependencies method.
257            (TestTransientTable.test_transient_joined_table): Add test for the
258            Dependencies method.
259    
260            * test/test_session.py (TestSessionSimple.setUp)
261            (TestSessionSimple.tearDown): New. Implement a better way to
262            destroy the sessions.
263            (TestSessionSimple.test_initial_state)
264            (TestSessionSimple.test_add_table): Bind session to self.session
265            so that it's destroyed by tearDown
266            (TestSessionSimple.test_open_shapefile): New. Test for
267            OpenShapefile and the object it returns
268    
269    2003-05-22  Bernhard Herzog  <[email protected]>
270    
271            * Thuban/Model/session.py (Session.AddTable): New method to
272            register tables with the session.
273            (Session.Tables): Return the tables registered with AddTable too.
274    
275            * test/test_session.py (TestSessionSimple.test_add_table): New.
276            Test case for the AddTable method
277    
278    2003-05-22  Frank Koormann  <[email protected]>
279    
280            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
281            lower right corner, center labels for selections, initialize controls
282            in reasonable order for keyboard navigation.
283    
284            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
285            (ProjFrame.__DoOnProjAvail): Determine position of current projection
286            using the wxListBox.FindString() method. Still a problem (#1886)
287    
288            * Thuban/UI/classifier.py
289            (Classifier.__init__, SelectPropertiesDialog.__init__)
290    
291            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
292            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
293            different classification types from here to __init__.
294            (GenUniquePanel.__init__): Set the column width of the first field
295            in the Field ListCtrl to the full width.
296    
297            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
298            Button to 'Export'. Center Buttons in Selection Box, set Focus to
299            Grid.
300            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
301            changes focus to the Selection when pressing "Alt-S".
302    
303            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
304            the text if not visible. The italic font sometimes exceeds the
305            rendering area.
306    
307    2003-05-21  Jonathan Coles   <[email protected]>
308    
309            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
310            to OnClose so that Thuban closes correctly.
311    
312            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
313            DockFrame.OnClose, not DockFrame._OnClose.
314    
315    2003-05-21  Jonathan Coles   <[email protected]>
316    
317            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
318            references to 'inf' and use new Range __init__ to pass floats
319            directly rather than converting them to strings first.
320            Fixes RTBug #1876.
321    
322            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
323            Use new Range ___init__ to pass floats.
324    
325            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
326            filename is a valid image file. Throw IOError otherwise.
327    
328            * Thuban/Model/range.py: Brought over new Range from SciParam that
329            is immutable and has an __init__ which can accept floats.
330    
331            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
332            into try block. AddLayer doesn't throw any exceptions anymore.
333            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
334            try block.
335    
336            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
337            the first item in choices. Fixes RTBug #1882.
338    
339            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
340            has gone to 0 which is a serious problem. abort.
341            (MapRenderer.draw_raster_layer): Catch IOError seperately and
342            print the error from GDAL.
343    
344            * Thuban/UI/tableview.py (TableGrid.__init__): Call
345            ToggleEventListeners to turn on listening.
346            (TableGrid.ToggleEventListeners): New. Turns event listening on
347            and off so as to prevent excessive messages.
348            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
349            to suppress excessive messages when selecting many rows.
350            Fixes RTBug #1880.
351    
352            * Thuban/UI/view.py: Added checks against if scale == 0. This
353            is a serious problem that can occur when an image without
354            geo data is loading and causes the map projection bounds to
355            go to infinity. Right now, the solution is to simply try
356            to recover.
357    
358            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
359            to set the MFILEReceiver attributes even if the data is NULL.
360    
361            * extensions/thuban/gdalwarp.cpp: Improved the error handling
362            and passed GDAL messages back up to the Python layer. Also
363            tried to fix some memory leaks that were present in the original
364            utility but didn't matter because the program aborted.
365    
366            * test/test_range.py: Copied over tests from SciParam. Removed
367            tests against importing. Fixes RTBug #1867.
368    
369    2003-05-21  Bernhard Herzog  <[email protected]>
370    
371            * test/test_load.py: Remove unused imports and restructure the
372            test code
373            (LoadSessionTest): Split into one class for each test and turn
374            LoadSessionTest itself into the base class for all such session
375            tests.
376            (ClassificationTest): New base class for load tests that test
377            classifications
378            (TestSingleLayer, TestLayerVisibility, TestClassification)
379            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
380            for the individual tests
381    
382            * test/support.py (FileLoadTestCase.filename): New base class for
383            file loading tests
384    
385    2003-05-21  Jan-Oliver Wagner <[email protected]>
386    
387            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
388            Mercator' to 'UTM Zone 32' as a more convenient example.
389            Added 'Gauss Krueger Zone 6'.
390    
391            * Data/iceland_sample_raster.thuban: political polygon now
392            filled transparent to have the raster image visible at once.
393    
394    2003-05-21  Frank Koormann  <[email protected]>
395    
396            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
397            OnClose() to keep in sync with extensions. Internally Thuban
398            still uses "underscored" names.
399    
400    2003-05-20  Jonathan Coles   <[email protected]>
401    
402            This puts back Raster layer support. These layers support projections
403            through the GDAL library. Currently, the CVS version is being used.
404            There are no Debian packages available although this may change soon.
405            A GDAL driver was extended to support writing to memory rather to
406            files.
407    
408            There is still some work that needs to be done, such as some error
409            handling when loading invalid images or when there is a problem
410            projecting the image. This putback simply checks in the majority
411            of the work.
412    
413            * setup.py: Add gdalwarp library extension.
414    
415            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
416            Defaults to False, but can be overridden by subclasses if they
417            support classification.
418            (RasterLayer): New. Defines a new layer that represents an
419            image.
420    
421            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
422            tag handler.
423            (SessionLoader.start_layer): Encode the filename.
424            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
425            New. Supports reading a rasterlayer tag.
426    
427            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
428    
429            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
430            get a string in Latin1. If we get such as string convert it to
431            unicode first, otherwise leave if alone before encoding.
432            (SessionSaver.write_layer): Add support for writing both Layers
433            and RasterLayers.
434    
435            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
436            The right argument may not be a string, it could also be a Column.
437    
438            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
439            Make initial window size 600x400. Fixes RTBug #1872.
440    
441            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
442            the dialog is constructed so that we can support layers that
443            do not have classifications.
444            (Classifier._OnTry): Only build a classification if the layer
445            supports one.
446    
447            * Thuban/UI/legend.py: Change all checks that a layer is an
448            instance of Layer into checks against BaseLayer.
449            (LegendTree.__FillTreeLayer): Only add children to a branch if
450            the layer supports classification.
451    
452            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
453            MainWindow.OpenSession): Don't proceed with an action if the
454            user chooses Cancel when they are asked to save changes.
455            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
456            user to select an image file. Create a new RasterLayer and add
457            it to the map.
458    
459            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
460            for rendering RasterLayer layers.
461            (MapRenderer.draw_raster_layer): Actually method that calls
462            the GDALWarp python wrapper and constructs an image from the
463            data returned.
464    
465            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
466            Choices symbols to match those used in the table query method.
467            Replace deprecated method calls on table with new method names.
468    
469            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
470            how small the scale can get. This still needs more testing.
471    
472            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
473            Provides a driver to output in .bmp format.
474    
475            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
476            New. Provides IO routines which write to memory, rather than a file.
477    
478            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
479            of the gdalwarp utility provided in GDAL. Added function calls
480            that can be accessed from python.
481    
482            * Data/iceland_sample_raster.thuban: New. Sample file that uses
483            a raster layer.
484    
485            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
486            layer image data.
487    
488            * Doc/thuban.dtd: Added rasterlayer attribute definition.
489    
490            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
491            tests associated with the raster layer code.
492    
493            * test/test_transientdb.py
494            (TestTransientTable.test_auto_transient_table_query): Added a test
495            for using a Column object as the "right" parameter to a query.
496    
497    2003-05-19  Frank Koormann  <[email protected]>
498    
499            * Thuban/version.py (get_changelog_date):
500            Catch exceptions if ChangeLog does not exist.
501    
502            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
503    
504    2003-05-19  Frank Koormann  <[email protected]>
505    
506            Extended version information for Thuban
507    
508            * Thuban/version.py: New, version information for Thuban: Last
509            modification date and last ChangeLog entry date.
510    
511            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
512            information: Display Thuban, wxPython and Python version.
513    
514    2003-05-16  Bernhard Herzog  <[email protected]>
515    
516            * Thuban/Model/save.py: Remove some unused imports including the
517            __future__ import for nested_scopes as Thuban relies on Python 2.2
518            now.
519            (XMLWriter.encode): Remove the special case for a None argument.
520            In the saver encode is always called with a string argument.
521    
522    2003-05-16  Bernhard Herzog  <[email protected]>
523    
524            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
525            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
526            of the bug was that e.g. float("1.2") would fail. Thuban now
527            requires 2.4.x.
528            
529    2003-05-16  Frank Koormann   <[email protected]>
530    
531            Printing enhancement and WMF export (under Win32)
532    
533            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
534            ScreenRenderer. Renders Map, Legend and Scalebar for export.
535            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
536            PrintRender.
537    
538            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
539            to fullfil information needed for PrinterRenderer.
540            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
541            (MapCanvas.Print): Adapted to new MapPrintout.
542            (OutputTransform): General calculations to transform from canvas
543            coordinates to export/printing devices.
544    
545            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
546            new method_command to call ExportMap, with platform dependency (only
547            __WXMSW__)
548      
549            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
550            of scalebar drawing area as new parameters.
551            
552            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
553    
554            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
555            Update to extended scalebar.DrawScalebar header.
556    
557            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
558    
559            * test/test_scalebar.py: Made test executable as standalone.
560    
561    2003-05-16  Bernhard Herzog  <[email protected]>
562    
563            * Thuban/Model/table.py (Table): Remove this compatibility alias
564            for DBFTable.
565    
566            * test/test_table.py: Import DBFTable as Table because that alias
567            doesn't exist anymore.
568    
569            * Thuban/UI/classgen.py: Remove some unused imports
570    
571    2003-05-14  Jonathan Coles   <[email protected]>
572    
573            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
574            Fix docstring.
575            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
576            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
577            values of the supplied range to determine the beginning and end
578            bounds of the generated classes.
579    
580            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
581            do not have a leading 0 (.5 is now accepted as well as 0.5).
582    
583            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
584            call to ClassGenerator.GenUniformDistribution.
585    
586            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
587            layout bug with the 'Projection' label.
588    
589            * test/support.py (FloatTestCase): New. Needed for the Range tests.
590    
591            * test/test_range.py: New. Imported from SciParam.
592    
593    2003-05-12  Jonathan Coles   <[email protected]>
594    
595            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
596            to table.UniqueValues() with calls that retrieve all the values
597            from the table. This will need to be replaced by a method on table
598            which can simply return the list (perhaps more efficiently).
599    
600    2003-05-12  Jonathan Coles   <[email protected]>
601    
602            The return value of ClassGenerator.CalculateQuantiles has changed.
603            Refer to the documentation for details.
604    
605            * test/test_classgen.py: Modified Quantile tests to use the
606            new return values.
607    
608            * Thuban/Model/classgen.py
609            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
610            use new return values from CalculateQuantiles to produce the correct
611            range bounds in the Classification.
612            (ClassGenerator.CalculateQuantiles): Add more comments describing
613            the return values and parameters. Make minor adjustments to improve
614            the legibility of the code. Fix problem with adjusted not being set
615            in most cases.
616    
617    2003-05-12  Frank Koormann <[email protected]>
618            
619            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
620            and latin1. Fixes #1851 finally.
621    
622    2003-05-09  Jonathan Coles   <[email protected]>
623    
624            * test/test_classgen.py: New. Tests the Quantile algorithm.
625    
626            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
627            Clean up debugging statement, add comments, fix a small bug in the
628            returned adjusted percentiles.
629            
630    2003-05-09  Jonathan Coles   <[email protected]>
631    
632            Introduces Range class from SciParam into the ClassGroupRange class,
633            and such ranges can now be saved and loaded from disk.
634    
635            Quantiles are now available in the Classification Generator.
636    
637            Initial support for building Queries on a table. Doesn't do anything
638            but run some tests.
639    
640            * Thuban/Model/classification.py: Explicit imports.
641            (ClassGroupRange): Use the Range class to store the underlying
642            range information. The interface remains the same, except for
643            GetRange(), and you can also supply a Range object as the min
644            parameter to SetRange or __init__.
645    
646            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
647            string appropriately for use in Thuban. Fixes RTbug #1851.
648            (SessionLoader.end_projection): Handle the context of the
649            projection tag a bit better by looking at what objects are not
650            None. There was an assumption that a projection tag for a map
651            could occur before any layers.
652            (SessionLoader.start_clrange): Provide backward compatibility for
653            reading min/max values as well as the new range parameter.
654    
655            * Thuban/Model/map.py: Explicit imports.
656    
657            * Thuban/Model/resource.py: Import _.
658            (ProjFileSaver.write): write header using projfile.dtd.
659    
660            * Thuban/Model/save.py: Explicit imports.
661            (XMLWriter.encode): New. Encode the given string from a format
662            used by Thuban into UTF-8. Fixes RTbug #1851.
663    
664            * Thuban/UI/classgen.py: Explicit imports.
665            (ClassGenDialog.__init__): Clean up the code and add support
666            for Quantiles.
667            (ClassGenDialog.OnOK): Add support for Quantiles.
668            (GenQuantilesPanel): New. Input panel for Quantiles.
669            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
670            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
671    
672            * Thuban/Model/classgen.py: New. Contains all the classes named above.
673    
674            * Thuban/UI/classifier.py: Explicit imports.
675            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
676            ClassTable.SetValueAsCustom): Reworked to use new Range class.
677    
678            * Thuban/UI/legend.py: Explicit imports.
679    
680            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
681            a Table menu and associated method calls.
682            (MainWindow.choose_color): Removed. No longer needed.
683    
684            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
685            should be disabled if no projection is selected in the available
686            list.
687    
688            * Thuban/UI/renderer.py: Explicit imports.
689    
690            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
691            with correctly selecting the rows and issuing the right events.
692            Be sure to call Skip() to allow the grid to do some of its own
693            handling which allows the rows to actually be selected.
694            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
695            selecting multiple shapes.
696            (LayerTableFrame): Support for building Queries.
697            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
698    
699            * Thuban/UI/tree.py: Explicit imports.
700    
701            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
702            table view can call it.
703    
704            * test/test_classification.py: Explicit imports.
705            (TestClassification.test_ClassGroupRange): Fix test for new
706            Range class.
707    
708            * Doc/thuban.dtd: Add range parameter for clrange.
709    
710            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
711            object in ClassGroupRange, and also uesd for inputting ranges in
712            the classifer table and elsewhere.
713    
714            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
715            yet.
716    
717    2003-05-09  Frank Koormann <[email protected]>
718    
719            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
720    
721    2003-05-08  Frank Koormann <[email protected]>
722    
723            Coding style updates
724    
725            * test/test_scalebar.py: Replaced tab indentation by spaces.
726    
727            * Thuban/UI/scalebar.py: Explicit imports.
728    
729    2003-05-08  Frank Koormann <[email protected]>
730    
731            * Thuban/UI/scalebar.py
732            (ScaleBar.DrawScalebar): Format string bug fixed.
733    
734    2003-05-08  Frank Koormann <[email protected]>
735    
736            Reorganization of scalebar component (no wx in Thuban/Model)
737    
738            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
739            (deriveInterval):
740            Calculate scalebar interval and unit which fits in width for scale.
741            (roundInterval): Round float.
742    
743            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
744    
745            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
746    
747            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
748    
749    2003-05-08  Frank Koormann <[email protected]>
750    
751            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
752            Initialize ScaleBar with canvas.map
753    
754            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
755            round intervals to display smarter lengths
756            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
757            layer. If the maps has no projection applied grey the scalebar.
758    
759    2003-05-07  Frank Koormann <[email protected]>
760            
761            Basic Scalebar features added.
762    
763            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
764    
765            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
766            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
767            and the renderer.
768    
769            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
770    
771            * Thuban/UI/messages.py: SCALE_CHANGED added.
772    
773    2003-05-07  Bernhard Herzog  <[email protected]>
774    
775            * Thuban/Model/session.py (Session.__init__): New instance
776            variable shapestores to hold a list of all open shapestore objects
777            (Session.ShapeStores): New. Accessor method for the shapestores
778            list.
779            (Session._add_shapestore, Session._clean_weak_store_refs): New.
780            Internal methods to maintain the shapestores list.
781            (Session.Tables): New. Return all tables open in the session.
782            (Session.OpenShapefile): Insert the new ShapeStore into the
783            shapestores list.
784    
785            * test/test_session.py (TestSessionSimple.test_initial_state): Add
786            tests for ShapeStores and Tables
787            (TestSessionWithContent.test_shape_stores)
788            (TestSessionWithContent.test_tables): New. Test cases for
789            ShapeStores and Tables
790    
791    2003-05-07  Bernhard Herzog  <[email protected]>
792    
793            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
794            Add comments about the optimizations used.
795            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
796            Implement the ReadValue table interface method.
797    
798            * test/test_transientdb.py
799            (TestTransientTable.run_iceland_political_tests)
800            (TestTransientTable.test_transient_joined_table): Add tests for
801            ReadValue
802    
803    2003-05-07  Frank Koormann <[email protected]>
804    
805            * Resources/Bitmaps/fulllayerextent.xpm,
806            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
807            new icons.
808    
809    2003-05-06  Bernhard Herzog  <[email protected]>
810    
811            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
812            New. Simply delegate to the transient table's version.
813    
814            * test/test_transientdb.py
815            (TestTransientTable.test_auto_transient_table_query): New. Test
816            case for AutoTransientTable's SimpleQuery
817    
818    2003-05-06  Bernhard Herzog  <[email protected]>
819    
820            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
821            Implement a simple query method for the query dialog
822            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
823            the row index or shapeid.
824            (TransientTable.create): Insert the right value of the row index
825            (TransientJoinedTable.create): Copy the row index of the left
826            table to the joined result table
827    
828            * test/test_transientdb.py
829            (TestTransientTable.test_transient_table_read_twice): Fix
830            doc-string
831            (TestTransientTable.test_transient_table_query): New. Test for the
832            SimpleQuery method
833    
834    2003-05-06  Bernhard Herzog  <[email protected]>
835    
836            Convert all table users to use the new table interface. This only
837            covers Thuban itself, not GREAT-ER or other applications built on
838            Thuban yet, so the compatibility interface stays in place for the
839            time being but it now issues DeprecationWarnings.
840    
841            Finally, the new Table interface has a new method, HasColumn.
842    
843            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
844            issue deprecation warnings when they're. The warnings refer to the
845            caller of the method.
846            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
847            for the deprecation warnings
848    
849            * test/test_table.py: Ignore the deprecation warnings for the old
850            table in the tests in this module. The purpose of the tests is to
851            test the old interface, after all.
852    
853            * test/test_transientdb.py
854            (TestTransientTable.run_iceland_political_tests): Use the
855            constants for the types. Add a test for HasColumn
856            (TestTransientTable.test_transient_joined_table): Adapt to new
857            table interface. Add a test for HasColumn
858            (TestTransientTable.test_transient_table_read_twice): Adapt to new
859            table interface
860    
861            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
862            Adapt to new table interface
863    
864            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
865            new table interface
866    
867            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
868            (RecordTable.SetTable): Adapt to new table interface
869    
870            * Thuban/UI/classifier.py (Classifier.__init__)
871            (Classifier.__init__): Adapt to new table interface
872    
873            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
874            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
875            to new table interface
876    
877            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
878            (AutoTransientTable.HasColumn): Implement the new table interface
879            method
880            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
881            (AutoTransientTable.UniqueValues): Adapt to new table interface
882    
883            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
884            Adapt to new table interface
885    
886            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
887            simplify opening shapefiles a bit easier.
888            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
889            (TestLayer.test_point_layer): Use the new helper method
890            (TestLayer.test_get_field_type): New. Test for the GetFieldType
891            method
892    
893            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
894            the new table method
895    
896            * test/test_memory_table.py (TestMemoryTable.test_has_column):
897            Test for the new table method HasColumn
898    
899    2003-05-06  Jonathan Coles   <[email protected]>
900    
901            Addresses the "Selection Extent" wish of RTbug #1787.
902    
903            * Resources/Bitmaps/fulllayerextent.xpm,
904            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
905            extent. These are just place holders for the real bitmaps.
906    
907            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
908            calculate the bounding box once (the first time compute_bbox() is
909            called).
910            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
911            the bounding box for the shapes in lat/long coordinates.
912    
913            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
914            option.
915            (MainWindow.has_selected_shapes): New. Returns true if there are
916            any selected shapes.
917            (MainWindow.FullSelectionExtent): New. Calls
918            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
919            (_has_selected_shapes): New. Returns true if there are any
920            selected shapes.
921    
922            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
923            true if there are any selected shapes.
924    
925            * Thuban/UI/view.py (MapCanvas): Added delegated method
926            HasSelectedShapes.
927            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
928            shapes on the canvas using the map projection (if any).
929    
930            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
931            for Layer.ShapesBoundingBox().
932    
933    2003-05-06  Bernhard Herzog  <[email protected]>
934    
935            * Resources/Projections/defaults.proj: Fix spelling of Mercator
936    
937    2003-05-05  Jonathan Coles   <[email protected]>
938    
939            Addresses the "Full Layer Extent" wish of RTbug #1787.
940    
941            * Resources/Projections/defaults.proj: Added UK National Grid.
942    
943            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
944            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
945            when the user selects the menu option.
946    
947            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
948            scales the given layer on the canvas using the map projection.
949    
950    2003-05-05  Bernhard Herzog  <[email protected]>
951    
952            Convert the table implementations to a new table interface. All
953            tables use a common mixin class to provide backwards compatibility
954            until all table users have been updated.
955    
956            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
957            provide backwards compatibility for table classes implementing the
958            new interface
959            (DBFTable, MemoryTable): Implement the new table interface. Use
960            OldTableInterfaceMixin as base for compatibility
961            (DBFColumn, MemoryColumn): New. Column description for DBFTable
962            and MemoryTable resp.
963    
964            * test/test_dbf_table.py: New. Test cases for the DBFTable with
965            the new table interface.
966    
967            * test/test_memory_table.py: New. Test cases for the MemoryTable
968            with the new table interface.
969    
970            * test/test_table.py: Document the all tests in this file as only
971            for backwards compatibility. The equivalent tests for the new
972            interface are in test_memory_table.py and test_dbf_table.py
973            (MemoryTableTest.test_read): field_info should be returning tuples
974            with four items
975            (MemoryTableTest.test_write): Make doc-string a more precise.
976    
977            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
978            table interface. Derive from from OldTableInterfaceMixin for
979            compatibility.
980            (TransientTableBase.create): New intance variable column_map to
981            map from names and indices to column objects
982            (TransientTable.create): Use the new table interface of the input
983            table
984            (AutoTransientTable): Convert to new table interface. Derive from
985            from OldTableInterfaceMixin for compatibility.
986            (AutoTransientTable.write_record): Removed. It's not implemented
987            yet and we still have to decide how to handle writing with the new
988            table and data framework.
989    
990            * test/test_transientdb.py
991            (TestTransientTable.run_iceland_political_tests)
992            (TestTransientTable.test_transient_joined_table): Use the new
993            table interface
994    
995    2003-05-05  Jonathan Coles   <[email protected]>
996    
997            This is namely a collection of UI updates to improve user interactivity.
998            Tabbing between controls now exists and you can use ESC to close dialog
999            boxes; ENTER will active the default button.
1000    
1001            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1002            order that the controls are created so that tabbing works correctly.
1003            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1004            wxDialog can handle the default button correctly.
1005            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1006            same reasons as for OnOK.
1007            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1008            when we ask the table for the maximum/minimum values of a field
1009            which could take a very long time.
1010    
1011            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1012            order that the controls are created so that tabbing works correctly.
1013            (SelectPropertiesDialog.__init__): Rearrange the order that the
1014            controls are created so that tabbing works correctly.
1015    
1016            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1017            to derive from a wxDialog but behave like the original implementation
1018            which was derived from a wxFrame. wxDialog provides useful key
1019            handling functionality like ESC calling OnCancel and ENTER calling
1020            OnOK which is lost with wxFrame.
1021    
1022            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1023            new dialogs.
1024    
1025            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1026            order that the controls are created so that tabbing works correctly.
1027            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1028            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1029            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1030            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1031            can provide the "UK National Grid" as a default projection.
1032            (UTMPanel.__init__): Rearrange the order that the controls are
1033            created so that tabbing works correctly.
1034    
1035    2003-05-05  Bernhard Herzog  <[email protected]>
1036    
1037            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1038            (project_point): If a map projection but no layer projection is
1039            given, convert degrees to radians before applying the map
1040            projection.
1041    
1042            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1043            (TableGrid.allow_messages): New methods to make it possible to
1044            inhibit message sending.
1045            (TableGrid.issue): Only send the message if not inhibited.
1046            (LayerTableGrid.select_shape): Use the new methods to make sure
1047            that no ROW_SELECTED message is sent while we're updating the
1048            selected rows to match the selected shapes.
1049    
1050    2003-05-02  Jan-Oliver Wagner <[email protected]>
1051    
1052            Implementation of MemoryTable.
1053    
1054            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1055            implementation that operates on a list of tuples. All of the data
1056            are kept in the memory.
1057    
1058            * test/test_table.py (MemoryTableTest): New.
1059    
1060            * test/test_transientdb.py (SimpleTable): Removed.
1061            (TestTransientTable.test_transient_joined_table,
1062            (TestTransientTable.test_transient_table_read_twice): Replaced
1063            SimpleTable by MemoryTable.
1064    
1065    2003-04-30  Jonathan Coles   <[email protected]>
1066    
1067            * Data/iceland_sample.thuban: Now contains correct projections
1068            for each of the layers.
1069    
1070            * Resources/Projections/defaults.proj: Geographic projection
1071            contains unit conversion parameter.
1072    
1073    2003-04-30  Jonathan Coles   <[email protected]>
1074    
1075            The most important part of this putback is the projection changes.
1076            It should now be possible to specify the projection that a layer
1077            is in and then specify a different projection for the map. The
1078            projection dialog has an extra parameter for a geographic projection
1079            which lets the user select if the input is in degrees or radians.
1080    
1081            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1082            to say that the parameter is a tuple of unprojected
1083            points (which is what the callers to this method were assuming).
1084            Also, since the points are unprojected we need to projected them.
1085    
1086            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1087            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1088            groups are selected, move the layer up/down. Fixes RTbug #1833.
1089    
1090            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1091    
1092            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1093            parameter in call to SetClientData.
1094            (GeoPanel): Add support for selecting the units that the
1095            source data is in (Radians or Degrees).
1096    
1097            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1098            the rendering loop by reducing the number of if's, removing the
1099            unnecessary try/except block, and checking if the old group
1100            is the same as the new one (which happens a lot if there is
1101            no classification, or lots of shapes are in the same group).
1102    
1103            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1104            around the redraw routine to try to catch problems that the user
1105            may create by selecting invalid projections for the data set and
1106            map. Clears the display if there are any problems and prints the
1107            error.
1108            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1109            rectangle.
1110    
1111            * extensions/thuban/wxproj.cpp (project_point): First invert the
1112            supplied point (which should be in projected coordinates) using
1113            the layer's projection and then project the point using the
1114            map's projection.
1115            (project_points): Use project_point() to project each point.
1116    
1117    2003-04-30  Jan-Oliver Wagner <[email protected]>
1118    
1119            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1120            don't set the Classification to None if the classfication field
1121            is None (ie only a DEFAULT).
1122    
1123    2003-04-30  Bernhard Herzog  <[email protected]>
1124    
1125            * Thuban/UI/view.py: Fix some typos.
1126    
1127            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1128            not pop up the dialog if the selection becomes empty (this could
1129            happen if e.g. a new selection is opened while the identify tool
1130            is active and dialog had been closed)
1131    
1132    2003-04-30  Bernhard Herzog  <[email protected]>
1133    
1134            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1135            instance variable read_record_last_result
1136            (TransientTableBase.read_record): Make sure reading the same
1137            record twice works. The implementation uses the new instance
1138            variable read_record_last_result
1139    
1140            * test/test_transientdb.py
1141            (TestTransientTable.test_transient_table_read_twice): New test
1142            case for the above bug-fix.
1143    
1144    2003-04-29  Jonathan Coles   <[email protected]>
1145    
1146            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1147    
1148            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1149    
1150            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1151            (ClassTable.SetValueAsCustom): Rename keyword argument in
1152            ClassGroup* constructors to match argument name.
1153    
1154    2003-04-29  Bernhard Herzog  <[email protected]>
1155    
1156            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1157            transient DB if it exists to make sure it doesn't leave a journal
1158            file in the temp directory.
1159    
1160            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1161            self.conn to None after closing the connection to make sure it's
1162            not closed twice
1163    
1164    2003-04-29  Jonathan Coles   <[email protected]>
1165    
1166            Add a visible parameter in the layer XML tag. The default value is
1167            "true". If anything other than "false" is specified we also assume
1168            "true". Addresses RTbug #1025.
1169    
1170            * Doc/thuban.dtd: Add visible parameter to a layer.
1171    
1172            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1173            of visible from 1 to True.
1174            (Layer.__init__): Change default value of visible from 1 to True.
1175    
1176            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1177            parameter.
1178    
1179            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1180            parameter.
1181    
1182            * test/test_load.py: Add new test data contents_test_visible.
1183            (LoadSessionTest.setUp): save test data.
1184            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1185            is loaded correctly.
1186    
1187            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1188            for saving an invisible layer.
1189    
1190    2003-04-29  Jonathan Coles   <[email protected]>
1191    
1192            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1193            legend dialog box and tell it to change its map to the one
1194            supplied to SetMap(). Fixes RTbug #1770.
1195    
1196    2003-04-29  Bernhard Herzog  <[email protected]>
1197    
1198            Next step of table implementation. Introduce a transient database
1199            using SQLite that some of the data is copied to on demand. This
1200            allows us to do joins and other operations that require an index
1201            for good performance with reasonable efficiency. Thuban now needs
1202            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1203            haven't tested that.
1204            
1205            * Thuban/Model/transientdb.py: New. Transient database
1206            implementation.
1207    
1208            * test/test_transientdb.py: New. Tests for the transient DB
1209            classes.
1210    
1211            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1212            classes to help automatically remove temporary files and
1213            directories.
1214            (Session.__init__): New instance variables temp_dir for the
1215            temporary directory and transient_db for the SQLite database
1216            (Session.temp_directory): New. Create a temporary directory if not
1217            yet done and return its name. Use AutoRemoveDir to have it
1218            automatically deleted
1219            (Session.TransientDB): Instantiate the transient database if not
1220            done yet and return it.
1221    
1222            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1223            AutoTransientTable so that data is copied to the transient DB on
1224            demand.
1225            (SimpleStore): New class that simply combines a table and a
1226            shapefile
1227    
1228            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1229            DBFTable and update its doc-string to reflect the fact that this
1230            is only the table interface to a DBF file. Table is now an alias
1231            for DBFTable for temporary backwards compatibility.
1232    
1233            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1234            the last reference to the session goes away so that the temporary
1235            files are removed properly.
1236    
1237            * test/test_load.py (LoadSessionTest.tearDown): Remove the
1238            reference to the session to make sure the temporary files are
1239            removed.
1240    
1241    2003-04-29  Bernhard Herzog  <[email protected]>
1242    
1243            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1244            the __parser instance variable into a normal local variable in
1245            read. It's only used there and read will never be called more than
1246            once. Plus it introduces a reference cycle that keeps can keep the
1247            session object alive for a long time.
1248    
1249    2003-04-29  Jonathan Coles   <[email protected]>
1250    
1251            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1252            Projection an immutable item. Fixes RTbug #1825.
1253            (Projection.__init__): Initialize instance variables here.
1254            (ProjFile.Replace): New. Replace the given projection object with
1255            the new projection object. This solves the problem of needing the
1256            mutator Projection.SetProjection() in the ProjFrame class and
1257            allows a projection to change parameters without changing its
1258            location in the file.
1259    
1260            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1261            be of type wxSAVE and should verify overwriting a file.
1262    
1263            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1264            ProjFile.Replace() method instead of the mutator
1265            Projection.SetProjection(). Also requires that we reassign the
1266            client data to the new projection.
1267    
1268            * test/test_proj.py (TestProjection.test): Test GetName() and
1269            GetAllParameters()
1270            (TestProjFile.test): Remove tests for Set*() methods. Add tests
1271            for Replace().
1272    
1273    2003-04-25  Jonathan Coles   <[email protected]>
1274    
1275            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1276            to save the name of the projection.
1277    
1278            * test/test_save.py (SaveSessionTest.testLayerProjection): New
1279            test to verify layer projections are saved correctly.
1280    
1281    2003-04-25  Jonathan Coles   <[email protected]>
1282    
1283            * Thuban/Model/proj.py (Projection.SetName): Set the name
1284            to "Unknown" if name is None.
1285            (Projection.SetAllParameters): New. Set the projection's
1286            parameter list to the one supplied.
1287            (Projection.SetProjection): New. Set the projection's
1288            properties to those of the supplied Projection.
1289    
1290            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1291            the dialog title to include the map's title.
1292            (MainWindow.LayerProjection): Set the dialog title to include
1293            the layer's title.
1294    
1295            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1296            error dialogs into a single method call.
1297            (ProjFrame.__VerifyButtons): Add more states to check.
1298            (ProjFrame.__GetProjection): Return the current state of an
1299            edited projection or None.
1300            (ProjFrame.__FillAvailList): Remove checks for states that
1301            shouldn't exist.
1302            (ProjFrame._OnNew): Clear all selected items and supply
1303            a projection panel if necessary.
1304    
1305            * test/test_proj.py (TestProjFile.test): Add tests for
1306            ProjFile.SetAllParameters, ProjFile.SetProjection,
1307            ProjFile.SetName.
1308    
1309    2003-04-25  Jonathan Coles   <[email protected]>
1310    
1311            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1312            takes an optional argument to select the current projection.
1313            This does not guarantee that the item is visible due to
1314            limited wxWindows functionality. Fixes RTBug #1821.
1315    
1316    2003-04-25  Jonathan Coles   <[email protected]>
1317    
1318            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
1319            the projection name and use it when constructing the Projection
1320            object.
1321    
1322            * Thuban/Model/proj.py (Projection.__init__): Change the default
1323            value for 'name' to None and then test if name is equal to None
1324            in the body of the constructor. This way the caller doesn't have to
1325            know what the default value should be. Namely, useful in load.py
1326            where we have to pick a default value if the 'name' parameter
1327            doesn't exist in the XML file.
1328    
1329            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
1330            Tests a file where a layer has a projection.
1331    
1332    2003-04-25  Jonathan Coles   <[email protected]>
1333    
1334            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
1335            tree for projection information.
1336    
1337            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
1338            XMLReader.GetFileName.
1339            (SessionLoader): Added support for loading projection tags that
1340            appear inside a layer.
1341    
1342            * Thuban/Model/proj.py (ProjFile): Document the class. Move
1343            back to using a list because the order of the projections in
1344            the file is important to maintain. Fixes RTbug #1817.
1345    
1346            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
1347            to ProjFile.GetFilename.
1348    
1349            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
1350            information.
1351    
1352            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
1353            ProjFrame._OnSaveAs. Removed old dead code from previous
1354            implementation.
1355            (ProjFrame._OnExport): Add support for exporting more than one
1356            projection to a single file.
1357            (ProjFrame.__FillAvailList): use string formatting (% operator)
1358            to build strings that are (partly) translated. Fixes RTbug #1818.
1359    
1360            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
1361            class.
1362    
1363    2003-04-24  Bernhard Herzog  <[email protected]>
1364    
1365            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
1366    
1367            * po/fr.po: New. French translation by Daniel Calvelo Aros
1368    
1369            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
1370            empty strings.
1371    
1372    2003-04-24  Jonathan Coles   <[email protected]>
1373    
1374            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
1375            implement the interface that the ProjFrame dialog expects.
1376    
1377            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
1378            name of the projection to be changed.
1379            (ProjFile): Use a dictionary instead of a list so that removing
1380            projections is easier and we are sure about uniqueness.
1381            (ProjFile.Remove): Remove the given projection object.
1382    
1383            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
1384            Return a list with only one projection file instead of searching for
1385            any projection file. This simplifies many things if the user can
1386            only have one system file and one user file.
1387    
1388            * Thuban/UI/classgen.py: Change all references to
1389            genCombo to genChoice.
1390    
1391            * Thuban/UI/mainwindow.py: Add a Projection option under the
1392            layer menu.
1393            (MainWindow.LayerProjection): New. Open up a projection window
1394            for a layer.
1395    
1396            * Thuban/UI/projdialog.py: Large changes to how the dialog is
1397            laid out. Use three panels instead of one. One for the list of
1398            projections, one for the edit controls, and one for the buttons.
1399            Fixed resizing problems so that the dialog resizes correctly
1400            when the projection panel changes. Added import/export, save, and
1401            new buttons/functionality.
1402    
1403    2003-04-24  Bernhard Herzog  <[email protected]>
1404    
1405            First step towards table management. Introduce a simple data
1406            abstraction so that we replace the data a layer uses more easily
1407            in the next step.
1408    
1409            * Thuban/Model/data.py: New file with a simple data abstraction
1410            that bundles shapefile and dbffile into one object.
1411    
1412            * Thuban/Model/session.py (Session.OpenShapefile): New method to
1413            open shapefiles and return a shape store object
1414    
1415            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
1416            object instead of a shapefile filename. This introduces a new
1417            instance variable store holding the datastore. For intermediate
1418            backwards compatibility keep the old instance variables.
1419            (open_shapefile): Removed. No longer needed with the shape store.
1420            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
1421            get the shape store used by a layer.
1422            (Layer.Destroy): No need to explicitly destroy the shapefile or
1423            table anymore.
1424    
1425            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
1426            (MainWindow.AddLayer): Use the session's OpenShapefile method to
1427            open shapefiles
1428    
1429            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
1430            session's OpenShapefile method to open shapefiles
1431    
1432            * test/test_classification.py
1433            (TestClassification.test_classification): Use the session's
1434            OpenShapefile method to open shapefiles and build the filename in
1435            a more platform independed way
1436    
1437            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1438            Implement to have a session to use in the tests
1439            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1440            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
1441            session's OpenShapefile method to open shapefiles
1442            (TestLayerLegend.setUp): Instantiate a session so that we can use
1443            it to open shapefiles.
1444            (TestLayerLegend.tearDown): Make sure that all references to
1445            layers and session are removed otherwise we may get a resource
1446            leak
1447    
1448            * test/test_map.py (TestMapAddLayer.test_add_layer)
1449            (TestMapWithContents.setUp): Instantiate a session so that we can
1450            use it to open shapefiles.
1451            (TestMapWithContents.tearDown): Make sure that all references to
1452            layers, maps and sessions are removed otherwise we may get a
1453            resource leak
1454            ("__main__"): use support.run_tests() so that more info about
1455            uncollected garbage is printed
1456    
1457            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
1458            session's OpenShapefile method to open shapefiles
1459            ("__main__"): use support.run_tests() so that more info about
1460            uncollected garbage is printed
1461    
1462            * test/test_selection.py (TestSelection.tearDown): Make sure that
1463            all references to the session and the selection are removed
1464            otherwise we may get a resource leak
1465            (TestSelection.get_layer): Instantiate a session so that we can
1466            use it to open shapefiles.
1467            ("__main__"): use support.run_tests() so that more info about
1468            uncollected garbage is printed
1469    
1470            * test/test_session.py (TestSessionBase.tearDown)
1471            (TestSessionWithContent.tearDown): Make sure that all references
1472            to the session and layers are removed otherwise we may get a
1473            resource leak
1474            (TestSessionWithContent.setUp): Use the session's OpenShapefile
1475            method to open shapefiles
1476    
1477    2003-04-24  Jonathan Coles   <[email protected]>
1478    
1479            * Thuban/Model/load.py (XMLReader.read): Should have been checking
1480            if the file_or_filename object had the 'read' attribute.
1481    
1482    2003-04-23  Jonathan Coles   <[email protected]>
1483    
1484            * Thuban/Model/resource.py: Fixes RTbug #1813.
1485            (ReadProjFile): Add documentation about which exceptions are raised.
1486            Always pass the exceptions up to the caller.
1487            (GetProjFiles): If the directory can't be read return an empty list.
1488            If any of the proj files can't be read skip that file and go
1489            on to the next one.
1490    
1491            * test/test_proj.py: Added test cases to handle nonexistent files,
1492            unreadable files, and files that don't parse correctly.
1493    
1494    2003-04-23  Jonathan Coles   <[email protected]>
1495    
1496            Projection dialog. Allows the user to select from a list
1497            of projection templates and optionally edit them and save new ones.
1498    
1499            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
1500            (ProjPanel): Base class for projection specific panels.
1501            (TMPanel): Projection panel for Transverse Mercartor.
1502            (UTMPanel): Projection panel for Universal Transverse Mercartor.
1503            (LCCPanel): Projection panel for Lambert Conic Conformal.
1504            (GeoPanel): Projetion panel for Geographic Projection.
1505    
1506    2003-04-23  Jonathan Coles   <[email protected]>
1507    
1508            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
1509            promote symmetry. There now exists XMLReader and XMLWriter.
1510            (XMLReader.read): New. Call to read the given file descriptor or
1511            filename.
1512            (XMLReader.close): New. Make sure the file is closed.
1513            (XMLReader.GetFileName): New. Return just the file name that is being
1514            read from.
1515            (XMLReader.GetDirectory): New. Return just the directory of the file
1516            that is being read.
1517            (XMLReader.AddDispatchers): New. Take a dictionary which contains
1518            the names of functions to call as the XML tree is parsed.
1519            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
1520            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
1521            (SessionLoader): Removed class variables start_dispatcher and
1522            end_dispatcher since this functionality is now part of a class
1523            instance. Fixes RTbug #1808.
1524            (SessionLoader.__init__): Add dispatcher functions.
1525            (load_xmlfile): Code was moved into the XMLReader.read().
1526            (load_session): Use modified SessionLoader.
1527    
1528            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
1529            map's projection.
1530    
1531            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
1532            GetAllParameters.
1533            (Projection.GetParameter): Returns the value for the given parameter.
1534    
1535            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
1536            (GetProjFiles): Renamed from GetProjections. Now returns a list
1537            of ProjFile objects.
1538            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
1539            a list of ProjFile objects whose files are not user defined.
1540            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
1541            list of ProjFile objects whose files are user defined.
1542            (ProjFileReader): Extend new XMLReader.
1543    
1544            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
1545            promote symmetry.
1546    
1547            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
1548            control instead of a wxComboBox. wxChoice controls do not generate
1549            events as the uses highlights possible choices which fixes problems
1550            with resizing the dialog when the use selects an option.
1551    
1552            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
1553            control instead of a wxComboBox.
1554    
1555            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
1556            dialog.
1557    
1558            * test/test_proj.py (TestProjection.test): New tests for GetParameter
1559            method.
1560    
1561    2003-04-22  Bernhard Herzog  <[email protected]>
1562    
1563            * Thuban/UI/mainwindow.py: Remove some unused imports and global
1564            constants
1565    
1566            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1567            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
1568    
1569    2003-04-17  Bernhard Herzog  <[email protected]>
1570    
1571            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
1572            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
1573            anymore.
1574            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
1575            (Layer.ShapeType, Layer.Shape): No need to call
1576            self.open_shapefile since it's always called in __init__
1577    
1578            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
1579            In wxPython 2.4 there's no need to extend MainLoop anymore since
1580            wxPython itself makes sure OnExit is called.
1581    
1582    2003-04-16  Jonathan Coles   <[email protected]>
1583    
1584            Initial putback of projection management code. Includes new
1585            classes to read and write projection files. The current load
1586            and save classes were abstracted a bit so they could be reused.
1587            The Projection class was extended to provide new methods and
1588            have a name.
1589    
1590            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
1591            general XML reading methods that were part of ProcessSession.
1592    
1593            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
1594            name.
1595            (ProjFile): New. Represents a file that contains projection
1596            information.
1597    
1598            * Thuban/Model/resource.py: New. Contains general utilities
1599            for read and writing projection files.
1600    
1601            * Thuban/Model/save.py (XMLSaver): New. Contains all the
1602            general XML writing methods that were part of SessionSaver.
1603            (SessionSaver): Renamed from Saver.
1604    
1605            * test/test_proj.py: New test cases for the projection
1606            file read and write functions.
1607    
1608    2003-04-16  Jonathan Coles   <[email protected]>
1609    
1610            * Thuban/Model/classification.py: Use repr() around values
1611            in the ClassGroup*.__repr__() methods so it is clearer when
1612            a value is a string and when it is a number.
1613    
1614            * test/test_load.py: Rework the classification test to test
1615            that we can load old files.
1616            (testLabels): Test a file where the groups have labels.
1617    
1618    2003-04-16  Bernhard Herzog  <[email protected]>
1619    
1620            Safer implementation of the performance enhancements of the
1621            low-level renderer:
1622            
1623            * extensions/thuban/wxproj.cpp (extract_projection)
1624            (extract_pointer): Rename extract_projection to extract_pointer
1625            and redefine its purpose to return the pointer stored in a CObject
1626            returned by the object's cobject method. Update all callers.
1627            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
1628            handling of these low-level parameters so that each s_draw_info
1629            instance is handled as a CObject at python level that also
1630            contains real references to the actual python objects which
1631            contain the values in the struct. Add free_draw_info as the
1632            destructor.
1633            (draw_polygon_shape): Add the py_draw_info parameter which must a
1634            cobject containing an s_draw_info pointer.
1635    
1636            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
1637            method to instantiat the low-level render parameter
1638            (MapRenderer.draw_shape_layer): Use the new method. Remove some
1639            commented out code.
1640            (MapRenderer.draw_polygon_shape): Make the first parameter not the
1641            layer but the low-level render parameter
1642            (ScreenRenderer.draw_shape_layer): Use the low-level render
1643            parameter.
1644    
1645    2003-04-15  Jonathan Coles   <[email protected]>
1646    
1647            * Thuban/Model/classification.py: Implemented __repr__ for
1648            the ClassGroup* classes to make debugging a bit easier.
1649            (ClassGroup.SetLabel): Check that the string is an instance
1650            of StringTypes not StringType. Accounts for Unicode strings.
1651    
1652            * Thuban/Model/color.py: Implemented __repr__ to make
1653            debugging a bit easier.
1654    
1655            * Thuban/Model/save.py (Saver.write_classification): Need to
1656            save the group label.
1657    
1658            * test/test_load.py (testClassification): New. Loads the
1659            iceland_sample_test.thuban file and checks if it was loaded
1660            correctly.
1661    
1662    2003-04-15  Jonathan Coles   <[email protected]>
1663    
1664            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
1665            to improve rendering performance by initializing the variables
1666            that are not change each time draw_polygon_shape() is called.
1667            The values are stored in a global struct draw_info.
1668            (draw_polygon_shape): Removed initialization code that is
1669            now in draw_polygon_init().
1670    
1671            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
1672            drawing initialization call to draw_polygon_init()
1673            (MapRenderer.draw_polygon_shape): Use new signature of
1674            draw_polygon_shape.
1675    
1676            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
1677            weirdness by setting the range to (1, maxint).
1678    
1679            * Thuban/Model/classification.py (ClassGroupProperties): Make
1680            instance variables private and optimize comparison operator
1681            by first checking if the color references are the same.
1682            (ClassGroupSingleton): Make instance variables private.
1683            (ClassGroupRange): Make instance variables private.
1684    
1685            * HOWTO-Release: Filled in missing steps for releasing packages.
1686    
1687    2003-04-15  Bernhard Herzog  <[email protected]>
1688    
1689            First stab at internationalized messages:
1690    
1691            * Thuban/__init__.py (_): Implement the translation function for
1692            real using the python gettext module.
1693    
1694            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
1695            translate empty strings.
1696    
1697            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1698            Add a missing space to a warning message
1699    
1700            * po/README: New. Notes about the management of the translation
1701            files.
1702    
1703            * po/Makefile: New. Makefile to help manage the translation files.
1704    
1705            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
1706    
1707            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
1708            translations and support files in po/
1709    
1710            * setup.py (data_files): Add the *.mo files to the data_files too
1711    
1712            * README: Add note about the translations when building from CVS
1713    
1714    2003-04-14  Jonathan Coles   <[email protected]>
1715    
1716            * Thuban/UI/dock.py: Fixes some window resizing problems most
1717            noticable under windows. Always assume the button bitmaps will
1718            be there. Code clean up.
1719            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
1720            images for the dock/undock button to the same images.
1721            Work around for RTbug #1801.
1722    
1723            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
1724            be allowed to grow within the sizer. Fixes a bug under Windows
1725            where the toolbar wasn't being drawn.
1726    
1727    2003-04-14  Frank Koormann   <[email protected]>
1728    
1729            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
1730            Updated design to try to make the button functionality more
1731            transparent.
1732    
1733    2003-04-14  Jonathan Coles   <[email protected]>
1734    
1735            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
1736            finalize the intialization of the panel.
1737    
1738            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
1739            creation of the panel. Should be the last thing called in the
1740            initializer of a subclass.
1741    
1742            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
1743            set the current selections in the combo boxes. This is needed
1744            under Windows.
1745    
1746            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
1747            level panel to the dialog so that the background colors are
1748            consistent under Windows.
1749    
1750    2003-04-11  Jonathan Coles   <[email protected]>
1751    
1752            * Thuban/UI/classgen.py: Change color ramps to start at white
1753            not black.
1754    
1755            * Thuban/UI/legend.py: Enable/disable the legend buttons when
1756            the legend changes. Fixes RTbug #1793.
1757    
1758            * test/test_classification.py: Added test for copying of
1759            classifications.
1760    
1761    2003-04-11  Jonathan Coles   <[email protected]>
1762    
1763            * Thuban/UI/resource.py: New. Centralize the loading of resources
1764            such as bitmaps.
1765    
1766            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
1767            added images to the move buttons, added 'reverse' button.
1768            (CustomRampPanel.__init__): Added images to the move buttons.
1769            (GreyRamp): New. Generates a ramp from white to black.
1770            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
1771    
1772            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
1773            ID_PROPERTY_*.
1774            (Classifier.__init__): Minor changes to the layout.
1775            (Classifier._OnTitleChanged): Listen for when the user edits the
1776            title and update the dialog's title and the layer's title.
1777    
1778            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
1779    
1780            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
1781            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
1782            if the layer's title changes.
1783    
1784            * Thuban/UI/mainwindow.py: Added new menu item and associated code
1785            to open a dialog to rename the map.
1786            (MainWindow): Use new resource class to import bitmaps.
1787    
1788    2003-04-11  Jonathan Coles   <[email protected]>
1789    
1790            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
1791            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
1792            Resources/Bitmaps/group_use_none.xpm,
1793            Resources/Bitmaps/group_use_not.xpm,
1794            Resources/Bitmaps/hide_layer.xpm,
1795            Resources/Bitmaps/layer_properties.xpm,
1796            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
1797            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
1798            New.
1799    
1800    2003-04-10  Jonathan Coles   <[email protected]>
1801    
1802            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
1803            Should pass group to ClassGroup constructor.
1804    
1805    2003-04-10  Jonathan Coles   <[email protected]>
1806    
1807            * Thuban/Model/classification.py: (ClassGroup): Move all the common
1808            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
1809            here. Implement SetVisible(), IsVisible().
1810            (ClassGroup.__init__): Add group parameter which acts as a copy
1811            constructor.
1812    
1813            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
1814            "Visible" check boxes.
1815            (Classifier): Rename the buttons and refactor the code to match
1816            the new labels.
1817    
1818            * Thuban/UI/legend.py: Classify button is now called "Properties".
1819            Refactored the code to change variable names.
1820            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
1821    
1822            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
1823            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
1824            renamed to MainWindow.LayerEditProperties.
1825            (MainWindow.ToggleLegend): Don't include map name in legend title.
1826            (MainWindow.SetMap): Added the map name to the window title.
1827            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
1828            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
1829            Functionality is found in the layer properties dialog.
1830    
1831            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1832            draw visible groups.
1833    
1834    2003-04-09  Jonathan Coles   <[email protected]>
1835    
1836            * Thuban/UI/classgen.py: Modifications to allow simple
1837            addition and selection of new color schemes.
1838            (MonochromaticRamp): New. Generates a ramp between two colors.
1839            (RedRamp): New. Generates a ramp of all red.
1840            (GreenRamp): New. Generates a ramp of all green.
1841            (BlueRamp): New. Generates a ramp of all blue.
1842    
1843    2003-04-09  Jonathan Coles   <[email protected]>
1844    
1845            * Thuban/Model/classification.py (Classification.__deepcopy__):
1846            Need to copy over field and fieldType attributes.
1847    
1848            * Thuban/Model/table.py (Table.field_range): New. Retrive the
1849            maximum and minimum values over the entire table for a given
1850            field.
1851            (Table.GetUniqueValues): New. Retrieve all the unique values
1852            in the table for a given field.
1853    
1854            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
1855            (GenUniquePanel): New. Controls to allow the user to select
1856            which unique field values they would like in the classification.
1857            (CustomRampPanel): Code that was in ClassGenDialog that allows
1858            the user to select the properties for a custom ramp.
1859            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
1860    
1861            * Thuban/UI/classifier.py: Removed a lot of debugging code.
1862            (Classifier._SetClassification): Callback method so that the
1863            class generator can set the classification in the grid.
1864            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
1865            editing of a group properties class into a wxWindows control.
1866    
1867            * Thuban/UI/dock.py: It was decided that if the user closes
1868            a dockable window the window should simply hide itself. That
1869            way if the user wants to show the dock again it appears in the
1870            same place as it was when it was closed.
1871            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
1872            (DockableWindow._OnButtonClose): Hide the window instead of
1873            destroying it.
1874            (DockableWindow._OnClose): Hide the window instead of
1875            destroying it.
1876    
1877            * Thuban/UI/legend.py (LegendTree): Use a private method to
1878            consistently set the font and style of the text. Fixes RTbug #1786.
1879    
1880            * Thuban/UI/mainwindow.py: Import just the Classifier class.
1881    
1882    2003-04-07  Bernhard Herzog  <[email protected]>
1883    
1884            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
1885            to the map module
1886    
1887    2003-04-07  Bernhard Herzog  <[email protected]>
1888    
1889            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
1890            favor of ToggleSessionTree
1891            (MainWindow.ToggleSessionTree): New method to toggle visibility of
1892            the session tree.
1893            (MainWindow.SessionTreeShown): New method to return whether the
1894            session tree is currently shown.
1895            (MainWindow.ToggleLegend): New method to toggle visibility of the
1896            legend
1897            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
1898            LegendShown
1899            (MainWindow.LegendShown): New method to return whether the legend
1900            is currently shown.
1901            (_method_command): Add checked parameter so we can define check
1902            menu items
1903            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
1904            mainwindow methods.
1905            (show_session_tree, show_legend commands): Removed.
1906            (toggle_session_tree, toggle_legend commands): New commands to
1907            toggle the visibility of the dialogs
1908    
1909    2003-04-07  Jonathan Coles   <[email protected]>
1910    
1911            * Thuban/UI/classgen.py: Fix Windows problem.
1912    
1913            * Thuban/UI/dock.py: Fix Windows problem.
1914    
1915            * Thuban/UI/mainwindow.py: Use False instead of false.
1916            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
1917    
1918    2003-04-07  Jonathan Coles   <[email protected]>
1919    
1920            Since we now say that the order of the groups in a classification
1921            matters, it makes sense to be able to manipulate that order. Most
1922            of the changes to Thuban/Model/classification.py are to that end.
1923    
1924            * Thuban/Model/classification.py (Classification.AppendGroup,
1925            Classification.InsertGroup, Classification.ReplaceGroup,
1926            Classification.RemoveGroup, Classification.GetGroup): Do as the
1927            names imply.
1928            (Classification.FindGroup): This was called GetGroup, but GetGroup
1929            takes an index, while FindGroup takes a value.
1930            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
1931            REFERENCE. Currently there is a cyclic reference between the layer
1932            and its classification. If the classification doesn't need to know
1933            its owning layer we can change this, since it may make sense to be
1934            able to use the same classification with different layers.
1935    
1936            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
1937    
1938            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
1939            not AddGroup()
1940    
1941            * Thuban/UI/classifier.py: Now that we can depend on the order in
1942            a Classification and have methods to manipulate that order we don't
1943            need to use our own data structures in the grid. We can simply make
1944            the grid/table access the information they need from a copy of
1945            the classification object.
1946            (Classifier._OnCloseBtn): Event handler for when the user clicks
1947            'Close'. This is needed so if the user applies changes and then
1948            continues to change the table the user has the option of discarding
1949            the most recent changes and keeping what they applied.
1950    
1951            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
1952            into the same group.
1953    
1954            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
1955            with a really old version of proj, PJ_VERSION won't even be defined.
1956            If it isn't defined then just compile so that the function always
1957            returns Py_False.
1958    
1959            * test/test_classification.py: Fix tests to use the renamed methods.
1960            Still need to write tests for the new methods.
1961    
1962    2003-04-04  Jonathan Coles   <[email protected]>
1963    
1964            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
1965            call to SetSelection out of the method and before the call
1966            to __SelectField in __init__. This prevents a recursion of events
1967            when _OnFieldSelect is triggered by the user.
1968    
1969    2003-04-04  Jonathan Coles   <[email protected]>
1970    
1971            * Thuban/Model/classification.py: Rename Color.None to
1972            Color.Transparent.
1973            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
1974            Don't bother copying the color, since Colors are immutable.
1975    
1976            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
1977            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
1978            Thuban/UI/renderer.py, Thuban/UI/view.py:
1979            Rename Color.None to Color.Transparent.
1980        
1981            * test/test_classification.py, test/test_load.py: Rename Color.None
1982            to Color.Transparent.
1983    
1984    2003-04-04  Jonathan Coles   <[email protected]>
1985    
1986            * Thuban/Model/classification.py: Fix assert calls.
1987            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
1988            Copy the color parameter rather than hold onto a reference.
1989    
1990            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
1991            the color object.
1992            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
1993            are sure there exists only one refernce to Color.None in the system.
1994            This allows us to use 'is' rather than the comparision functions.
1995            
1996            * Thuban/Model/save.py: Fix assert calls.
1997            
1998            * Thuban/UI/classifier.py: Fix assert calls.
1999            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2000            dialog to edit the groups properties.
2001            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2002            correctly if a cell is resized.
2003            (ClassTable.SetClassification): New. Changes the classification
2004            that is in the table.
2005            (ClassTable.__SetRow): Allow groups to be prepended.
2006            (Classifier): New code for opening the EditProperties and
2007            GenerateRanges dialogs.
2008            (SelectPropertiesDialog.__GetColor): Only set the color in the
2009            color dialog if the current color is not None.
2010            
2011            * Thuban/UI/dock.py: Fix assert calls.
2012            
2013            * Thuban/UI/legend.py: Fix assert calls.
2014            
2015            * Thuban/UI/renderer.py: Fix assert calls.
2016            
2017            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2018            classifications.
2019            (GenRangePanel): Panel specific to range generation.
2020            (GenSingletonPanel): Panel specific to singleton generation.
2021            (ClassGenerator): Class responsible for actually generating
2022            the classification from the data gathered in the dialog box.
2023            (PropertyRamp): Generates properties whose values range from
2024            a starting property to an ending property.
2025    
2026    2003-04-03  Bernhard Herzog  <[email protected]>
2027    
2028            * test/support.py (print_garbage_information): New function that
2029            prints information about still connected messages and memory
2030            leaks.
2031            (run_suite): Removed.
2032            (run_tests): New function for use as a replacement of
2033            unittest.main in the test_* files. This one calls
2034            print_garbage_information at the end.
2035    
2036            * test/runtests.py (main): Use support.print_garbage_information
2037    
2038            * test/test_layer.py: Use support.run_tests instead of
2039            unittest.main so we get memory leak information
2040            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2041            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2042            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2043            to fix a memory leak.
2044    
2045            * test/test_classification.py: Use support.run_tests instead of
2046            unittest.main so we get memory leak information
2047            (TestClassification.test_classification): Call the layer's Destroy
2048            method to fix a memory leak.
2049    
2050    2003-04-02  Bernhard Herzog  <[email protected]>
2051    
2052            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2053            Handle the reference counts of the return value and errors in
2054            PyArg_ParseTuple correctly.
2055    
2056            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2057            sure the filename is absolute to avoid problems when saving the
2058            session again
2059    
2060            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2061    
2062    2003-04-01  Jonathan Coles   <[email protected]>
2063    
2064            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2065            that there actually are points in the returned list of points
2066            before trying to index into the list. The list may be empty if
2067            the shape is a Null Shape.
2068    
2069    2003-04-01  Bernhard Herzog  <[email protected]>
2070    
2071            * test/test_map.py: Don't use from <module> import *
2072    
2073    2003-04-01  Jonathan Coles   <[email protected]>
2074    
2075            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2076            LAYER_LEGEND_CHANGED
2077    
2078            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2079            self.Destroy() to close the window after yesterday's changes.
2080    
2081            * test/test_map.py, test/test_session.py: Fix messages that
2082            are sent from maps and layers.
2083    
2084    2003-03-31  Jonathan Coles   <[email protected]>
2085    
2086            * Thuban/UI/classifier.py: Commented out some debugging statements.
2087            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2088            RTbug #1769.
2089    
2090            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2091            position (although position doesn't work yet under GTK).
2092            (DockableWindow.Destroy): New. Called when the window must be
2093            closed. Namely needed when the DockFrame closes and must close
2094            its children.
2095            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2096    
2097            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2098            when then window is told to close.
2099            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2100            comment in source for more info.
2101    
2102            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2103    
2104            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2105            symmetry with other such methods.
2106            (MainWindow.ShowLegend): Show the legend docked by default.
2107    
2108    2003-03-28  Jonathan Coles   <[email protected]>
2109    
2110            * Thuban/UI/classifier.py: Support for highlighting a specific
2111            group within the grid when the classification dialog is opened.
2112            Also contains a lot of debugging printouts which will later
2113            be removed.
2114    
2115            * Thuban/UI/dock.py: Complete rework on the dock code so that
2116            that it is fairly removed from the rest of the Thuban application.
2117            It is easy to add new docks which the rest of the program having
2118            to be aware of them.
2119    
2120            * Thuban/UI/legend.py: Modifications to support selecting a
2121            specific group in the classification dialog. Changed how layers
2122            are drawn when the layer is visible/invisible.
2123    
2124            * Thuban/UI/mainwindow.py: Removed legend specific code and
2125            replaced it with calls to the new dock code.
2126    
2127            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2128            to check if scale > 0. Trying to track down a divide by zero.
2129    
2130    2003-03-26  Jonathan Coles   <[email protected]>
2131    
2132            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2133            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2134            now part of DockableWindow.
2135            (LegendPanel.DoOnSelChanged): Select the current layer in the
2136            map.
2137            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2138            with the selected layer and/or group.
2139    
2140    2003-03-26  Jonathan Coles   <[email protected]>
2141    
2142            This putback contains the code for dockable windows. There is
2143            no support in wxWindows as of this date for windows that can
2144            attach themselves to other windows.
2145    
2146            The current model contains a DockableWindow which has a parent
2147            window for when it is detached and a dock window that it puts
2148            its contents in when it is docked. The contents of a DockableWindow
2149            must be a DockPanel. DockPanel itself derives from wxPanel.
2150    
2151            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2152            message, not a LAYER_LEGEND_CHANGED message.
2153    
2154            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2155    
2156            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2157            as one of the style properties for the fieldTypeText item to
2158            be sure that its size is correct when the text changes.
2159    
2160            * Thuban/UI/dock.py: New. Classes for the DockPanel and
2161            DockableWindow.
2162    
2163            * Thuban/UI/legend.py: Added some more buttons and made the
2164            LegendPanel a DockPanel.
2165    
2166            * Thuban/UI/mainwindow.py: Added sash windows to the main window
2167            and supporting functions for manipulating the sashes.
2168            (MainWindow.ShowLegend): Create a DockableWindow with the
2169            LegendPanel as the contents.
2170    
2171            * Thuban/UI/messages.py: Added DOCKABLE_* messages
2172    
2173            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2174            not LAYER_LEGEND_CHANGED, messages.
2175    
2176    2003-03-25  Jonathan Coles   <[email protected]>
2177    
2178            * setup.py: Added custom script bdist_rpm_build_script so that
2179            when the rpm is built the path to wx-config is correct.
2180    
2181            * setup.cfg: Added line saying to use the custom build script
2182    
2183    2003-03-20  Jonathan Coles   <[email protected]>
2184    
2185            Initial implementation of the Legend.
2186    
2187            * Thuban/UI/legend.py: New. Creates a window that shows the map's
2188            Legend information and allows the user to add/modify classifications
2189            and how the layers are drawn on the map.
2190    
2191            * setup.py: New command 'build_docs' which currently uses
2192            happydoc to generate html documentation for Thuban.
2193    
2194            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2195            Returns a string which is appropriately describes the group.
2196    
2197            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2198            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2199    
2200            * Thuban/Model/map.py (Map): Rename messages and use new, more
2201            specific, messages.
2202    
2203            * Thuban/Model/messages.py: New message to indicate that a layer's
2204            data has changed (LAYER_CHANGED). New map messages to indicate
2205            when layers have been added/removed/changed or if the stacking order
2206            of the layers has changed.
2207    
2208            * Thuban/Model/session.py: Rename and use new messages.
2209    
2210            * Thuban/UI/classifier.py: Remember if any changes have actually
2211            been applied so that if the dialog is cancelled without an application
2212            of changes we don't have to set a new classification.
2213            (ClassDataPreviewer): Pulled out the window specific code and put it
2214            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2215            symbols on any DC.
2216            
2217            * Thuban/UI/mainwindow.py: New code to open the legend.
2218    
2219            * Thuban/UI/view.py: Use new message names.
2220    
2221    2003-03-19  Jonathan Coles   <[email protected]>
2222    
2223            * Thuban/UI/main.py (verify_versions): New. Checks the versions
2224            of Python, wxPython, and some other libraries.
2225    
2226            * extensions/thuban/wxproj.cpp (check_version): Checks the given
2227            version against what wxproj was compiled with.
2228            (check_version_gtk): If wxproj was compiled with gtk then check
2229            the given version against the version of the gtk library
2230            currently being used.
2231    
2232    2003-03-14  Bernhard Herzog  <[email protected]>
2233    
2234            * test/test_command.py: Run the tests when the module is run as a
2235            script
2236    
2237    2003-03-14  Bernhard Herzog  <[email protected]>
2238    
2239            Implement selection of multiple selected shapes in the same layer:
2240    
2241            - Introduce a new class to hold the selection. This basically
2242              replaces the interactor which was nothing more than the
2243              selection anyway. A major difference is of course that the new
2244              selection class supports multiple selected shapes in one layer
2245            
2246            - Move the object that represents the selection from the
2247              application to the canvas. The canvas is a better place than the
2248              application because the selection represents which shapes and
2249              layer of the map displayed by the canvas are selected and
2250              affects how the map is drawn.
2251    
2252            - Make the selection and its messages publicly available through
2253              the mainwindow.
2254    
2255            - The non-modal dialogs do not get a reference to the interactor
2256              anymore as they can simply refer to their parent, the
2257              mainwindow, for the what the interactor had to offer.
2258    
2259            * Thuban/UI/selection.py: New module with a class to represent the
2260            selection.
2261    
2262            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2263            these unused messages
2264    
2265            * Thuban/UI/application.py (ThubanApplication.OnInit)
2266            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
2267            interactor is gone now.
2268            (ThubanApplication.CreateMainWindow): There is no interactor
2269            anymore so we pass None as the interactor argument for now for
2270            compatibility.
2271    
2272            * Thuban/UI/view.py (MapCanvas.delegated_messages)
2273            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
2274            Unsubscribe, delegate messages according to the delegated_messages
2275            class variable.
2276            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
2277            attributes from instance variables as described with the
2278            delegated_methods class variable.
2279            (MapCanvas.__init__): New instance variable selection holding the
2280            current selection
2281            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
2282            pass them on to the renderer
2283            (MapCanvas.SetMap): Clear the selection when a different map is
2284            selected.
2285            (MapCanvas.shape_selected): Simple force a complete redraw. The
2286            selection class now takes care of only issueing SHAPES_SELECTED
2287            messages when the set of selected shapes actually does change.
2288            (MapCanvas.SelectShapeAt): The selection is now managed in
2289            self.selection
2290    
2291            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
2292            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
2293            Unsubscribe, delegate messages according to the delegated_messages
2294            class variable.
2295            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
2296            attributes from instance variables as described with the
2297            delegated_methods class variable.
2298            (MainWindow.__init__): The interactor as ivar is gone. The
2299            parameter is still there for compatibility. The selection messages
2300            now come from the canvas.
2301            (MainWindow.current_layer, MainWindow.has_selected_layer):
2302            Delegate to the the canvas.
2303            (MainWindow.LayerShowTable, MainWindow.Classify)
2304            (MainWindow.identify_view_on_demand): The dialogs don't need the
2305            interactor parameter anymore.
2306    
2307            * Thuban/UI/tableview.py (TableFrame.__init__)
2308            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
2309            (LayerTableFrame.row_selected): The interactor is gone. It's job
2310            from the dialog's point of view is now done by the mainwindow,
2311            i.e. the parent. Subscribe to SHAPES_SELECTED instead
2312            of SELECTED_SHAPE
2313            
2314            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
2315            is gone. It's job from the dialog's point of view is now done by
2316            the mainwindow, i.e. the parent.
2317            
2318            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
2319            gone. It's job from the dialog's point of view is now done by the
2320            mainwindow, i.e. the parent.
2321    
2322            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
2323            gone. It's job from the dialog's point of view is now done by the
2324            mainwindow, i.e. the parent.
2325            (SessionTreeCtrl.__init__): New parameter mainwindow which is
2326            stored as self.mainwindow. The mainwindow is need so that the tree
2327            can still subscribe to the selection messages.
2328            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
2329            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
2330            selection is now accessible through the mainwindow. Subscribe to
2331            SHAPES_SELECTED instead of SELECTED_SHAPE
2332    
2333            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
2334            SHAPES_SELECTED message now.
2335            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
2336            so deal with multiple shapes
2337            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
2338            gone. It's job from the dialog's point of view is now done by the
2339            mainwindow, i.e. the parent.
2340    
2341            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
2342            parameter is now a list of shape ids.
2343            (RecordTable.SetTable): The second parameter is now a list of
2344            indices.
2345    
2346            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
2347            selected_shape parameter and ivar to selected_shapes. It's now a
2348            list of shape ids.
2349            (MapRenderer.draw_label_layer): Deal with multiple selected
2350            shapes. Rearrange the code a bit so that the setup and shape type
2351            distinctions are only executed once.
2352    
2353            * test/test_selection.py: Test cases for the selection class
2354    
2355    2003-03-11  Jonathan Coles   <[email protected]>
2356    
2357            * Thuban/Model/load.py: Temporary fix so that the xml reader
2358            doesn't cause Thuban to crash.
2359    
2360            * Thuban/Model/layer.py: Handle the cyclic references between
2361            a layer and its classification better, and be sure to disconnect
2362            the classification from the layer when the layer is destroyed
2363            so that we don't maintain a cyclic reference that may not be
2364            garbage collected.
2365    
2366            * Thuban/Model/classification.py: See comment for layer.py.
2367    
2368  2003-03-12  Jan-Oliver Wagner <[email protected]>  2003-03-12  Jan-Oliver Wagner <[email protected]>
2369    
2370          * HOWTO-Release: New. Information on the steps for releasing          * HOWTO-Release: New. Information on the steps for releasing

Legend:
Removed from v.523  
changed lines
  Added in v.1040

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26