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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26