/[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 269 by bh, Thu Aug 22 10:25:55 2002 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]>
1850    
1851            * Thuban/Model/classification.py: Added import line to fix
1852            feature conflicts between running on python2.2 and python2.1.
1853    
1854            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
1855            onto the clinfo parameter, so removed the deepcopy().
1856    
1857    2003-02-10  Jonathan Coles  <[email protected]>
1858    
1859            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
1860            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
1862            /> instead of </tag_name>. Use the GetDefault*() methods of
1863            the Classification class.
1864    
1865            * Thuban/Model/classification.py (Classificaton): Added set and
1866            get methods for the default data. The class also takes a layer
1867            reference so that modification messages can be sent. Fixed the
1868            methods to use the new ClassData class.
1869            (ClassData): New class to encapsulate the classification data
1870    
1871            * Thuban/Model/layer.py (Layer): Remove the
1872            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
1873            SetDefault*() methods on the layer's classification object.
1874            (Layer.__init__): Use the new SetDefault*() methods in the
1875            Classification class.
1876    
1877            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
1878            object instead of a dictionary.
1879    
1880            * Thuban/UI/classifier.py (ClassRenderer): New class to
1881            draw the classifications in the dialog box's table.
1882            (Classifier): Modified to use the ClassRenderer class.
1883    
1884            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
1885            methods of the Classification class.
1886    
1887            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
1888            of the ClassData class.
1889    
1890            * test/test_classification.py, test/test_layer.py,
1891            test/test_map.py, test/test_session.py: Fix the tests to work
1892            with the above code changes.
1893    
1894    2003-02-03  Jonathan Coles  <[email protected]>
1895    
1896            * Thuban/Model/classification.py (Classification): Added getNull()
1897            to return the NullData reference
1898    
1899            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
1900            Layer.SetStrokeWidth): Modified these functions to change the
1901            null data in the classification rather than keep these values
1902            directly in the Layer class. Menu options to change these values
1903            work again.
1904    
1905    2003-01-28  Jonathan Coles  <[email protected]>
1906    
1907            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
1908            Fixed crashing problem on some systems. Dialog box shows
1909            classification data.
1910    
1911            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
1912            Colors in the tree view.
1913    
1914            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
1915            the tree info for classifications. Commented out unnecessary lines.
1916    
1917            * Thuban/Model/classification.py (Classification.TreeInfo): New
1918            function to add information about the classification into the
1919            tree view.
1920    
1921    2003-01-27  Jan-Oliver Wagner <[email protected]>
1922    
1923            * Thuban/__init__.py (_): New.
1924    
1925            * Thuban/Model/classification.py, Thuban/Model/extension.py,
1926            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
1927            Thuban/Model/session.py, Thuban/UI/application.py,
1928            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
1929            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
1930            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
1931            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
1932            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
1933    
1934    2003-01-27  Jonathan Coles  <[email protected]>
1935    
1936            * Thuban/Model/layer.py: Classification initialization calls.
1937    
1938            * Thuban/Model/classification.py: Created class to encapsulate
1939            a layer classification. Supports specific data points and
1940            ranges.
1941    
1942            * Thuban/Model/load.py: Added support for loading classification
1943            information.
1944    
1945            * Thuban/Model/save.py: Added support for saving classification
1946            information.
1947    
1948            * Thuban/UI/classifier.py: Initial class for a dialog box for
1949            specifying classification information.
1950    
1951            * Thuban/UI/mainwindows.py: Support for opening the classifier
1952            dialog.
1953    
1954            * Thuban/UI/renderer.py: Support for drawing a layer with the
1955            classification information.
1956    
1957            * Data/iceland_sample_class.thuban: iceland_sample with
1958            classification data.
1959    
1960            * test/test_classification: Tests for the Classification class.
1961    
1962    2002-12-09  Bernhard Herzog  <[email protected]>
1963    
1964            * test/test_command.py: New. Tests for the command classes.
1965    
1966            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
1967            (Command.IsTool): New method to distinguish between command
1968            switching tools and other commands.
1969    
1970            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
1971            the tool to avoid direct assignments to instance variables
1972            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
1973            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
1974            change the tool
1975    
1976            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
1977            active tool's command turns insensitive, disable the tool.
1978            (_tool_command): Use the new ToolCommand class
1979    
1980            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
1981            SelectTool method to change the tool
1982            (iconfile): Use the ToolCommand class
1983    
1984    2002-12-03  Bernhard Herzog  <[email protected]>
1985    
1986            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
1987            the case of selected items that are not children of Layers or Maps
1988            properly. Previously this bug would trigger an assertion in
1989            wxWindows.
1990    
1991    2002-11-06  Frank Koormann  <[email protected]>
1992    
1993            * Thuban/UI/mainwindow.py: Altered the order of tools in the
1994            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1995            Full Extent).
1996    
1997    2002-10-23  Bernhard Herzog  <[email protected]>
1998    
1999            * setup.py (setup call): version now 0.1.3
2000    
2001            * MANIFEST.in: Add the files in test/
2002    
2003            * test/README: Add note about tests requiring the iceland data
2004    
2005            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
2006            copyright notice.
2007    
2008    2002-10-18  Bernhard Herzog  <[email protected]>
2009    
2010            * test/test_map.py
2011            (TestMapWithContents.test_projected_bounding_box): Use an explicit
2012            epsilon.
2013    
2014            * test/support.py (FloatComparisonMixin.assertFloatEqual)
2015            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
2016            message if the assertion fails and don't return the return value
2017            of self.assert_. In assertFloatSeqEqual the return meant that not
2018            all items of the sequence were compared.
2019    
2020    2002-09-20  Bernhard Herzog  <[email protected]>
2021    
2022            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
2023    
2024            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
2025    
2026            * test/test_map.py (TestMapWithContents.test_tree_info): Create
2027            the string with the bounding box on the fly because of platform
2028            differences in the way %g is handled.
2029    
2030            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
2031            DBFfile too because Thuban layers can't yet cope missing DBF
2032            files.
2033    
2034    2002-09-20  Bernhard Herzog  <[email protected]>
2035    
2036            * test/test_menu.py: Use initthuban instead of
2037            add_thuban_dir_to_path to initialize Thuban.
2038    
2039            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
2040            Mixin class for float comparisons
2041            (SubscriberMixin): New. Mixin class to test messages sent through
2042            the Connector class
2043    
2044            * test/README: Fix a typo and add the -v flag to the command for
2045            individual tests
2046    
2047            * test/test_session.py: New. Test cases for Thuban.Model.session
2048    
2049            * test/test_proj.py: New. Test cases for Thuban.Model.proj
2050    
2051            * test/test_map.py: New. Test cases for Thuban.Model.map
2052    
2053            * test/test_layer.py: New. Test cases for Thuban.Model.layer
2054    
2055            * test/test_label.py: New. Test cases for Thuban.Model.label
2056    
2057            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
2058    
2059            * test/test_color.py: New. Test cases for Thuban.Model.color
2060    
2061            * test/test_base.py: New. Test cases for Thuban.Model.base
2062    
2063    2002-09-13  Bernhard Herzog  <[email protected]>
2064    
2065            * Thuban/Model/session.py (Session.forwarded_channels): Forward
2066            the CHANGED channel too.
2067    
2068            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
2069            CHANGED channel too.
2070            (Map.__init__): Call the Modifiable constructor as well.
2071    
2072            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
2073            event if the modified flag changes.
2074            (Modifiable.changed): Tweak the doc-string.
2075    
2076            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
2077            (MainWindow.set_position_text): Put the code that puts the text
2078            with the mouse position into the status bar into the new method
2079            set_position_text so that it can overwritten in derived classes.
2080    
2081    2002-09-12  Bernhard Herzog  <[email protected]>
2082    
2083            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
2084            message box on the main window.
2085    
2086    2002-09-11  Bernhard Herzog  <[email protected]>
2087    
2088            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
2089            the 'E' because it's less likely to interfere with other menu
2090            entries.
2091            (MainWindow.build_menu): remove an incorrect comment.
2092    
2093    2002-09-10  Bernhard Herzog  <[email protected]>
2094    
2095            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
2096            (_tool_command): Add sensitive parameter
2097            (_has_visible_map): Sensitivity callback to tools and other
2098            commands that require a visible map. Use it in map_zoom_in_tool,
2099            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
2100            and map_full_extent
2101    
2102    2002-09-06  Bernhard Herzog  <[email protected]>
2103    
2104            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
2105            VIEW_POSITION
2106    
2107    2002-09-04  Frank Koormann  <[email protected]>
2108    
2109            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
2110    
2111    2002-09-02  Bernhard Herzog  <[email protected]>
2112    
2113            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
2114            wxWindows already and our implementation doesn't work correctly
2115            with wxGTK 2.3:
2116            (MapCanvas.__init__): Remove the instance variable
2117            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
2118            be drawin
2119            (MapCanvas.OnIdle): Removed.
2120    
2121            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
2122            a parameter to determine the size of the rectangle.
2123            (MapCanvas.find_shape_at): Create the box around the point on a
2124            layer by layer basis and make the size depend on the shape type.
2125            This solves a problem with the selection of point shapes at the
2126            border of the layer's bounding box
2127    
2128    2002-08-30  Bernhard Herzog  <[email protected]>
2129    
2130            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
2131            for the sensitivity  of remove layer.
2132            (_can_remove_layer): New. Sensitivity callback for remove layer
2133            (Command layer_remove): Use _can_remove_layer
2134    
2135            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
2136            determine whether a given layer can be deleted.
2137    
2138            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
2139            (MapCanvas.do_redraw): Get rid of the unused update_region
2140            instance variable
2141    
2142            * Thuban/UI/view.py: Add/update some doc-strings.
2143    
2144            * test/: new subdirectory with a bunch of unit tests.
2145    
2146            * test/README, test/test_table.py, test/test_save.py,
2147            test/test_menu.py, test/test_load.py: Initial set of tests and
2148            brief instructions on how to run them
2149    
2150    2002-08-29  Bernhard Herzog  <[email protected]>
2151    
2152            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
2153            arcs with multiple parts.
2154    
2155            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
2156            Handle degenrate rectangles.
2157    
2158            * Thuban/Model/table.py: Make writing records work correctly:
2159            (Table.__init__): Keep track of whether the DBF is open for
2160            writing
2161            (Table.write_record): Open the DBF file for writing when necessary
2162    
2163    2002-08-27  Bernhard Herzog  <[email protected]>
2164    
2165            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
2166            dbf files only for reading by default. Use a new writable dbf
2167            object for writing.
2168    
2169    2002-08-26  Bernhard Herzog  <[email protected]>
2170    
2171            * Thuban/UI/mainwindow.py: Refactor the context creation:
2172            (MainWindow.Context): New method to return a context
2173            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
2174            new method
2175    
2176            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
2177            layer table specific code from TableGrid into LayerTableGrid
2178            (TableFrame, LayerTableFrame): Split the layer table specific code
2179            from TableFrame into LayerTableFrame
2180            (LayerTableGrid.select_shape): Remove a debug print
2181    
2182            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
2183            LayerTableFrame
2184    
2185    2002-08-23  Bernhard Herzog  <[email protected]>
2186    
2187            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
2188            absolute filename.
2189    
2190  2002-08-22  Bernhard Herzog  <[email protected]>  2002-08-22  Bernhard Herzog  <[email protected]>
2191    
2192            * Thuban/Model/table.py (Table.write_record): New method to write
2193            records.
2194            (Table.__init__): Open the DBF file for writing too.
2195    
2196            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
2197            into the underlying table.
2198    
2199            * extensions/shapelib/shapefil.h (DBFCommit),
2200            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
2201            commit any changes made to the DBF file.
2202    
2203            * Thuban/UI/mainwindow.py (make_check_current_tool)
2204            (_tool_command): Put the code that generates the "checked"
2205            callback into a separate function so that we can reuse it
2206            elsewhere
2207    
2208          * Thuban/Model/save.py (Saver): New class to handle serializing a          * Thuban/Model/save.py (Saver): New class to handle serializing a
2209          session into an XML file. The main reason to introduce a class is          session into an XML file. The main reason to introduce a class is
2210          that applications built on Thuban can derive from it so that they          that applications built on Thuban can derive from it so that they
# Line 24  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 152  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 213  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 294  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 523  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 648  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 765  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 782  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 849  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 899  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 936  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.269  
changed lines
  Added in v.833

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26