/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Diff of /branches/greater-ms3/thuban/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26