/[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 399 by jonathan, Tue Feb 11 14:24:14 2003 UTC revision 833 by jonathan, Tue May 6 12:07:44 2003 UTC
# Line 1  Line 1 
1    2003-05-06  Jonathan Coles   <[email protected]>
2    
3            Addresses the "Selection Extent" wish of RTbug #1787.
4    
5            * Resources/Bitmaps/fulllayerextent.xpm,
6            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7            extent. These are just place holders for the real bitmaps.
8    
9            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
10            calculate the bounding box once (the first time compute_bbox() is
11            called).
12            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
13            the bounding box for the shapes in lat/long coordinates.
14    
15            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
16            option.
17            (MainWindow.has_selected_shapes): New. Returns true if there are
18            any selected shapes.
19            (MainWindow.FullSelectionExtent): New. Calls
20            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
21            (_has_selected_shapes): New. Returns true if there are any
22            selected shapes.
23    
24            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
25            true if there are any selected shapes.
26    
27            * Thuban/UI/view.py (MapCanvas): Added delegated method
28            HasSelectedShapes.
29            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
30            shapes on the canvas using the map projection (if any).
31    
32            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
33            for Layer.ShapesBoundingBox().
34    
35    2003-05-06  Bernhard Herzog  <[email protected]>
36    
37            * Resources/Projections/defaults.proj: Fix spelling of Mercator
38    
39    2003-05-05  Jonathan Coles   <[email protected]>
40    
41            Addresses the "Full Layer Extent" wish of RTbug #1787.
42    
43            * Resources/Projections/defaults.proj: Added UK National Grid.
44    
45            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
46            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
47            when the user selects the menu option.
48    
49            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
50            scales the given layer on the canvas using the map projection.
51    
52    2003-05-05  Bernhard Herzog  <[email protected]>
53    
54            Convert the table implementations to a new table interface. All
55            tables use a common mixin class to provide backwards compatibility
56            until all table users have been updated.
57    
58            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
59            provide backwards compatibility for table classes implementing the
60            new interface
61            (DBFTable, MemoryTable): Implement the new table interface. Use
62            OldTableInterfaceMixin as base for compatibility
63            (DBFColumn, MemoryColumn): New. Column description for DBFTable
64            and MemoryTable resp.
65    
66            * test/test_dbf_table.py: New. Test cases for the DBFTable with
67            the new table interface.
68    
69            * test/test_memory_table.py: New. Test cases for the MemoryTable
70            with the new table interface.
71    
72            * test/test_table.py: Document the all tests in this file as only
73            for backwards compatibility. The equivalent tests for the new
74            interface are in test_memory_table.py and test_dbf_table.py
75            (MemoryTableTest.test_read): field_info should be returning tuples
76            with four items
77            (MemoryTableTest.test_write): Make doc-string a more precise.
78    
79            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
80            table interface. Derive from from OldTableInterfaceMixin for
81            compatibility.
82            (TransientTableBase.create): New intance variable column_map to
83            map from names and indices to column objects
84            (TransientTable.create): Use the new table interface of the input
85            table
86            (AutoTransientTable): Convert to new table interface. Derive from
87            from OldTableInterfaceMixin for compatibility.
88            (AutoTransientTable.write_record): Removed. It's not implemented
89            yet and we still have to decide how to handle writing with the new
90            table and data framework.
91    
92            * test/test_transientdb.py
93            (TestTransientTable.run_iceland_political_tests)
94            (TestTransientTable.test_transient_joined_table): Use the new
95            table interface
96    
97    2003-05-05  Jonathan Coles   <[email protected]>
98    
99            This is namely a collection of UI updates to improve user interactivity.
100            Tabbing between controls now exists and you can use ESC to close dialog
101            boxes; ENTER will active the default button.
102    
103            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
104            order that the controls are created so that tabbing works correctly.
105            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
106            wxDialog can handle the default button correctly.
107            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
108            same reasons as for OnOK.
109            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
110            when we ask the table for the maximum/minimum values of a field
111            which could take a very long time.
112    
113            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
114            order that the controls are created so that tabbing works correctly.
115            (SelectPropertiesDialog.__init__): Rearrange the order that the
116            controls are created so that tabbing works correctly.
117    
118            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
119            to derive from a wxDialog but behave like the original implementation
120            which was derived from a wxFrame. wxDialog provides useful key
121            handling functionality like ESC calling OnCancel and ENTER calling
122            OnOK which is lost with wxFrame.
123    
124            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
125            new dialogs.
126    
127            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
128            order that the controls are created so that tabbing works correctly.
129            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
130            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
131            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
132            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
133            can provide the "UK National Grid" as a default projection.
134            (UTMPanel.__init__): Rearrange the order that the controls are
135            created so that tabbing works correctly.
136    
137    2003-05-05  Bernhard Herzog  <[email protected]>
138    
139            * extensions/thuban/wxproj.cpp: Fix some of the comments.
140            (project_point): If a map projection but no layer projection is
141            given, convert degrees to radians before applying the map
142            projection.
143    
144            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
145            (TableGrid.allow_messages): New methods to make it possible to
146            inhibit message sending.
147            (TableGrid.issue): Only send the message if not inhibited.
148            (LayerTableGrid.select_shape): Use the new methods to make sure
149            that no ROW_SELECTED message is sent while we're updating the
150            selected rows to match the selected shapes.
151    
152    2003-05-02  Jan-Oliver Wagner <[email protected]>
153    
154            Implementation of MemoryTable.
155    
156            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
157            implementation that operates on a list of tuples. All of the data
158            are kept in the memory.
159    
160            * test/test_table.py (MemoryTableTest): New.
161    
162            * test/test_transientdb.py (SimpleTable): Removed.
163            (TestTransientTable.test_transient_joined_table,
164            (TestTransientTable.test_transient_table_read_twice): Replaced
165            SimpleTable by MemoryTable.
166    
167    2003-04-30  Jonathan Coles   <[email protected]>
168    
169            * Data/iceland_sample.thuban: Now contains correct projections
170            for each of the layers.
171    
172            * Resources/Projections/defaults.proj: Geographic projection
173            contains unit conversion parameter.
174    
175    2003-04-30  Jonathan Coles   <[email protected]>
176    
177            The most important part of this putback is the projection changes.
178            It should now be possible to specify the projection that a layer
179            is in and then specify a different projection for the map. The
180            projection dialog has an extra parameter for a geographic projection
181            which lets the user select if the input is in degrees or radians.
182    
183            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
184            to say that the parameter is a tuple of unprojected
185            points (which is what the callers to this method were assuming).
186            Also, since the points are unprojected we need to projected them.
187    
188            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
189            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
190            groups are selected, move the layer up/down. Fixes RTbug #1833.
191    
192            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
193    
194            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
195            parameter in call to SetClientData.
196            (GeoPanel): Add support for selecting the units that the
197            source data is in (Radians or Degrees).
198    
199            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
200            the rendering loop by reducing the number of if's, removing the
201            unnecessary try/except block, and checking if the old group
202            is the same as the new one (which happens a lot if there is
203            no classification, or lots of shapes are in the same group).
204    
205            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
206            around the redraw routine to try to catch problems that the user
207            may create by selecting invalid projections for the data set and
208            map. Clears the display if there are any problems and prints the
209            error.
210            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
211            rectangle.
212    
213            * extensions/thuban/wxproj.cpp (project_point): First invert the
214            supplied point (which should be in projected coordinates) using
215            the layer's projection and then project the point using the
216            map's projection.
217            (project_points): Use project_point() to project each point.
218    
219    2003-04-30  Jan-Oliver Wagner <[email protected]>
220    
221            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
222            don't set the Classification to None if the classfication field
223            is None (ie only a DEFAULT).
224    
225    2003-04-30  Bernhard Herzog  <[email protected]>
226    
227            * Thuban/UI/view.py: Fix some typos.
228    
229            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
230            not pop up the dialog if the selection becomes empty (this could
231            happen if e.g. a new selection is opened while the identify tool
232            is active and dialog had been closed)
233    
234    2003-04-30  Bernhard Herzog  <[email protected]>
235    
236            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
237            instance variable read_record_last_result
238            (TransientTableBase.read_record): Make sure reading the same
239            record twice works. The implementation uses the new instance
240            variable read_record_last_result
241    
242            * test/test_transientdb.py
243            (TestTransientTable.test_transient_table_read_twice): New test
244            case for the above bug-fix.
245    
246    2003-04-29  Jonathan Coles   <[email protected]>
247    
248            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
249    
250            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
251    
252            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
253            (ClassTable.SetValueAsCustom): Rename keyword argument in
254            ClassGroup* constructors to match argument name.
255    
256    2003-04-29  Bernhard Herzog  <[email protected]>
257    
258            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
259            transient DB if it exists to make sure it doesn't leave a journal
260            file in the temp directory.
261    
262            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
263            self.conn to None after closing the connection to make sure it's
264            not closed twice
265    
266    2003-04-29  Jonathan Coles   <[email protected]>
267    
268            Add a visible parameter in the layer XML tag. The default value is
269            "true". If anything other than "false" is specified we also assume
270            "true". Addresses RTbug #1025.
271    
272            * Doc/thuban.dtd: Add visible parameter to a layer.
273    
274            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
275            of visible from 1 to True.
276            (Layer.__init__): Change default value of visible from 1 to True.
277    
278            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
279            parameter.
280    
281            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
282            parameter.
283    
284            * test/test_load.py: Add new test data contents_test_visible.
285            (LoadSessionTest.setUp): save test data.
286            (LoadSessionTest.testLayerVisibility): Test if the visible flag
287            is loaded correctly.
288    
289            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
290            for saving an invisible layer.
291    
292    2003-04-29  Jonathan Coles   <[email protected]>
293    
294            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
295            legend dialog box and tell it to change its map to the one
296            supplied to SetMap(). Fixes RTbug #1770.
297    
298    2003-04-29  Bernhard Herzog  <[email protected]>
299    
300            Next step of table implementation. Introduce a transient database
301            using SQLite that some of the data is copied to on demand. This
302            allows us to do joins and other operations that require an index
303            for good performance with reasonable efficiency. Thuban now needs
304            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
305            haven't tested that.
306            
307            * Thuban/Model/transientdb.py: New. Transient database
308            implementation.
309    
310            * test/test_transientdb.py: New. Tests for the transient DB
311            classes.
312    
313            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
314            classes to help automatically remove temporary files and
315            directories.
316            (Session.__init__): New instance variables temp_dir for the
317            temporary directory and transient_db for the SQLite database
318            (Session.temp_directory): New. Create a temporary directory if not
319            yet done and return its name. Use AutoRemoveDir to have it
320            automatically deleted
321            (Session.TransientDB): Instantiate the transient database if not
322            done yet and return it.
323    
324            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
325            AutoTransientTable so that data is copied to the transient DB on
326            demand.
327            (SimpleStore): New class that simply combines a table and a
328            shapefile
329    
330            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
331            DBFTable and update its doc-string to reflect the fact that this
332            is only the table interface to a DBF file. Table is now an alias
333            for DBFTable for temporary backwards compatibility.
334    
335            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
336            the last reference to the session goes away so that the temporary
337            files are removed properly.
338    
339            * test/test_load.py (LoadSessionTest.tearDown): Remove the
340            reference to the session to make sure the temporary files are
341            removed.
342    
343    2003-04-29  Bernhard Herzog  <[email protected]>
344    
345            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
346            the __parser instance variable into a normal local variable in
347            read. It's only used there and read will never be called more than
348            once. Plus it introduces a reference cycle that keeps can keep the
349            session object alive for a long time.
350    
351    2003-04-29  Jonathan Coles   <[email protected]>
352    
353            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
354            Projection an immutable item. Fixes RTbug #1825.
355            (Projection.__init__): Initialize instance variables here.
356            (ProjFile.Replace): New. Replace the given projection object with
357            the new projection object. This solves the problem of needing the
358            mutator Projection.SetProjection() in the ProjFrame class and
359            allows a projection to change parameters without changing its
360            location in the file.
361    
362            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
363            be of type wxSAVE and should verify overwriting a file.
364    
365            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
366            ProjFile.Replace() method instead of the mutator
367            Projection.SetProjection(). Also requires that we reassign the
368            client data to the new projection.
369    
370            * test/test_proj.py (TestProjection.test): Test GetName() and
371            GetAllParameters()
372            (TestProjFile.test): Remove tests for Set*() methods. Add tests
373            for Replace().
374    
375    2003-04-25  Jonathan Coles   <[email protected]>
376    
377            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
378            to save the name of the projection.
379    
380            * test/test_save.py (SaveSessionTest.testLayerProjection): New
381            test to verify layer projections are saved correctly.
382    
383    2003-04-25  Jonathan Coles   <[email protected]>
384    
385            * Thuban/Model/proj.py (Projection.SetName): Set the name
386            to "Unknown" if name is None.
387            (Projection.SetAllParameters): New. Set the projection's
388            parameter list to the one supplied.
389            (Projection.SetProjection): New. Set the projection's
390            properties to those of the supplied Projection.
391    
392            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
393            the dialog title to include the map's title.
394            (MainWindow.LayerProjection): Set the dialog title to include
395            the layer's title.
396    
397            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
398            error dialogs into a single method call.
399            (ProjFrame.__VerifyButtons): Add more states to check.
400            (ProjFrame.__GetProjection): Return the current state of an
401            edited projection or None.
402            (ProjFrame.__FillAvailList): Remove checks for states that
403            shouldn't exist.
404            (ProjFrame._OnNew): Clear all selected items and supply
405            a projection panel if necessary.
406    
407            * test/test_proj.py (TestProjFile.test): Add tests for
408            ProjFile.SetAllParameters, ProjFile.SetProjection,
409            ProjFile.SetName.
410    
411    2003-04-25  Jonathan Coles   <[email protected]>
412    
413            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
414            takes an optional argument to select the current projection.
415            This does not guarantee that the item is visible due to
416            limited wxWindows functionality. Fixes RTBug #1821.
417    
418    2003-04-25  Jonathan Coles   <[email protected]>
419    
420            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
421            the projection name and use it when constructing the Projection
422            object.
423    
424            * Thuban/Model/proj.py (Projection.__init__): Change the default
425            value for 'name' to None and then test if name is equal to None
426            in the body of the constructor. This way the caller doesn't have to
427            know what the default value should be. Namely, useful in load.py
428            where we have to pick a default value if the 'name' parameter
429            doesn't exist in the XML file.
430    
431            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
432            Tests a file where a layer has a projection.
433    
434    2003-04-25  Jonathan Coles   <[email protected]>
435    
436            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
437            tree for projection information.
438    
439            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
440            XMLReader.GetFileName.
441            (SessionLoader): Added support for loading projection tags that
442            appear inside a layer.
443    
444            * Thuban/Model/proj.py (ProjFile): Document the class. Move
445            back to using a list because the order of the projections in
446            the file is important to maintain. Fixes RTbug #1817.
447    
448            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
449            to ProjFile.GetFilename.
450    
451            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
452            information.
453    
454            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
455            ProjFrame._OnSaveAs. Removed old dead code from previous
456            implementation.
457            (ProjFrame._OnExport): Add support for exporting more than one
458            projection to a single file.
459            (ProjFrame.__FillAvailList): use string formatting (% operator)
460            to build strings that are (partly) translated. Fixes RTbug #1818.
461    
462            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
463            class.
464    
465    2003-04-24  Bernhard Herzog  <[email protected]>
466    
467            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
468    
469            * po/fr.po: New. French translation by Daniel Calvelo Aros
470    
471            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
472            empty strings.
473    
474    2003-04-24  Jonathan Coles   <[email protected]>
475    
476            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
477            implement the interface that the ProjFrame dialog expects.
478    
479            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
480            name of the projection to be changed.
481            (ProjFile): Use a dictionary instead of a list so that removing
482            projections is easier and we are sure about uniqueness.
483            (ProjFile.Remove): Remove the given projection object.
484    
485            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
486            Return a list with only one projection file instead of searching for
487            any projection file. This simplifies many things if the user can
488            only have one system file and one user file.
489    
490            * Thuban/UI/classgen.py: Change all references to
491            genCombo to genChoice.
492    
493            * Thuban/UI/mainwindow.py: Add a Projection option under the
494            layer menu.
495            (MainWindow.LayerProjection): New. Open up a projection window
496            for a layer.
497    
498            * Thuban/UI/projdialog.py: Large changes to how the dialog is
499            laid out. Use three panels instead of one. One for the list of
500            projections, one for the edit controls, and one for the buttons.
501            Fixed resizing problems so that the dialog resizes correctly
502            when the projection panel changes. Added import/export, save, and
503            new buttons/functionality.
504    
505    2003-04-24  Bernhard Herzog  <[email protected]>
506    
507            First step towards table management. Introduce a simple data
508            abstraction so that we replace the data a layer uses more easily
509            in the next step.
510    
511            * Thuban/Model/data.py: New file with a simple data abstraction
512            that bundles shapefile and dbffile into one object.
513    
514            * Thuban/Model/session.py (Session.OpenShapefile): New method to
515            open shapefiles and return a shape store object
516    
517            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
518            object instead of a shapefile filename. This introduces a new
519            instance variable store holding the datastore. For intermediate
520            backwards compatibility keep the old instance variables.
521            (open_shapefile): Removed. No longer needed with the shape store.
522            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
523            get the shape store used by a layer.
524            (Layer.Destroy): No need to explicitly destroy the shapefile or
525            table anymore.
526    
527            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
528            (MainWindow.AddLayer): Use the session's OpenShapefile method to
529            open shapefiles
530    
531            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
532            session's OpenShapefile method to open shapefiles
533    
534            * test/test_classification.py
535            (TestClassification.test_classification): Use the session's
536            OpenShapefile method to open shapefiles and build the filename in
537            a more platform independed way
538    
539            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
540            Implement to have a session to use in the tests
541            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
542            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
543            session's OpenShapefile method to open shapefiles
544            (TestLayerLegend.setUp): Instantiate a session so that we can use
545            it to open shapefiles.
546            (TestLayerLegend.tearDown): Make sure that all references to
547            layers and session are removed otherwise we may get a resource
548            leak
549    
550            * test/test_map.py (TestMapAddLayer.test_add_layer)
551            (TestMapWithContents.setUp): Instantiate a session so that we can
552            use it to open shapefiles.
553            (TestMapWithContents.tearDown): Make sure that all references to
554            layers, maps and sessions are removed otherwise we may get a
555            resource leak
556            ("__main__"): use support.run_tests() so that more info about
557            uncollected garbage is printed
558    
559            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
560            session's OpenShapefile method to open shapefiles
561            ("__main__"): use support.run_tests() so that more info about
562            uncollected garbage is printed
563    
564            * test/test_selection.py (TestSelection.tearDown): Make sure that
565            all references to the session and the selection are removed
566            otherwise we may get a resource leak
567            (TestSelection.get_layer): Instantiate a session so that we can
568            use it to open shapefiles.
569            ("__main__"): use support.run_tests() so that more info about
570            uncollected garbage is printed
571    
572            * test/test_session.py (TestSessionBase.tearDown)
573            (TestSessionWithContent.tearDown): Make sure that all references
574            to the session and layers are removed otherwise we may get a
575            resource leak
576            (TestSessionWithContent.setUp): Use the session's OpenShapefile
577            method to open shapefiles
578    
579    2003-04-24  Jonathan Coles   <[email protected]>
580    
581            * Thuban/Model/load.py (XMLReader.read): Should have been checking
582            if the file_or_filename object had the 'read' attribute.
583    
584    2003-04-23  Jonathan Coles   <[email protected]>
585    
586            * Thuban/Model/resource.py: Fixes RTbug #1813.
587            (ReadProjFile): Add documentation about which exceptions are raised.
588            Always pass the exceptions up to the caller.
589            (GetProjFiles): If the directory can't be read return an empty list.
590            If any of the proj files can't be read skip that file and go
591            on to the next one.
592    
593            * test/test_proj.py: Added test cases to handle nonexistent files,
594            unreadable files, and files that don't parse correctly.
595    
596    2003-04-23  Jonathan Coles   <[email protected]>
597    
598            Projection dialog. Allows the user to select from a list
599            of projection templates and optionally edit them and save new ones.
600    
601            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
602            (ProjPanel): Base class for projection specific panels.
603            (TMPanel): Projection panel for Transverse Mercartor.
604            (UTMPanel): Projection panel for Universal Transverse Mercartor.
605            (LCCPanel): Projection panel for Lambert Conic Conformal.
606            (GeoPanel): Projetion panel for Geographic Projection.
607    
608    2003-04-23  Jonathan Coles   <[email protected]>
609    
610            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
611            promote symmetry. There now exists XMLReader and XMLWriter.
612            (XMLReader.read): New. Call to read the given file descriptor or
613            filename.
614            (XMLReader.close): New. Make sure the file is closed.
615            (XMLReader.GetFileName): New. Return just the file name that is being
616            read from.
617            (XMLReader.GetDirectory): New. Return just the directory of the file
618            that is being read.
619            (XMLReader.AddDispatchers): New. Take a dictionary which contains
620            the names of functions to call as the XML tree is parsed.
621            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
622            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
623            (SessionLoader): Removed class variables start_dispatcher and
624            end_dispatcher since this functionality is now part of a class
625            instance. Fixes RTbug #1808.
626            (SessionLoader.__init__): Add dispatcher functions.
627            (load_xmlfile): Code was moved into the XMLReader.read().
628            (load_session): Use modified SessionLoader.
629    
630            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
631            map's projection.
632    
633            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
634            GetAllParameters.
635            (Projection.GetParameter): Returns the value for the given parameter.
636    
637            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
638            (GetProjFiles): Renamed from GetProjections. Now returns a list
639            of ProjFile objects.
640            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
641            a list of ProjFile objects whose files are not user defined.
642            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
643            list of ProjFile objects whose files are user defined.
644            (ProjFileReader): Extend new XMLReader.
645    
646            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
647            promote symmetry.
648    
649            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
650            control instead of a wxComboBox. wxChoice controls do not generate
651            events as the uses highlights possible choices which fixes problems
652            with resizing the dialog when the use selects an option.
653    
654            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
655            control instead of a wxComboBox.
656    
657            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
658            dialog.
659    
660            * test/test_proj.py (TestProjection.test): New tests for GetParameter
661            method.
662    
663    2003-04-22  Bernhard Herzog  <[email protected]>
664    
665            * Thuban/UI/mainwindow.py: Remove some unused imports and global
666            constants
667    
668            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
669            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
670    
671    2003-04-17  Bernhard Herzog  <[email protected]>
672    
673            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
674            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
675            anymore.
676            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
677            (Layer.ShapeType, Layer.Shape): No need to call
678            self.open_shapefile since it's always called in __init__
679    
680            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
681            In wxPython 2.4 there's no need to extend MainLoop anymore since
682            wxPython itself makes sure OnExit is called.
683    
684    2003-04-16  Jonathan Coles   <[email protected]>
685    
686            Initial putback of projection management code. Includes new
687            classes to read and write projection files. The current load
688            and save classes were abstracted a bit so they could be reused.
689            The Projection class was extended to provide new methods and
690            have a name.
691    
692            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
693            general XML reading methods that were part of ProcessSession.
694    
695            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
696            name.
697            (ProjFile): New. Represents a file that contains projection
698            information.
699    
700            * Thuban/Model/resource.py: New. Contains general utilities
701            for read and writing projection files.
702    
703            * Thuban/Model/save.py (XMLSaver): New. Contains all the
704            general XML writing methods that were part of SessionSaver.
705            (SessionSaver): Renamed from Saver.
706    
707            * test/test_proj.py: New test cases for the projection
708            file read and write functions.
709    
710    2003-04-16  Jonathan Coles   <[email protected]>
711    
712            * Thuban/Model/classification.py: Use repr() around values
713            in the ClassGroup*.__repr__() methods so it is clearer when
714            a value is a string and when it is a number.
715    
716            * test/test_load.py: Rework the classification test to test
717            that we can load old files.
718            (testLabels): Test a file where the groups have labels.
719    
720    2003-04-16  Bernhard Herzog  <[email protected]>
721    
722            Safer implementation of the performance enhancements of the
723            low-level renderer:
724            
725            * extensions/thuban/wxproj.cpp (extract_projection)
726            (extract_pointer): Rename extract_projection to extract_pointer
727            and redefine its purpose to return the pointer stored in a CObject
728            returned by the object's cobject method. Update all callers.
729            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
730            handling of these low-level parameters so that each s_draw_info
731            instance is handled as a CObject at python level that also
732            contains real references to the actual python objects which
733            contain the values in the struct. Add free_draw_info as the
734            destructor.
735            (draw_polygon_shape): Add the py_draw_info parameter which must a
736            cobject containing an s_draw_info pointer.
737    
738            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
739            method to instantiat the low-level render parameter
740            (MapRenderer.draw_shape_layer): Use the new method. Remove some
741            commented out code.
742            (MapRenderer.draw_polygon_shape): Make the first parameter not the
743            layer but the low-level render parameter
744            (ScreenRenderer.draw_shape_layer): Use the low-level render
745            parameter.
746    
747    2003-04-15  Jonathan Coles   <[email protected]>
748    
749            * Thuban/Model/classification.py: Implemented __repr__ for
750            the ClassGroup* classes to make debugging a bit easier.
751            (ClassGroup.SetLabel): Check that the string is an instance
752            of StringTypes not StringType. Accounts for Unicode strings.
753    
754            * Thuban/Model/color.py: Implemented __repr__ to make
755            debugging a bit easier.
756    
757            * Thuban/Model/save.py (Saver.write_classification): Need to
758            save the group label.
759    
760            * test/test_load.py (testClassification): New. Loads the
761            iceland_sample_test.thuban file and checks if it was loaded
762            correctly.
763    
764    2003-04-15  Jonathan Coles   <[email protected]>
765    
766            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
767            to improve rendering performance by initializing the variables
768            that are not change each time draw_polygon_shape() is called.
769            The values are stored in a global struct draw_info.
770            (draw_polygon_shape): Removed initialization code that is
771            now in draw_polygon_init().
772    
773            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
774            drawing initialization call to draw_polygon_init()
775            (MapRenderer.draw_polygon_shape): Use new signature of
776            draw_polygon_shape.
777    
778            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
779            weirdness by setting the range to (1, maxint).
780    
781            * Thuban/Model/classification.py (ClassGroupProperties): Make
782            instance variables private and optimize comparison operator
783            by first checking if the color references are the same.
784            (ClassGroupSingleton): Make instance variables private.
785            (ClassGroupRange): Make instance variables private.
786    
787            * HOWTO-Release: Filled in missing steps for releasing packages.
788    
789    2003-04-15  Bernhard Herzog  <[email protected]>
790    
791            First stab at internationalized messages:
792    
793            * Thuban/__init__.py (_): Implement the translation function for
794            real using the python gettext module.
795    
796            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
797            translate empty strings.
798    
799            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
800            Add a missing space to a warning message
801    
802            * po/README: New. Notes about the management of the translation
803            files.
804    
805            * po/Makefile: New. Makefile to help manage the translation files.
806    
807            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
808    
809            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
810            translations and support files in po/
811    
812            * setup.py (data_files): Add the *.mo files to the data_files too
813    
814            * README: Add note about the translations when building from CVS
815    
816    2003-04-14  Jonathan Coles   <[email protected]>
817    
818            * Thuban/UI/dock.py: Fixes some window resizing problems most
819            noticable under windows. Always assume the button bitmaps will
820            be there. Code clean up.
821            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
822            images for the dock/undock button to the same images.
823            Work around for RTbug #1801.
824    
825            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
826            be allowed to grow within the sizer. Fixes a bug under Windows
827            where the toolbar wasn't being drawn.
828    
829    2003-04-14  Frank Koormann   <[email protected]>
830    
831            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
832            Updated design to try to make the button functionality more
833            transparent.
834    
835    2003-04-14  Jonathan Coles   <[email protected]>
836    
837            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
838            finalize the intialization of the panel.
839    
840            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
841            creation of the panel. Should be the last thing called in the
842            initializer of a subclass.
843    
844            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
845            set the current selections in the combo boxes. This is needed
846            under Windows.
847    
848            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
849            level panel to the dialog so that the background colors are
850            consistent under Windows.
851    
852    2003-04-11  Jonathan Coles   <[email protected]>
853    
854            * Thuban/UI/classgen.py: Change color ramps to start at white
855            not black.
856    
857            * Thuban/UI/legend.py: Enable/disable the legend buttons when
858            the legend changes. Fixes RTbug #1793.
859    
860            * test/test_classification.py: Added test for copying of
861            classifications.
862    
863    2003-04-11  Jonathan Coles   <[email protected]>
864    
865            * Thuban/UI/resource.py: New. Centralize the loading of resources
866            such as bitmaps.
867    
868            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
869            added images to the move buttons, added 'reverse' button.
870            (CustomRampPanel.__init__): Added images to the move buttons.
871            (GreyRamp): New. Generates a ramp from white to black.
872            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
873    
874            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
875            ID_PROPERTY_*.
876            (Classifier.__init__): Minor changes to the layout.
877            (Classifier._OnTitleChanged): Listen for when the user edits the
878            title and update the dialog's title and the layer's title.
879    
880            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
881    
882            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
883            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
884            if the layer's title changes.
885    
886            * Thuban/UI/mainwindow.py: Added new menu item and associated code
887            to open a dialog to rename the map.
888            (MainWindow): Use new resource class to import bitmaps.
889    
890    2003-04-11  Jonathan Coles   <[email protected]>
891    
892            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
893            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
894            Resources/Bitmaps/group_use_none.xpm,
895            Resources/Bitmaps/group_use_not.xpm,
896            Resources/Bitmaps/hide_layer.xpm,
897            Resources/Bitmaps/layer_properties.xpm,
898            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
899            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
900            New.
901    
902    2003-04-10  Jonathan Coles   <[email protected]>
903    
904            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
905            Should pass group to ClassGroup constructor.
906    
907    2003-04-10  Jonathan Coles   <[email protected]>
908    
909            * Thuban/Model/classification.py: (ClassGroup): Move all the common
910            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
911            here. Implement SetVisible(), IsVisible().
912            (ClassGroup.__init__): Add group parameter which acts as a copy
913            constructor.
914    
915            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
916            "Visible" check boxes.
917            (Classifier): Rename the buttons and refactor the code to match
918            the new labels.
919    
920            * Thuban/UI/legend.py: Classify button is now called "Properties".
921            Refactored the code to change variable names.
922            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
923    
924            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
925            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
926            renamed to MainWindow.LayerEditProperties.
927            (MainWindow.ToggleLegend): Don't include map name in legend title.
928            (MainWindow.SetMap): Added the map name to the window title.
929            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
930            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
931            Functionality is found in the layer properties dialog.
932    
933            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
934            draw visible groups.
935    
936    2003-04-09  Jonathan Coles   <[email protected]>
937    
938            * Thuban/UI/classgen.py: Modifications to allow simple
939            addition and selection of new color schemes.
940            (MonochromaticRamp): New. Generates a ramp between two colors.
941            (RedRamp): New. Generates a ramp of all red.
942            (GreenRamp): New. Generates a ramp of all green.
943            (BlueRamp): New. Generates a ramp of all blue.
944    
945    2003-04-09  Jonathan Coles   <[email protected]>
946    
947            * Thuban/Model/classification.py (Classification.__deepcopy__):
948            Need to copy over field and fieldType attributes.
949    
950            * Thuban/Model/table.py (Table.field_range): New. Retrive the
951            maximum and minimum values over the entire table for a given
952            field.
953            (Table.GetUniqueValues): New. Retrieve all the unique values
954            in the table for a given field.
955    
956            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
957            (GenUniquePanel): New. Controls to allow the user to select
958            which unique field values they would like in the classification.
959            (CustomRampPanel): Code that was in ClassGenDialog that allows
960            the user to select the properties for a custom ramp.
961            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
962    
963            * Thuban/UI/classifier.py: Removed a lot of debugging code.
964            (Classifier._SetClassification): Callback method so that the
965            class generator can set the classification in the grid.
966            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
967            editing of a group properties class into a wxWindows control.
968    
969            * Thuban/UI/dock.py: It was decided that if the user closes
970            a dockable window the window should simply hide itself. That
971            way if the user wants to show the dock again it appears in the
972            same place as it was when it was closed.
973            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
974            (DockableWindow._OnButtonClose): Hide the window instead of
975            destroying it.
976            (DockableWindow._OnClose): Hide the window instead of
977            destroying it.
978    
979            * Thuban/UI/legend.py (LegendTree): Use a private method to
980            consistently set the font and style of the text. Fixes RTbug #1786.
981    
982            * Thuban/UI/mainwindow.py: Import just the Classifier class.
983    
984    2003-04-07  Bernhard Herzog  <[email protected]>
985    
986            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
987            to the map module
988    
989    2003-04-07  Bernhard Herzog  <[email protected]>
990    
991            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
992            favor of ToggleSessionTree
993            (MainWindow.ToggleSessionTree): New method to toggle visibility of
994            the session tree.
995            (MainWindow.SessionTreeShown): New method to return whether the
996            session tree is currently shown.
997            (MainWindow.ToggleLegend): New method to toggle visibility of the
998            legend
999            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
1000            LegendShown
1001            (MainWindow.LegendShown): New method to return whether the legend
1002            is currently shown.
1003            (_method_command): Add checked parameter so we can define check
1004            menu items
1005            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
1006            mainwindow methods.
1007            (show_session_tree, show_legend commands): Removed.
1008            (toggle_session_tree, toggle_legend commands): New commands to
1009            toggle the visibility of the dialogs
1010    
1011    2003-04-07  Jonathan Coles   <[email protected]>
1012    
1013            * Thuban/UI/classgen.py: Fix Windows problem.
1014    
1015            * Thuban/UI/dock.py: Fix Windows problem.
1016    
1017            * Thuban/UI/mainwindow.py: Use False instead of false.
1018            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
1019    
1020    2003-04-07  Jonathan Coles   <[email protected]>
1021    
1022            Since we now say that the order of the groups in a classification
1023            matters, it makes sense to be able to manipulate that order. Most
1024            of the changes to Thuban/Model/classification.py are to that end.
1025    
1026            * Thuban/Model/classification.py (Classification.AppendGroup,
1027            Classification.InsertGroup, Classification.ReplaceGroup,
1028            Classification.RemoveGroup, Classification.GetGroup): Do as the
1029            names imply.
1030            (Classification.FindGroup): This was called GetGroup, but GetGroup
1031            takes an index, while FindGroup takes a value.
1032            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
1033            REFERENCE. Currently there is a cyclic reference between the layer
1034            and its classification. If the classification doesn't need to know
1035            its owning layer we can change this, since it may make sense to be
1036            able to use the same classification with different layers.
1037    
1038            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
1039    
1040            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
1041            not AddGroup()
1042    
1043            * Thuban/UI/classifier.py: Now that we can depend on the order in
1044            a Classification and have methods to manipulate that order we don't
1045            need to use our own data structures in the grid. We can simply make
1046            the grid/table access the information they need from a copy of
1047            the classification object.
1048            (Classifier._OnCloseBtn): Event handler for when the user clicks
1049            'Close'. This is needed so if the user applies changes and then
1050            continues to change the table the user has the option of discarding
1051            the most recent changes and keeping what they applied.
1052    
1053            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
1054            into the same group.
1055    
1056            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
1057            with a really old version of proj, PJ_VERSION won't even be defined.
1058            If it isn't defined then just compile so that the function always
1059            returns Py_False.
1060    
1061            * test/test_classification.py: Fix tests to use the renamed methods.
1062            Still need to write tests for the new methods.
1063    
1064    2003-04-04  Jonathan Coles   <[email protected]>
1065    
1066            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
1067            call to SetSelection out of the method and before the call
1068            to __SelectField in __init__. This prevents a recursion of events
1069            when _OnFieldSelect is triggered by the user.
1070    
1071    2003-04-04  Jonathan Coles   <[email protected]>
1072    
1073            * Thuban/Model/classification.py: Rename Color.None to
1074            Color.Transparent.
1075            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
1076            Don't bother copying the color, since Colors are immutable.
1077    
1078            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
1079            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
1080            Thuban/UI/renderer.py, Thuban/UI/view.py:
1081            Rename Color.None to Color.Transparent.
1082        
1083            * test/test_classification.py, test/test_load.py: Rename Color.None
1084            to Color.Transparent.
1085    
1086    2003-04-04  Jonathan Coles   <[email protected]>
1087    
1088            * Thuban/Model/classification.py: Fix assert calls.
1089            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
1090            Copy the color parameter rather than hold onto a reference.
1091    
1092            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
1093            the color object.
1094            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
1095            are sure there exists only one refernce to Color.None in the system.
1096            This allows us to use 'is' rather than the comparision functions.
1097            
1098            * Thuban/Model/save.py: Fix assert calls.
1099            
1100            * Thuban/UI/classifier.py: Fix assert calls.
1101            (ClassGrid._OnCellDClick): Call up to the classifier to open the
1102            dialog to edit the groups properties.
1103            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
1104            correctly if a cell is resized.
1105            (ClassTable.SetClassification): New. Changes the classification
1106            that is in the table.
1107            (ClassTable.__SetRow): Allow groups to be prepended.
1108            (Classifier): New code for opening the EditProperties and
1109            GenerateRanges dialogs.
1110            (SelectPropertiesDialog.__GetColor): Only set the color in the
1111            color dialog if the current color is not None.
1112            
1113            * Thuban/UI/dock.py: Fix assert calls.
1114            
1115            * Thuban/UI/legend.py: Fix assert calls.
1116            
1117            * Thuban/UI/renderer.py: Fix assert calls.
1118            
1119            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
1120            classifications.
1121            (GenRangePanel): Panel specific to range generation.
1122            (GenSingletonPanel): Panel specific to singleton generation.
1123            (ClassGenerator): Class responsible for actually generating
1124            the classification from the data gathered in the dialog box.
1125            (PropertyRamp): Generates properties whose values range from
1126            a starting property to an ending property.
1127    
1128    2003-04-03  Bernhard Herzog  <[email protected]>
1129    
1130            * test/support.py (print_garbage_information): New function that
1131            prints information about still connected messages and memory
1132            leaks.
1133            (run_suite): Removed.
1134            (run_tests): New function for use as a replacement of
1135            unittest.main in the test_* files. This one calls
1136            print_garbage_information at the end.
1137    
1138            * test/runtests.py (main): Use support.print_garbage_information
1139    
1140            * test/test_layer.py: Use support.run_tests instead of
1141            unittest.main so we get memory leak information
1142            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1143            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1144            (TestLayerLegend.test_visibility): Call the layer's Destroy method
1145            to fix a memory leak.
1146    
1147            * test/test_classification.py: Use support.run_tests instead of
1148            unittest.main so we get memory leak information
1149            (TestClassification.test_classification): Call the layer's Destroy
1150            method to fix a memory leak.
1151    
1152    2003-04-02  Bernhard Herzog  <[email protected]>
1153    
1154            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1155            Handle the reference counts of the return value and errors in
1156            PyArg_ParseTuple correctly.
1157    
1158            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1159            sure the filename is absolute to avoid problems when saving the
1160            session again
1161    
1162            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
1163    
1164    2003-04-01  Jonathan Coles   <[email protected]>
1165    
1166            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
1167            that there actually are points in the returned list of points
1168            before trying to index into the list. The list may be empty if
1169            the shape is a Null Shape.
1170    
1171    2003-04-01  Bernhard Herzog  <[email protected]>
1172    
1173            * test/test_map.py: Don't use from <module> import *
1174    
1175    2003-04-01  Jonathan Coles   <[email protected]>
1176    
1177            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
1178            LAYER_LEGEND_CHANGED
1179    
1180            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
1181            self.Destroy() to close the window after yesterday's changes.
1182    
1183            * test/test_map.py, test/test_session.py: Fix messages that
1184            are sent from maps and layers.
1185    
1186    2003-03-31  Jonathan Coles   <[email protected]>
1187    
1188            * Thuban/UI/classifier.py: Commented out some debugging statements.
1189            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
1190            RTbug #1769.
1191    
1192            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
1193            position (although position doesn't work yet under GTK).
1194            (DockableWindow.Destroy): New. Called when the window must be
1195            closed. Namely needed when the DockFrame closes and must close
1196            its children.
1197            (DockFrame): Listen for EVT_CLOSE and destroy all children.
1198    
1199            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
1200            when then window is told to close.
1201            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
1202            comment in source for more info.
1203    
1204            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
1205    
1206            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
1207            symmetry with other such methods.
1208            (MainWindow.ShowLegend): Show the legend docked by default.
1209    
1210    2003-03-28  Jonathan Coles   <[email protected]>
1211    
1212            * Thuban/UI/classifier.py: Support for highlighting a specific
1213            group within the grid when the classification dialog is opened.
1214            Also contains a lot of debugging printouts which will later
1215            be removed.
1216    
1217            * Thuban/UI/dock.py: Complete rework on the dock code so that
1218            that it is fairly removed from the rest of the Thuban application.
1219            It is easy to add new docks which the rest of the program having
1220            to be aware of them.
1221    
1222            * Thuban/UI/legend.py: Modifications to support selecting a
1223            specific group in the classification dialog. Changed how layers
1224            are drawn when the layer is visible/invisible.
1225    
1226            * Thuban/UI/mainwindow.py: Removed legend specific code and
1227            replaced it with calls to the new dock code.
1228    
1229            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
1230            to check if scale > 0. Trying to track down a divide by zero.
1231    
1232    2003-03-26  Jonathan Coles   <[email protected]>
1233    
1234            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
1235            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
1236            now part of DockableWindow.
1237            (LegendPanel.DoOnSelChanged): Select the current layer in the
1238            map.
1239            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
1240            with the selected layer and/or group.
1241    
1242    2003-03-26  Jonathan Coles   <[email protected]>
1243    
1244            This putback contains the code for dockable windows. There is
1245            no support in wxWindows as of this date for windows that can
1246            attach themselves to other windows.
1247    
1248            The current model contains a DockableWindow which has a parent
1249            window for when it is detached and a dock window that it puts
1250            its contents in when it is docked. The contents of a DockableWindow
1251            must be a DockPanel. DockPanel itself derives from wxPanel.
1252    
1253            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
1254            message, not a LAYER_LEGEND_CHANGED message.
1255    
1256            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
1257    
1258            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
1259            as one of the style properties for the fieldTypeText item to
1260            be sure that its size is correct when the text changes.
1261    
1262            * Thuban/UI/dock.py: New. Classes for the DockPanel and
1263            DockableWindow.
1264    
1265            * Thuban/UI/legend.py: Added some more buttons and made the
1266            LegendPanel a DockPanel.
1267    
1268            * Thuban/UI/mainwindow.py: Added sash windows to the main window
1269            and supporting functions for manipulating the sashes.
1270            (MainWindow.ShowLegend): Create a DockableWindow with the
1271            LegendPanel as the contents.
1272    
1273            * Thuban/UI/messages.py: Added DOCKABLE_* messages
1274    
1275            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
1276            not LAYER_LEGEND_CHANGED, messages.
1277    
1278    2003-03-25  Jonathan Coles   <[email protected]>
1279    
1280            * setup.py: Added custom script bdist_rpm_build_script so that
1281            when the rpm is built the path to wx-config is correct.
1282    
1283            * setup.cfg: Added line saying to use the custom build script
1284    
1285    2003-03-20  Jonathan Coles   <[email protected]>
1286    
1287            Initial implementation of the Legend.
1288    
1289            * Thuban/UI/legend.py: New. Creates a window that shows the map's
1290            Legend information and allows the user to add/modify classifications
1291            and how the layers are drawn on the map.
1292    
1293            * setup.py: New command 'build_docs' which currently uses
1294            happydoc to generate html documentation for Thuban.
1295    
1296            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
1297            Returns a string which is appropriately describes the group.
1298    
1299            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
1300            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
1301    
1302            * Thuban/Model/map.py (Map): Rename messages and use new, more
1303            specific, messages.
1304    
1305            * Thuban/Model/messages.py: New message to indicate that a layer's
1306            data has changed (LAYER_CHANGED). New map messages to indicate
1307            when layers have been added/removed/changed or if the stacking order
1308            of the layers has changed.
1309    
1310            * Thuban/Model/session.py: Rename and use new messages.
1311    
1312            * Thuban/UI/classifier.py: Remember if any changes have actually
1313            been applied so that if the dialog is cancelled without an application
1314            of changes we don't have to set a new classification.
1315            (ClassDataPreviewer): Pulled out the window specific code and put it
1316            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
1317            symbols on any DC.
1318            
1319            * Thuban/UI/mainwindow.py: New code to open the legend.
1320    
1321            * Thuban/UI/view.py: Use new message names.
1322    
1323    2003-03-19  Jonathan Coles   <[email protected]>
1324    
1325            * Thuban/UI/main.py (verify_versions): New. Checks the versions
1326            of Python, wxPython, and some other libraries.
1327    
1328            * extensions/thuban/wxproj.cpp (check_version): Checks the given
1329            version against what wxproj was compiled with.
1330            (check_version_gtk): If wxproj was compiled with gtk then check
1331            the given version against the version of the gtk library
1332            currently being used.
1333    
1334    2003-03-14  Bernhard Herzog  <[email protected]>
1335    
1336            * test/test_command.py: Run the tests when the module is run as a
1337            script
1338    
1339    2003-03-14  Bernhard Herzog  <[email protected]>
1340    
1341            Implement selection of multiple selected shapes in the same layer:
1342    
1343            - Introduce a new class to hold the selection. This basically
1344              replaces the interactor which was nothing more than the
1345              selection anyway. A major difference is of course that the new
1346              selection class supports multiple selected shapes in one layer
1347            
1348            - Move the object that represents the selection from the
1349              application to the canvas. The canvas is a better place than the
1350              application because the selection represents which shapes and
1351              layer of the map displayed by the canvas are selected and
1352              affects how the map is drawn.
1353    
1354            - Make the selection and its messages publicly available through
1355              the mainwindow.
1356    
1357            - The non-modal dialogs do not get a reference to the interactor
1358              anymore as they can simply refer to their parent, the
1359              mainwindow, for the what the interactor had to offer.
1360    
1361            * Thuban/UI/selection.py: New module with a class to represent the
1362            selection.
1363    
1364            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
1365            these unused messages
1366    
1367            * Thuban/UI/application.py (ThubanApplication.OnInit)
1368            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
1369            interactor is gone now.
1370            (ThubanApplication.CreateMainWindow): There is no interactor
1371            anymore so we pass None as the interactor argument for now for
1372            compatibility.
1373    
1374            * Thuban/UI/view.py (MapCanvas.delegated_messages)
1375            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
1376            Unsubscribe, delegate messages according to the delegated_messages
1377            class variable.
1378            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
1379            attributes from instance variables as described with the
1380            delegated_methods class variable.
1381            (MapCanvas.__init__): New instance variable selection holding the
1382            current selection
1383            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
1384            pass them on to the renderer
1385            (MapCanvas.SetMap): Clear the selection when a different map is
1386            selected.
1387            (MapCanvas.shape_selected): Simple force a complete redraw. The
1388            selection class now takes care of only issueing SHAPES_SELECTED
1389            messages when the set of selected shapes actually does change.
1390            (MapCanvas.SelectShapeAt): The selection is now managed in
1391            self.selection
1392    
1393            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
1394            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
1395            Unsubscribe, delegate messages according to the delegated_messages
1396            class variable.
1397            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
1398            attributes from instance variables as described with the
1399            delegated_methods class variable.
1400            (MainWindow.__init__): The interactor as ivar is gone. The
1401            parameter is still there for compatibility. The selection messages
1402            now come from the canvas.
1403            (MainWindow.current_layer, MainWindow.has_selected_layer):
1404            Delegate to the the canvas.
1405            (MainWindow.LayerShowTable, MainWindow.Classify)
1406            (MainWindow.identify_view_on_demand): The dialogs don't need the
1407            interactor parameter anymore.
1408    
1409            * Thuban/UI/tableview.py (TableFrame.__init__)
1410            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
1411            (LayerTableFrame.row_selected): The interactor is gone. It's job
1412            from the dialog's point of view is now done by the mainwindow,
1413            i.e. the parent. Subscribe to SHAPES_SELECTED instead
1414            of SELECTED_SHAPE
1415            
1416            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
1417            is gone. It's job from the dialog's point of view is now done by
1418            the mainwindow, i.e. the parent.
1419            
1420            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
1421            gone. It's job from the dialog's point of view is now done by the
1422            mainwindow, i.e. the parent.
1423    
1424            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
1425            gone. It's job from the dialog's point of view is now done by the
1426            mainwindow, i.e. the parent.
1427            (SessionTreeCtrl.__init__): New parameter mainwindow which is
1428            stored as self.mainwindow. The mainwindow is need so that the tree
1429            can still subscribe to the selection messages.
1430            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
1431            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
1432            selection is now accessible through the mainwindow. Subscribe to
1433            SHAPES_SELECTED instead of SELECTED_SHAPE
1434    
1435            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
1436            SHAPES_SELECTED message now.
1437            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
1438            so deal with multiple shapes
1439            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
1440            gone. It's job from the dialog's point of view is now done by the
1441            mainwindow, i.e. the parent.
1442    
1443            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
1444            parameter is now a list of shape ids.
1445            (RecordTable.SetTable): The second parameter is now a list of
1446            indices.
1447    
1448            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
1449            selected_shape parameter and ivar to selected_shapes. It's now a
1450            list of shape ids.
1451            (MapRenderer.draw_label_layer): Deal with multiple selected
1452            shapes. Rearrange the code a bit so that the setup and shape type
1453            distinctions are only executed once.
1454    
1455            * test/test_selection.py: Test cases for the selection class
1456    
1457    2003-03-11  Jonathan Coles   <[email protected]>
1458    
1459            * Thuban/Model/load.py: Temporary fix so that the xml reader
1460            doesn't cause Thuban to crash.
1461    
1462            * Thuban/Model/layer.py: Handle the cyclic references between
1463            a layer and its classification better, and be sure to disconnect
1464            the classification from the layer when the layer is destroyed
1465            so that we don't maintain a cyclic reference that may not be
1466            garbage collected.
1467    
1468            * Thuban/Model/classification.py: See comment for layer.py.
1469    
1470    2003-03-12  Jan-Oliver Wagner <[email protected]>
1471    
1472            * HOWTO-Release: New. Information on the steps for releasing
1473            a new version of Thuban.
1474    
1475    2003-03-11  Jonathan Coles   <[email protected]>
1476    
1477            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
1478            Use True instead of true.
1479            (Classifier): Should have a single panel in which all the controls lie.
1480    
1481            * Thuban/UI/proj4dialog.py: Add normal border.
1482    
1483            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
1484    
1485            * Thuban/UI/mainwindow.py: Use True instead of true.
1486    
1487            * setup.py: Update some definitions to use wxWindows2.4 files
1488    
1489            * Data/iceland_sample_class.thuban: Fixed file so that the
1490            field_type information is present.
1491    
1492    2003-03-10  Jonathan Coles   <[email protected]>
1493    
1494            * Thuban/UI/classifier.py (Classifier.__init__): Make the
1495            field type label grow so that when the text changes the
1496            size is updated correctly. This may be a wxWindows bug.
1497    
1498    2003-03-10  Jonathan Coles   <[email protected]>
1499    
1500            * Thuban/UI/application.py: Changed SESSION_CHANGED to
1501            SESSION_REPLACED.
1502    
1503            * Thuban/UI/classifier.py: Wrap text with _().
1504            (ClassGrid.CreateTable): Set dimensions and size hints here,
1505            instead of in Reset, so we only set the size once.
1506    
1507            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1508    
1509            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1510            Call Close() instead of Shutdown().
1511    
1512            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1513    
1514            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1515            Go back to using OnClose() instead of Shutdown().
1516    
1517    2003-03-10  Jonathan Coles   <[email protected]>
1518    
1519            * Thuban/UI/classifier.py (Classifier): SelectField() needed
1520            to know the old field index as well as the new one.
1521    
1522    2003-03-10  Jonathan Coles   <[email protected]>
1523    
1524            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1525            to correctly set the table information and call this from
1526            __init__ and from _OnFieldSelect so that all the information
1527            is up to date when the dialog opens and when a field is changed.
1528    
1529    2003-03-10  Jonathan Coles   <[email protected]>
1530    
1531            * Thuban/Model/classification.py (Classification): Don't use
1532            layer's message function directly, use the ClassChanged() method
1533            when then classification changes. SetField/SetFieldType/SetLayer
1534            must keep the information about field name and field type in
1535            sync when an owning layer is set or removed.
1536    
1537            * Thuban/Model/layer.py: Added ClassChanged() so that the
1538            classification can tell the layer when its data has changed.
1539            (Layer.SetClassification): Accepts None as an arguement to
1540            remove the current classification and correctly handles
1541            adding a new classification.
1542    
1543            * Thuban/Model/load.py: Comment out print statement
1544    
1545            * test/test_classification.py, test/test_save.py: New and
1546            improved tests.
1547    
1548    2003-03-07  Jonathan Coles   <[email protected]>
1549    
1550            * Thuban/Model/classification.py: Implemented __copy__ and
1551            __deepcopy__ for ClassGroup* and ClassGroupProperites so
1552            they can easily be copied by the classifier dialog.
1553            (ClassGroupProperites.__init__): The default line color should
1554            have been Color.Black.
1555    
1556            * Thuban/UI/classifier.py: Setting and Getting table values now
1557            uses a consistent set of functions.
1558            (Classifier): Now non-modal. Has field type label which changes
1559            as the field changes. Keep track of buttons in a list so that
1560            we can enable/disable the buttons when the None field is selected.
1561            (SelectPropertiesDialog): Add buttons to make the colors transparent.
1562    
1563            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
1564            does what OnClose did, but can be called by the application to
1565            close a window. Needed when a session changes, and we have to
1566            close the classifier windows.
1567    
1568            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1569            Shuts down open dialogs. Used when a new session is created
1570            or a session is opened.
1571            (MainWindow.SaveSession): Should only call application.SaveSession()
1572            if we don't call SaveSessionAs first.
1573            (MainWindow.Classify): Allow different classifier dialogs for
1574            different layers.
1575    
1576            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
1577            the parent class handle it. Add Shutdown() to unsubscibe from
1578            event notification and call the parent Shutdown(). This was
1579            necessary so the application can close the tree window.
1580    
1581    2003-03-06  Jonathan Coles   <[email protected]>
1582    
1583            * Thuban/Model/classification.py: Minor documentation changes,
1584            Addition of __eq__ and __ne__ methods.
1585            (Classification.SetLayer): prevent recursion between this method
1586            and Layer.SetClassification().
1587    
1588            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
1589    
1590            * Thuban/Model/layer.py (SetClassification): prevent recursion
1591            between this method and Classification.SetLayer().
1592    
1593            * test/test_classification.py, test/test_load.py,
1594            test/test_session.py: Fixed and added tests for the classification
1595            classes.
1596    
1597    2003-03-06  Bernhard Herzog  <[email protected]>
1598    
1599            * Thuban/UI/classifier.py (ClassGrid.__init__)
1600            (ClassGrid.CreateTable): Move the SetSelectionMode call to
1601            CreateTable because otherwise it triggers an assertion in
1602            wxPython/wxGTK 2.4.
1603    
1604    2003-03-05  Jonathan Coles   <[email protected]>
1605    
1606            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
1607    
1608            * Thuban/Model/load.py: import FIELDTYPE constants from table.
1609    
1610            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
1611    
1612            * Thuban/Model/table.py: Put FIELDTYPE constants back.
1613    
1614    2003-03-05  Jonathan Coles   <[email protected]>
1615    
1616            * Thuban/UI/classifier.py: Added class documentation.
1617            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
1618            Store just the groups in the table and generate the other
1619            column information when it is requested. Add "None" field
1620            to pull-down to select no classification.
1621    
1622            * Thuban/common.py: Moved FIELDTYPE constants from table.py
1623            (Str2Num): Only catch ValueError exceptions.
1624    
1625            * Thuban/Model/classification.py: Class documentation. Renaming
1626            of methods with Stroke to Line. Groups are stored in a single
1627            list with the default as the first element. Groups are searched
1628            in the order they appear in the list.
1629    
1630            * Thuban/Model/color.py: Documentation.
1631    
1632            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
1633            the kind of data represented by a field.
1634    
1635            * Thuban/Model/load.py (ProcessSession): Use proper string
1636            conversion function; fixes RTbug #1713.
1637    
1638            * Thuban/Model/save.py (Saver): Store field type information.
1639    
1640            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
1641            (Table): Add field_info_by_name() to retrieve field information
1642            by specifying the field name, not the number.
1643    
1644            * Thuban/UI/mainwindow.py: Function name changes.
1645    
1646            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1647            get the layer classification once. Don't try to classify
1648            values when the field is None: just use the default properties.
1649    
1650            * Thuban/UI/view.py: Function name changes.
1651    
1652            * Doc/thuban.dtd: Add field_type attribute to a classification.
1653    
1654    2003-03-04  Bernhard Herzog  <[email protected]>
1655    
1656            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
1657            the fill and stroke layer attributes optional with suitable
1658            default values. Add the stroke_width layer attribute. Use correct
1659            syntax for empty elements. Make the attribute list for labels
1660            refer to the label element.
1661    
1662    2003-03-04  Bernhard Herzog  <[email protected]>
1663    
1664            * setup.py (thuban_build_py.build): Add a comment about distutils in
1665            Python 2.3 containing some of the functionality we implement in
1666            setup.py ourselves.
1667    
1668            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
1669            before the selection mode. Doing it the other way round triggers
1670            an assertion in wxWindows.
1671    
1672            * Thuban/Model/save.py (escape): Fix typo in doc-string
1673    
1674            * Thuban/Model/classification.py: Remove unnecessary wxPython
1675            import
1676    
1677    2003-03-04  Jonathan Coles   <[email protected]>
1678    
1679            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
1680            Parameter 'value' should default to None.
1681    
1682            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
1683            the class attribute __classification is now private.
1684    
1685            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
1686            Classifier to ClassGrid. Added support for removing selected rows,
1687            which including code for keeping track of when cells are selected,
1688            and deselected.
1689            (ClassTable): Support for added/removing rows. Fixed a problem
1690            with __ParseInput whereby it would not allow strings (only numbers)
1691            to be entered.
1692            (Classifier): Added button and supporting code for removing
1693            selected rows.
1694    
1695    2003-02-27  Jonathan Coles   <[email protected]>
1696    
1697            * Thuban/common.py: Moved color conversion functions into
1698            Thuban/UI/common.py.
1699            (Str2Num): Now converts the float (not the string) to a long/int
1700            so that an exception isn't thrown.
1701    
1702            * Thuban/UI/common.py: Common functions used in several UI modules
1703    
1704            * Thuban/Model/classification.py: Changed the class hierarchy
1705            so that a Classification consists of Groups which return
1706            Properties when a value matches a Group.
1707    
1708            * Thuban/Model/layer.py: Fixed name resolution problem.
1709    
1710            * Thuban/Model/load.py: Use new Classification and Group functions.
1711    
1712            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
1713            failure.
1714            (Saver.write_classification): Use new Classification and Group
1715            functions.
1716    
1717            * Thuban/UI/classifier.py: Changes to use new Classification and Group
1718            functions. Fix to create a tuple with a single value instead of
1719            simply returning the value.
1720    
1721            * Thuban/UI/renderer.py: Use new Classification and Group functions.
1722            Use common.py functions.
1723    
1724            * Thuban/UI/tree.py: Use common.py functions.
1725            
1726            * test/test_classification.py: Use new Classification and Group
1727            classes.
1728    
1729    2003-02-24  Jonathan Coles   <[email protected]>
1730    
1731            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
1732            functions from Thuban color objects to wxWindow colour objects.
1733    
1734            * Thuban/Model/classification.py (Classification): Renamed
1735            GetProperties() to GetClassData(). Used the new iterator
1736            in TreeInfo().
1737            (ClassIterator): Iterator implementation to iterate over the
1738            ClassData objects in a classification object.
1739    
1740            * Thuban/Model/save.py (Saver.write_classificaton): Uses
1741            the new iterator to save the classification information.
1742    
1743            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
1744            for changing the stroke and fill colors and previewing the
1745            changes.
1746    
1747            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
1748            MainWindow.SaveSessionAs): Text string changes so the dialogs
1749            have more meaningful titles.
1750    
1751            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
1752            Classification method name from GetProperties to GetClassData.
1753    
1754            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
1755            instead of accessing now non-existent class variables.
1756    
1757    2003-02-24  Bernhard Herzog  <[email protected]>
1758    
1759            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
1760            unneeded Shape() call. Rendering is substantially faster without
1761            it and it avoids some problems with broken shape files.
1762    
1763    2003-02-20  Frank Koormann   <[email protected]>
1764    
1765            Force minimal size of identify and label dialogs. The autosizing
1766            looked too ugly.
1767    
1768            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
1769            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
1770            Set size of listctrl.
1771            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1772            Set size of dialog.
1773    
1774    2003-02-19  Jonathan Coles   <[email protected]>
1775    
1776            * test/test_classification.py, test/test_layer.py,
1777            test/test_load.py, test/test_map.py, test/test_session.py:
1778            Updated the tests to use the new functions that are in the
1779            respective classes.
1780    
1781            * Thuban/Model/classification.py (Classification):
1782            Uses the new ClassData* classes. Modification messages are
1783            passed up to the parent layer (if it exists).
1784            (ClassData): New class to encapsulate the common data in each
1785            classification property.
1786            (ClassDataDefault): Represents the Default class. data.
1787            (ClassDataPoint): Represents a single class. data point
1788            (ClassDataRange): Represents a class. range
1789            (ClassDataMap): Represents a class. map (unused).
1790    
1791            * Thuban/Model/color.py: Added Color.None to represent something
1792            with no color. Color.Black represents the color black.
1793            (NoColor): Helper class derived from Color to represent something
1794            with no color.
1795    
1796            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
1797            stroke_width attributes. Made the 'classification' attribute private.
1798            New methods for setting/getting the classification.
1799    
1800            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
1801            to get the classifcation and use the new ClassData* classes to
1802            hold the classification data. Use Str2Num to convert numbers
1803            properly.
1804    
1805            * Thuban/Model/save.py (Saver): Use new Color and Classification
1806            methods
1807    
1808            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
1809            custom grid.
1810            (ClassTable): Support for editing Values and Labels and for
1811            changing what type (point or range) of data is stored in each
1812            property based on how the user enters the data.
1813            (Classifier): Support for saving the new classifications and
1814            launching the dialog to edit a property.
1815            (SelectPropertiesDialog): New class for editing the visual
1816            properties of a classification (stroke color, width, and fill color)
1817            (ClassPreviewer): Took the Draw method from ClassRenderer and
1818            made most of it into this new class. Intend to use this class in
1819            the SelectPropertiesDialog for previewing changes.
1820    
1821            * Thuban/UI/renderer.py: Use new Color and Classification methods.
1822    
1823            * Thuban/UI/tree.py: Formatting changes.
1824    
1825            * Doc/thuban.dtd: Add 'label' element
1826    
1827            * Thuban/common.py: New. Contains common routines used throughout
1828            the code.
1829            (Str2Num): Takes a string and converts it to the "best" type of
1830            number.
1831    
1832    2003-02-14  Bernhard Herzog  <[email protected]>
1833    
1834            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
1835            dragging flag is always set to 0 even when the tool implementation
1836            raises an exception
1837    
1838    2003-02-11  Bernhard Herzog  <[email protected]>
1839    
1840            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
1841            method to create a splash screen.
1842            (ThubanApplication.ShowMainWindow): New. Show the main window.
1843            Needed so the splash screen can display the mainwindow
1844            (ThubanApplication.OnInit): Call the
1845            new splash_screen method to determine whether the application
1846            should display a splash screen. If it displays a splash screen do
1847            not immediately show the main window.
1848    
1849  2003-02-11  Jonathan Coles  <[email protected]>  2003-02-11  Jonathan Coles  <[email protected]>
1850    
1851          * Thuban/Model/classification.py: Added import line to fix          * Thuban/Model/classification.py: Added import line to fix
# Line 8  Line 1856 
1856    
1857  2003-02-10  Jonathan Coles  <[email protected]>  2003-02-10  Jonathan Coles  <[email protected]>
1858    
1859          * Thuban/Model/save.py (Saver.open_element, Saver.close_element):          * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
1860          Added element_open variable to track opening and closing of tags          Added element_open variable to track opening and closing of tags
1861          so that tags that don't span more than one line are closed with          so that tags that don't span more than one line are closed with
1862          /> instead of </tag_name>. Use the GetDefault*() methods of          /> instead of </tag_name>. Use the GetDefault*() methods of
# Line 21  Line 1869 
1869          (ClassData): New class to encapsulate the classification data          (ClassData): New class to encapsulate the classification data
1870    
1871          * Thuban/Model/layer.py (Layer): Remove the          * Thuban/Model/layer.py (Layer): Remove the
1872          Set[Fill|Stroke|StrokeWidth]() methods. Code should call the          Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
1873          SetDefault*() methods on the layer's classification object.          SetDefault*() methods on the layer's classification object.
1874          (Layer.__init__): Use the new SetDefault*() methods in the          (Layer.__init__): Use the new SetDefault*() methods in the
1875          Classification class.          Classification class.
1876    
1877          * Thuban/Model/load.py (ProcessSession): Use the new ClassData          * Thuban/Model/load.py (ProcessSession): Use the new ClassData
1878          object instead of a dictionary.          object instead of a dictionary.
1879    
1880          * Thuban/UI/classifier.py (ClassRenderer): New class to          * Thuban/UI/classifier.py (ClassRenderer): New class to
1881          draw the classifications in the dialog box's table.          draw the classifications in the dialog box's table.
1882          (Classifier): Modified to use the ClassRenderer class.          (Classifier): Modified to use the ClassRenderer class.
1883    
1884          * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()          * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
1885          methods of the Classification class.              methods of the Classification class.
1886    
1887          * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods          * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
1888          of the ClassData class.          of the ClassData class.
# Line 57  Line 1905 
1905  2003-01-28  Jonathan Coles  <[email protected]>  2003-01-28  Jonathan Coles  <[email protected]>
1906    
1907          * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.          * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
1908          Fixed crashing problem on some systems. Dialog box shows          Fixed crashing problem on some systems. Dialog box shows
1909          classification data.          classification data.
1910    
1911          * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing          * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
# Line 70  Line 1918 
1918          function to add information about the classification into the          function to add information about the classification into the
1919          tree view.          tree view.
1920    
1921  2003-01-27      Jan-Oliver Wagner <[email protected]>  2003-01-27  Jan-Oliver Wagner <[email protected]>
1922    
1923          * Thuban/__init__.py (_): New.          * Thuban/__init__.py (_): New.
1924    
1925          * Thuban/Model/classification.py, Thuban/Model/extension.py,          * Thuban/Model/classification.py, Thuban/Model/extension.py,
1926          Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,          Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
1927          Thuban/Model/session.py, Thuban/UI/application.py, Thuban/UI/classifier.py,          Thuban/Model/session.py, Thuban/UI/application.py,
1928          Thuban/UI/context.py, Thuban/UI/controls.py, Thuban/UI/identifyview.py,          Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
1929          Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py, Thuban/UI/menu.py,          Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
1930          Thuban/UI/proj4dialog.py, Thuban/UI/renderer.py, Thuban/UI/tree.py,          Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
1931          Thuban/Lib/connector.py, Thuban/Lib/fileutil.py:          Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
1932          Replace user string by _() for i18n.          Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
1933    
1934  2003-01-27  Jonathan Coles  <[email protected]>  2003-01-27  Jonathan Coles  <[email protected]>
1935    
1936    * Thuban/Model/layer.py: Classification initialization calls.          * Thuban/Model/layer.py: Classification initialization calls.
1937    
1938    * Thuban/Model/classification.py: Created class to encapsulate          * Thuban/Model/classification.py: Created class to encapsulate
1939    a layer classification. Supports specific data points and          a layer classification. Supports specific data points and
1940    ranges.          ranges.
1941    
1942    * Thuban/Model/load.py: Added support for loading classification          * Thuban/Model/load.py: Added support for loading classification
1943    information.          information.
1944    
1945    * Thuban/Model/save.py: Added support for saving classification          * Thuban/Model/save.py: Added support for saving classification
1946    information.          information.
1947    
1948    * Thuban/UI/classifier.py: Initial class for a dialog box for          * Thuban/UI/classifier.py: Initial class for a dialog box for
1949    specifying classification information.          specifying classification information.
1950    
1951    * Thuban/UI/mainwindows.py: Support for opening the classifier          * Thuban/UI/mainwindows.py: Support for opening the classifier
1952    dialog.          dialog.
1953    
1954    * Thuban/UI/renderer.py: Support for drawing a layer with the          * Thuban/UI/renderer.py: Support for drawing a layer with the
1955    classification information.          classification information.
1956    
1957    * Data/iceland_sample_class.thuban: iceland_sample with          * Data/iceland_sample_class.thuban: iceland_sample with
1958    classification data.          classification data.
1959    
1960    * test/test_classification: Tests for the Classification class.          * test/test_classification: Tests for the Classification class.
1961    
1962  2002-12-09  Bernhard Herzog  <[email protected]>  2002-12-09  Bernhard Herzog  <[email protected]>
1963    
# Line 145  Line 1993 
1993          * Thuban/UI/mainwindow.py: Altered the order of tools in the          * Thuban/UI/mainwindow.py: Altered the order of tools in the
1994          toolbar: First now are all navigation tools (Zoom In/Out, Pan,          toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1995          Full Extent).          Full Extent).
1996        
1997  2002-10-23  Bernhard Herzog  <[email protected]>  2002-10-23  Bernhard Herzog  <[email protected]>
1998    
1999          * setup.py (setup call): version now 0.1.3          * setup.py (setup call): version now 0.1.3
# Line 256  Line 2104 
2104          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
2105          VIEW_POSITION          VIEW_POSITION
2106    
2107  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
2108    
2109          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
2110    
# Line 343  Line 2191 
2191    
2192          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
2193          records.          records.
2194          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
2195    
2196          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
2197          into the underlying table.          into the underlying table.
# Line 381  Line 2229 
2229          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
2230          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
2231    
2232  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
2233    
2234          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
2235          tree window already open          tree window already open
# Line 509  Line 2357 
2357          * 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
2358          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
2359          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
2360          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
2361          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
2362    
2363          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 570  Line 2418 
2418          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
2419          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
2420          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
2421          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
2422          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
2423    
2424  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 651  Line 2499 
2499          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
2500          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
2501    
2502  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
2503    
2504          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
2505          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 880  Line 2728 
2728          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
2729          position in the statusbar          position in the statusbar
2730    
2731  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
2732    
2733          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2734    
2735  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
2736            
2737          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
2738    
2739          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
2740    
2741          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
2742    
2743            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
2744            box
2745    
2746  2002-04-21      Jan-Oliver Wagner <[email protected]>  2002-04-21  Jan-Oliver Wagner <[email protected]>
2747    
2748          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
2749    
2750          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
2751    
2752          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
2753          icon; added map_full_extend as tool          icon; added map_full_extend as tool
2754    
2755  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
2756    
2757          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
2758          saving _new_ sessions          saving _new_ sessions
# Line 1005  Line 2854 
2854    
2855          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
2856          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
2857    
2858  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
2859    
2860          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
2861          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
2862    
2863          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
2864          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
2865          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
2866          too.          too.
# Line 1122  Line 2970 
2970          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
2971          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
2972    
2973          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
2974          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
2975          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
2976          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
2977          the application's OnInit method          the application's OnInit method
# Line 1139  Line 2987 
2987          layer to the tableview dialog.          layer to the tableview dialog.
2988    
2989          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
2990          (TableGrid):          (TableGrid):
2991          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
2992          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
2993          (TableFrame.__init__):          (TableFrame.__init__):
# Line 1206  Line 3054 
3054  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
3055    
3056          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
3057            
3058          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
3059          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
3060            
3061          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
3062          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
3063          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 1256  Line 3104 
3104          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
3105          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
3106          link_file method          link_file method
3107            
3108          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
3109          the window when the first layer is added to the map.          the window when the first layer is added to the map.
3110    
# Line 1293  Line 3141 
3141          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
3142          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
3143          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
3144            
3145          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
3146          installer          installer
3147    

Legend:
Removed from v.399  
changed lines
  Added in v.833

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26