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

Legend:
Removed from v.634  
changed lines
  Added in v.1038

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26