/[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 581 by jonathan, Tue Apr 1 10:20:17 2003 UTC revision 870 by frank, Thu May 8 14:06:32 2003 UTC
# Line 1  Line 1 
1    2003-05-08  Frank Koormann <[email protected]>
2    
3            Coding style updates
4    
5            * test/test_scalebar.py: Replaced tab indentation by spaces.
6    
7            * Thuban/UI/scalebar.py: Explicit imports.
8    
9    2003-05-08  Frank Koormann <[email protected]>
10    
11            * Thuban/UI/scalebar.py
12            (ScaleBar.DrawScalebar): Format string bug fixed.
13    
14    2003-05-08  Frank Koormann <[email protected]>
15    
16            Reorganization of scalebar component (no wx in Thuban/Model)
17    
18            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
19            (deriveInterval):
20            Calculate scalebar interval and unit which fits in width for scale.
21            (roundInterval): Round float.
22    
23            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
24    
25            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
26    
27            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
28    
29    2003-05-08  Frank Koormann <[email protected]>
30    
31            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
32            Initialize ScaleBar with canvas.map
33    
34            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
35            round intervals to display smarter lengths
36            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
37            layer. If the maps has no projection applied grey the scalebar.
38    
39    2003-05-07  Frank Koormann <[email protected]>
40            
41            Basic Scalebar features added.
42    
43            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
44    
45            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
46            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
47            and the renderer.
48    
49            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
50    
51            * Thuban/UI/messages.py: SCALE_CHANGED added.
52    
53    2003-05-07  Bernhard Herzog  <[email protected]>
54    
55            * Thuban/Model/session.py (Session.__init__): New instance
56            variable shapestores to hold a list of all open shapestore objects
57            (Session.ShapeStores): New. Accessor method for the shapestores
58            list.
59            (Session._add_shapestore, Session._clean_weak_store_refs): New.
60            Internal methods to maintain the shapestores list.
61            (Session.Tables): New. Return all tables open in the session.
62            (Session.OpenShapefile): Insert the new ShapeStore into the
63            shapestores list.
64    
65            * test/test_session.py (TestSessionSimple.test_initial_state): Add
66            tests for ShapeStores and Tables
67            (TestSessionWithContent.test_shape_stores)
68            (TestSessionWithContent.test_tables): New. Test cases for
69            ShapeStores and Tables
70    
71    2003-05-07  Bernhard Herzog  <[email protected]>
72    
73            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
74            Add comments about the optimizations used.
75            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
76            Implement the ReadValue table interface method.
77    
78            * test/test_transientdb.py
79            (TestTransientTable.run_iceland_political_tests)
80            (TestTransientTable.test_transient_joined_table): Add tests for
81            ReadValue
82    
83    2003-05-07  Frank Koormann <[email protected]>
84    
85            * Resources/Bitmaps/fulllayerextent.xpm,
86            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
87            new icons.
88    
89    2003-05-06  Bernhard Herzog  <[email protected]>
90    
91            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
92            New. Simply delegate to the transient table's version.
93    
94            * test/test_transientdb.py
95            (TestTransientTable.test_auto_transient_table_query): New. Test
96            case for AutoTransientTable's SimpleQuery
97    
98    2003-05-06  Bernhard Herzog  <[email protected]>
99    
100            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
101            Implement a simple query method for the query dialog
102            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
103            the row index or shapeid.
104            (TransientTable.create): Insert the right value of the row index
105            (TransientJoinedTable.create): Copy the row index of the left
106            table to the joined result table
107    
108            * test/test_transientdb.py
109            (TestTransientTable.test_transient_table_read_twice): Fix
110            doc-string
111            (TestTransientTable.test_transient_table_query): New. Test for the
112            SimpleQuery method
113    
114    2003-05-06  Bernhard Herzog  <[email protected]>
115    
116            Convert all table users to use the new table interface. This only
117            covers Thuban itself, not GREAT-ER or other applications built on
118            Thuban yet, so the compatibility interface stays in place for the
119            time being but it now issues DeprecationWarnings.
120    
121            Finally, the new Table interface has a new method, HasColumn.
122    
123            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
124            issue deprecation warnings when they're. The warnings refer to the
125            caller of the method.
126            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
127            for the deprecation warnings
128    
129            * test/test_table.py: Ignore the deprecation warnings for the old
130            table in the tests in this module. The purpose of the tests is to
131            test the old interface, after all.
132    
133            * test/test_transientdb.py
134            (TestTransientTable.run_iceland_political_tests): Use the
135            constants for the types. Add a test for HasColumn
136            (TestTransientTable.test_transient_joined_table): Adapt to new
137            table interface. Add a test for HasColumn
138            (TestTransientTable.test_transient_table_read_twice): Adapt to new
139            table interface
140    
141            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
142            Adapt to new table interface
143    
144            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
145            new table interface
146    
147            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
148            (RecordTable.SetTable): Adapt to new table interface
149    
150            * Thuban/UI/classifier.py (Classifier.__init__)
151            (Classifier.__init__): Adapt to new table interface
152    
153            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
154            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
155            to new table interface
156    
157            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
158            (AutoTransientTable.HasColumn): Implement the new table interface
159            method
160            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
161            (AutoTransientTable.UniqueValues): Adapt to new table interface
162    
163            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
164            Adapt to new table interface
165    
166            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
167            simplify opening shapefiles a bit easier.
168            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
169            (TestLayer.test_point_layer): Use the new helper method
170            (TestLayer.test_get_field_type): New. Test for the GetFieldType
171            method
172    
173            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
174            the new table method
175    
176            * test/test_memory_table.py (TestMemoryTable.test_has_column):
177            Test for the new table method HasColumn
178    
179    2003-05-06  Jonathan Coles   <[email protected]>
180    
181            Addresses the "Selection Extent" wish of RTbug #1787.
182    
183            * Resources/Bitmaps/fulllayerextent.xpm,
184            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
185            extent. These are just place holders for the real bitmaps.
186    
187            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
188            calculate the bounding box once (the first time compute_bbox() is
189            called).
190            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
191            the bounding box for the shapes in lat/long coordinates.
192    
193            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
194            option.
195            (MainWindow.has_selected_shapes): New. Returns true if there are
196            any selected shapes.
197            (MainWindow.FullSelectionExtent): New. Calls
198            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
199            (_has_selected_shapes): New. Returns true if there are any
200            selected shapes.
201    
202            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
203            true if there are any selected shapes.
204    
205            * Thuban/UI/view.py (MapCanvas): Added delegated method
206            HasSelectedShapes.
207            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
208            shapes on the canvas using the map projection (if any).
209    
210            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
211            for Layer.ShapesBoundingBox().
212    
213    2003-05-06  Bernhard Herzog  <[email protected]>
214    
215            * Resources/Projections/defaults.proj: Fix spelling of Mercator
216    
217    2003-05-05  Jonathan Coles   <[email protected]>
218    
219            Addresses the "Full Layer Extent" wish of RTbug #1787.
220    
221            * Resources/Projections/defaults.proj: Added UK National Grid.
222    
223            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
224            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
225            when the user selects the menu option.
226    
227            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
228            scales the given layer on the canvas using the map projection.
229    
230    2003-05-05  Bernhard Herzog  <[email protected]>
231    
232            Convert the table implementations to a new table interface. All
233            tables use a common mixin class to provide backwards compatibility
234            until all table users have been updated.
235    
236            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
237            provide backwards compatibility for table classes implementing the
238            new interface
239            (DBFTable, MemoryTable): Implement the new table interface. Use
240            OldTableInterfaceMixin as base for compatibility
241            (DBFColumn, MemoryColumn): New. Column description for DBFTable
242            and MemoryTable resp.
243    
244            * test/test_dbf_table.py: New. Test cases for the DBFTable with
245            the new table interface.
246    
247            * test/test_memory_table.py: New. Test cases for the MemoryTable
248            with the new table interface.
249    
250            * test/test_table.py: Document the all tests in this file as only
251            for backwards compatibility. The equivalent tests for the new
252            interface are in test_memory_table.py and test_dbf_table.py
253            (MemoryTableTest.test_read): field_info should be returning tuples
254            with four items
255            (MemoryTableTest.test_write): Make doc-string a more precise.
256    
257            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
258            table interface. Derive from from OldTableInterfaceMixin for
259            compatibility.
260            (TransientTableBase.create): New intance variable column_map to
261            map from names and indices to column objects
262            (TransientTable.create): Use the new table interface of the input
263            table
264            (AutoTransientTable): Convert to new table interface. Derive from
265            from OldTableInterfaceMixin for compatibility.
266            (AutoTransientTable.write_record): Removed. It's not implemented
267            yet and we still have to decide how to handle writing with the new
268            table and data framework.
269    
270            * test/test_transientdb.py
271            (TestTransientTable.run_iceland_political_tests)
272            (TestTransientTable.test_transient_joined_table): Use the new
273            table interface
274    
275    2003-05-05  Jonathan Coles   <[email protected]>
276    
277            This is namely a collection of UI updates to improve user interactivity.
278            Tabbing between controls now exists and you can use ESC to close dialog
279            boxes; ENTER will active the default button.
280    
281            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
282            order that the controls are created so that tabbing works correctly.
283            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
284            wxDialog can handle the default button correctly.
285            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
286            same reasons as for OnOK.
287            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
288            when we ask the table for the maximum/minimum values of a field
289            which could take a very long time.
290    
291            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
292            order that the controls are created so that tabbing works correctly.
293            (SelectPropertiesDialog.__init__): Rearrange the order that the
294            controls are created so that tabbing works correctly.
295    
296            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
297            to derive from a wxDialog but behave like the original implementation
298            which was derived from a wxFrame. wxDialog provides useful key
299            handling functionality like ESC calling OnCancel and ENTER calling
300            OnOK which is lost with wxFrame.
301    
302            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
303            new dialogs.
304    
305            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
306            order that the controls are created so that tabbing works correctly.
307            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
308            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
309            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
310            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
311            can provide the "UK National Grid" as a default projection.
312            (UTMPanel.__init__): Rearrange the order that the controls are
313            created so that tabbing works correctly.
314    
315    2003-05-05  Bernhard Herzog  <[email protected]>
316    
317            * extensions/thuban/wxproj.cpp: Fix some of the comments.
318            (project_point): If a map projection but no layer projection is
319            given, convert degrees to radians before applying the map
320            projection.
321    
322            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
323            (TableGrid.allow_messages): New methods to make it possible to
324            inhibit message sending.
325            (TableGrid.issue): Only send the message if not inhibited.
326            (LayerTableGrid.select_shape): Use the new methods to make sure
327            that no ROW_SELECTED message is sent while we're updating the
328            selected rows to match the selected shapes.
329    
330    2003-05-02  Jan-Oliver Wagner <[email protected]>
331    
332            Implementation of MemoryTable.
333    
334            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
335            implementation that operates on a list of tuples. All of the data
336            are kept in the memory.
337    
338            * test/test_table.py (MemoryTableTest): New.
339    
340            * test/test_transientdb.py (SimpleTable): Removed.
341            (TestTransientTable.test_transient_joined_table,
342            (TestTransientTable.test_transient_table_read_twice): Replaced
343            SimpleTable by MemoryTable.
344    
345    2003-04-30  Jonathan Coles   <[email protected]>
346    
347            * Data/iceland_sample.thuban: Now contains correct projections
348            for each of the layers.
349    
350            * Resources/Projections/defaults.proj: Geographic projection
351            contains unit conversion parameter.
352    
353    2003-04-30  Jonathan Coles   <[email protected]>
354    
355            The most important part of this putback is the projection changes.
356            It should now be possible to specify the projection that a layer
357            is in and then specify a different projection for the map. The
358            projection dialog has an extra parameter for a geographic projection
359            which lets the user select if the input is in degrees or radians.
360    
361            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
362            to say that the parameter is a tuple of unprojected
363            points (which is what the callers to this method were assuming).
364            Also, since the points are unprojected we need to projected them.
365    
366            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
367            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
368            groups are selected, move the layer up/down. Fixes RTbug #1833.
369    
370            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
371    
372            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
373            parameter in call to SetClientData.
374            (GeoPanel): Add support for selecting the units that the
375            source data is in (Radians or Degrees).
376    
377            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
378            the rendering loop by reducing the number of if's, removing the
379            unnecessary try/except block, and checking if the old group
380            is the same as the new one (which happens a lot if there is
381            no classification, or lots of shapes are in the same group).
382    
383            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
384            around the redraw routine to try to catch problems that the user
385            may create by selecting invalid projections for the data set and
386            map. Clears the display if there are any problems and prints the
387            error.
388            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
389            rectangle.
390    
391            * extensions/thuban/wxproj.cpp (project_point): First invert the
392            supplied point (which should be in projected coordinates) using
393            the layer's projection and then project the point using the
394            map's projection.
395            (project_points): Use project_point() to project each point.
396    
397    2003-04-30  Jan-Oliver Wagner <[email protected]>
398    
399            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
400            don't set the Classification to None if the classfication field
401            is None (ie only a DEFAULT).
402    
403    2003-04-30  Bernhard Herzog  <[email protected]>
404    
405            * Thuban/UI/view.py: Fix some typos.
406    
407            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
408            not pop up the dialog if the selection becomes empty (this could
409            happen if e.g. a new selection is opened while the identify tool
410            is active and dialog had been closed)
411    
412    2003-04-30  Bernhard Herzog  <[email protected]>
413    
414            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
415            instance variable read_record_last_result
416            (TransientTableBase.read_record): Make sure reading the same
417            record twice works. The implementation uses the new instance
418            variable read_record_last_result
419    
420            * test/test_transientdb.py
421            (TestTransientTable.test_transient_table_read_twice): New test
422            case for the above bug-fix.
423    
424    2003-04-29  Jonathan Coles   <[email protected]>
425    
426            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
427    
428            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
429    
430            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
431            (ClassTable.SetValueAsCustom): Rename keyword argument in
432            ClassGroup* constructors to match argument name.
433    
434    2003-04-29  Bernhard Herzog  <[email protected]>
435    
436            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
437            transient DB if it exists to make sure it doesn't leave a journal
438            file in the temp directory.
439    
440            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
441            self.conn to None after closing the connection to make sure it's
442            not closed twice
443    
444    2003-04-29  Jonathan Coles   <[email protected]>
445    
446            Add a visible parameter in the layer XML tag. The default value is
447            "true". If anything other than "false" is specified we also assume
448            "true". Addresses RTbug #1025.
449    
450            * Doc/thuban.dtd: Add visible parameter to a layer.
451    
452            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
453            of visible from 1 to True.
454            (Layer.__init__): Change default value of visible from 1 to True.
455    
456            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
457            parameter.
458    
459            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
460            parameter.
461    
462            * test/test_load.py: Add new test data contents_test_visible.
463            (LoadSessionTest.setUp): save test data.
464            (LoadSessionTest.testLayerVisibility): Test if the visible flag
465            is loaded correctly.
466    
467            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
468            for saving an invisible layer.
469    
470    2003-04-29  Jonathan Coles   <[email protected]>
471    
472            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
473            legend dialog box and tell it to change its map to the one
474            supplied to SetMap(). Fixes RTbug #1770.
475    
476    2003-04-29  Bernhard Herzog  <[email protected]>
477    
478            Next step of table implementation. Introduce a transient database
479            using SQLite that some of the data is copied to on demand. This
480            allows us to do joins and other operations that require an index
481            for good performance with reasonable efficiency. Thuban now needs
482            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
483            haven't tested that.
484            
485            * Thuban/Model/transientdb.py: New. Transient database
486            implementation.
487    
488            * test/test_transientdb.py: New. Tests for the transient DB
489            classes.
490    
491            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
492            classes to help automatically remove temporary files and
493            directories.
494            (Session.__init__): New instance variables temp_dir for the
495            temporary directory and transient_db for the SQLite database
496            (Session.temp_directory): New. Create a temporary directory if not
497            yet done and return its name. Use AutoRemoveDir to have it
498            automatically deleted
499            (Session.TransientDB): Instantiate the transient database if not
500            done yet and return it.
501    
502            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
503            AutoTransientTable so that data is copied to the transient DB on
504            demand.
505            (SimpleStore): New class that simply combines a table and a
506            shapefile
507    
508            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
509            DBFTable and update its doc-string to reflect the fact that this
510            is only the table interface to a DBF file. Table is now an alias
511            for DBFTable for temporary backwards compatibility.
512    
513            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
514            the last reference to the session goes away so that the temporary
515            files are removed properly.
516    
517            * test/test_load.py (LoadSessionTest.tearDown): Remove the
518            reference to the session to make sure the temporary files are
519            removed.
520    
521    2003-04-29  Bernhard Herzog  <[email protected]>
522    
523            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
524            the __parser instance variable into a normal local variable in
525            read. It's only used there and read will never be called more than
526            once. Plus it introduces a reference cycle that keeps can keep the
527            session object alive for a long time.
528    
529    2003-04-29  Jonathan Coles   <[email protected]>
530    
531            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
532            Projection an immutable item. Fixes RTbug #1825.
533            (Projection.__init__): Initialize instance variables here.
534            (ProjFile.Replace): New. Replace the given projection object with
535            the new projection object. This solves the problem of needing the
536            mutator Projection.SetProjection() in the ProjFrame class and
537            allows a projection to change parameters without changing its
538            location in the file.
539    
540            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
541            be of type wxSAVE and should verify overwriting a file.
542    
543            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
544            ProjFile.Replace() method instead of the mutator
545            Projection.SetProjection(). Also requires that we reassign the
546            client data to the new projection.
547    
548            * test/test_proj.py (TestProjection.test): Test GetName() and
549            GetAllParameters()
550            (TestProjFile.test): Remove tests for Set*() methods. Add tests
551            for Replace().
552    
553    2003-04-25  Jonathan Coles   <[email protected]>
554    
555            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
556            to save the name of the projection.
557    
558            * test/test_save.py (SaveSessionTest.testLayerProjection): New
559            test to verify layer projections are saved correctly.
560    
561    2003-04-25  Jonathan Coles   <[email protected]>
562    
563            * Thuban/Model/proj.py (Projection.SetName): Set the name
564            to "Unknown" if name is None.
565            (Projection.SetAllParameters): New. Set the projection's
566            parameter list to the one supplied.
567            (Projection.SetProjection): New. Set the projection's
568            properties to those of the supplied Projection.
569    
570            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
571            the dialog title to include the map's title.
572            (MainWindow.LayerProjection): Set the dialog title to include
573            the layer's title.
574    
575            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
576            error dialogs into a single method call.
577            (ProjFrame.__VerifyButtons): Add more states to check.
578            (ProjFrame.__GetProjection): Return the current state of an
579            edited projection or None.
580            (ProjFrame.__FillAvailList): Remove checks for states that
581            shouldn't exist.
582            (ProjFrame._OnNew): Clear all selected items and supply
583            a projection panel if necessary.
584    
585            * test/test_proj.py (TestProjFile.test): Add tests for
586            ProjFile.SetAllParameters, ProjFile.SetProjection,
587            ProjFile.SetName.
588    
589    2003-04-25  Jonathan Coles   <[email protected]>
590    
591            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
592            takes an optional argument to select the current projection.
593            This does not guarantee that the item is visible due to
594            limited wxWindows functionality. Fixes RTBug #1821.
595    
596    2003-04-25  Jonathan Coles   <[email protected]>
597    
598            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
599            the projection name and use it when constructing the Projection
600            object.
601    
602            * Thuban/Model/proj.py (Projection.__init__): Change the default
603            value for 'name' to None and then test if name is equal to None
604            in the body of the constructor. This way the caller doesn't have to
605            know what the default value should be. Namely, useful in load.py
606            where we have to pick a default value if the 'name' parameter
607            doesn't exist in the XML file.
608    
609            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
610            Tests a file where a layer has a projection.
611    
612    2003-04-25  Jonathan Coles   <[email protected]>
613    
614            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
615            tree for projection information.
616    
617            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
618            XMLReader.GetFileName.
619            (SessionLoader): Added support for loading projection tags that
620            appear inside a layer.
621    
622            * Thuban/Model/proj.py (ProjFile): Document the class. Move
623            back to using a list because the order of the projections in
624            the file is important to maintain. Fixes RTbug #1817.
625    
626            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
627            to ProjFile.GetFilename.
628    
629            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
630            information.
631    
632            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
633            ProjFrame._OnSaveAs. Removed old dead code from previous
634            implementation.
635            (ProjFrame._OnExport): Add support for exporting more than one
636            projection to a single file.
637            (ProjFrame.__FillAvailList): use string formatting (% operator)
638            to build strings that are (partly) translated. Fixes RTbug #1818.
639    
640            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
641            class.
642    
643    2003-04-24  Bernhard Herzog  <[email protected]>
644    
645            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
646    
647            * po/fr.po: New. French translation by Daniel Calvelo Aros
648    
649            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
650            empty strings.
651    
652    2003-04-24  Jonathan Coles   <[email protected]>
653    
654            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
655            implement the interface that the ProjFrame dialog expects.
656    
657            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
658            name of the projection to be changed.
659            (ProjFile): Use a dictionary instead of a list so that removing
660            projections is easier and we are sure about uniqueness.
661            (ProjFile.Remove): Remove the given projection object.
662    
663            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
664            Return a list with only one projection file instead of searching for
665            any projection file. This simplifies many things if the user can
666            only have one system file and one user file.
667    
668            * Thuban/UI/classgen.py: Change all references to
669            genCombo to genChoice.
670    
671            * Thuban/UI/mainwindow.py: Add a Projection option under the
672            layer menu.
673            (MainWindow.LayerProjection): New. Open up a projection window
674            for a layer.
675    
676            * Thuban/UI/projdialog.py: Large changes to how the dialog is
677            laid out. Use three panels instead of one. One for the list of
678            projections, one for the edit controls, and one for the buttons.
679            Fixed resizing problems so that the dialog resizes correctly
680            when the projection panel changes. Added import/export, save, and
681            new buttons/functionality.
682    
683    2003-04-24  Bernhard Herzog  <[email protected]>
684    
685            First step towards table management. Introduce a simple data
686            abstraction so that we replace the data a layer uses more easily
687            in the next step.
688    
689            * Thuban/Model/data.py: New file with a simple data abstraction
690            that bundles shapefile and dbffile into one object.
691    
692            * Thuban/Model/session.py (Session.OpenShapefile): New method to
693            open shapefiles and return a shape store object
694    
695            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
696            object instead of a shapefile filename. This introduces a new
697            instance variable store holding the datastore. For intermediate
698            backwards compatibility keep the old instance variables.
699            (open_shapefile): Removed. No longer needed with the shape store.
700            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
701            get the shape store used by a layer.
702            (Layer.Destroy): No need to explicitly destroy the shapefile or
703            table anymore.
704    
705            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
706            (MainWindow.AddLayer): Use the session's OpenShapefile method to
707            open shapefiles
708    
709            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
710            session's OpenShapefile method to open shapefiles
711    
712            * test/test_classification.py
713            (TestClassification.test_classification): Use the session's
714            OpenShapefile method to open shapefiles and build the filename in
715            a more platform independed way
716    
717            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
718            Implement to have a session to use in the tests
719            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
720            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
721            session's OpenShapefile method to open shapefiles
722            (TestLayerLegend.setUp): Instantiate a session so that we can use
723            it to open shapefiles.
724            (TestLayerLegend.tearDown): Make sure that all references to
725            layers and session are removed otherwise we may get a resource
726            leak
727    
728            * test/test_map.py (TestMapAddLayer.test_add_layer)
729            (TestMapWithContents.setUp): Instantiate a session so that we can
730            use it to open shapefiles.
731            (TestMapWithContents.tearDown): Make sure that all references to
732            layers, maps and sessions are removed otherwise we may get a
733            resource leak
734            ("__main__"): use support.run_tests() so that more info about
735            uncollected garbage is printed
736    
737            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
738            session's OpenShapefile method to open shapefiles
739            ("__main__"): use support.run_tests() so that more info about
740            uncollected garbage is printed
741    
742            * test/test_selection.py (TestSelection.tearDown): Make sure that
743            all references to the session and the selection are removed
744            otherwise we may get a resource leak
745            (TestSelection.get_layer): Instantiate a session so that we can
746            use it to open shapefiles.
747            ("__main__"): use support.run_tests() so that more info about
748            uncollected garbage is printed
749    
750            * test/test_session.py (TestSessionBase.tearDown)
751            (TestSessionWithContent.tearDown): Make sure that all references
752            to the session and layers are removed otherwise we may get a
753            resource leak
754            (TestSessionWithContent.setUp): Use the session's OpenShapefile
755            method to open shapefiles
756    
757    2003-04-24  Jonathan Coles   <[email protected]>
758    
759            * Thuban/Model/load.py (XMLReader.read): Should have been checking
760            if the file_or_filename object had the 'read' attribute.
761    
762    2003-04-23  Jonathan Coles   <[email protected]>
763    
764            * Thuban/Model/resource.py: Fixes RTbug #1813.
765            (ReadProjFile): Add documentation about which exceptions are raised.
766            Always pass the exceptions up to the caller.
767            (GetProjFiles): If the directory can't be read return an empty list.
768            If any of the proj files can't be read skip that file and go
769            on to the next one.
770    
771            * test/test_proj.py: Added test cases to handle nonexistent files,
772            unreadable files, and files that don't parse correctly.
773    
774    2003-04-23  Jonathan Coles   <[email protected]>
775    
776            Projection dialog. Allows the user to select from a list
777            of projection templates and optionally edit them and save new ones.
778    
779            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
780            (ProjPanel): Base class for projection specific panels.
781            (TMPanel): Projection panel for Transverse Mercartor.
782            (UTMPanel): Projection panel for Universal Transverse Mercartor.
783            (LCCPanel): Projection panel for Lambert Conic Conformal.
784            (GeoPanel): Projetion panel for Geographic Projection.
785    
786    2003-04-23  Jonathan Coles   <[email protected]>
787    
788            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
789            promote symmetry. There now exists XMLReader and XMLWriter.
790            (XMLReader.read): New. Call to read the given file descriptor or
791            filename.
792            (XMLReader.close): New. Make sure the file is closed.
793            (XMLReader.GetFileName): New. Return just the file name that is being
794            read from.
795            (XMLReader.GetDirectory): New. Return just the directory of the file
796            that is being read.
797            (XMLReader.AddDispatchers): New. Take a dictionary which contains
798            the names of functions to call as the XML tree is parsed.
799            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
800            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
801            (SessionLoader): Removed class variables start_dispatcher and
802            end_dispatcher since this functionality is now part of a class
803            instance. Fixes RTbug #1808.
804            (SessionLoader.__init__): Add dispatcher functions.
805            (load_xmlfile): Code was moved into the XMLReader.read().
806            (load_session): Use modified SessionLoader.
807    
808            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
809            map's projection.
810    
811            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
812            GetAllParameters.
813            (Projection.GetParameter): Returns the value for the given parameter.
814    
815            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
816            (GetProjFiles): Renamed from GetProjections. Now returns a list
817            of ProjFile objects.
818            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
819            a list of ProjFile objects whose files are not user defined.
820            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
821            list of ProjFile objects whose files are user defined.
822            (ProjFileReader): Extend new XMLReader.
823    
824            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
825            promote symmetry.
826    
827            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
828            control instead of a wxComboBox. wxChoice controls do not generate
829            events as the uses highlights possible choices which fixes problems
830            with resizing the dialog when the use selects an option.
831    
832            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
833            control instead of a wxComboBox.
834    
835            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
836            dialog.
837    
838            * test/test_proj.py (TestProjection.test): New tests for GetParameter
839            method.
840    
841    2003-04-22  Bernhard Herzog  <[email protected]>
842    
843            * Thuban/UI/mainwindow.py: Remove some unused imports and global
844            constants
845    
846            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
847            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
848    
849    2003-04-17  Bernhard Herzog  <[email protected]>
850    
851            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
852            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
853            anymore.
854            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
855            (Layer.ShapeType, Layer.Shape): No need to call
856            self.open_shapefile since it's always called in __init__
857    
858            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
859            In wxPython 2.4 there's no need to extend MainLoop anymore since
860            wxPython itself makes sure OnExit is called.
861    
862    2003-04-16  Jonathan Coles   <[email protected]>
863    
864            Initial putback of projection management code. Includes new
865            classes to read and write projection files. The current load
866            and save classes were abstracted a bit so they could be reused.
867            The Projection class was extended to provide new methods and
868            have a name.
869    
870            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
871            general XML reading methods that were part of ProcessSession.
872    
873            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
874            name.
875            (ProjFile): New. Represents a file that contains projection
876            information.
877    
878            * Thuban/Model/resource.py: New. Contains general utilities
879            for read and writing projection files.
880    
881            * Thuban/Model/save.py (XMLSaver): New. Contains all the
882            general XML writing methods that were part of SessionSaver.
883            (SessionSaver): Renamed from Saver.
884    
885            * test/test_proj.py: New test cases for the projection
886            file read and write functions.
887    
888    2003-04-16  Jonathan Coles   <[email protected]>
889    
890            * Thuban/Model/classification.py: Use repr() around values
891            in the ClassGroup*.__repr__() methods so it is clearer when
892            a value is a string and when it is a number.
893    
894            * test/test_load.py: Rework the classification test to test
895            that we can load old files.
896            (testLabels): Test a file where the groups have labels.
897    
898    2003-04-16  Bernhard Herzog  <[email protected]>
899    
900            Safer implementation of the performance enhancements of the
901            low-level renderer:
902            
903            * extensions/thuban/wxproj.cpp (extract_projection)
904            (extract_pointer): Rename extract_projection to extract_pointer
905            and redefine its purpose to return the pointer stored in a CObject
906            returned by the object's cobject method. Update all callers.
907            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
908            handling of these low-level parameters so that each s_draw_info
909            instance is handled as a CObject at python level that also
910            contains real references to the actual python objects which
911            contain the values in the struct. Add free_draw_info as the
912            destructor.
913            (draw_polygon_shape): Add the py_draw_info parameter which must a
914            cobject containing an s_draw_info pointer.
915    
916            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
917            method to instantiat the low-level render parameter
918            (MapRenderer.draw_shape_layer): Use the new method. Remove some
919            commented out code.
920            (MapRenderer.draw_polygon_shape): Make the first parameter not the
921            layer but the low-level render parameter
922            (ScreenRenderer.draw_shape_layer): Use the low-level render
923            parameter.
924    
925    2003-04-15  Jonathan Coles   <[email protected]>
926    
927            * Thuban/Model/classification.py: Implemented __repr__ for
928            the ClassGroup* classes to make debugging a bit easier.
929            (ClassGroup.SetLabel): Check that the string is an instance
930            of StringTypes not StringType. Accounts for Unicode strings.
931    
932            * Thuban/Model/color.py: Implemented __repr__ to make
933            debugging a bit easier.
934    
935            * Thuban/Model/save.py (Saver.write_classification): Need to
936            save the group label.
937    
938            * test/test_load.py (testClassification): New. Loads the
939            iceland_sample_test.thuban file and checks if it was loaded
940            correctly.
941    
942    2003-04-15  Jonathan Coles   <[email protected]>
943    
944            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
945            to improve rendering performance by initializing the variables
946            that are not change each time draw_polygon_shape() is called.
947            The values are stored in a global struct draw_info.
948            (draw_polygon_shape): Removed initialization code that is
949            now in draw_polygon_init().
950    
951            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
952            drawing initialization call to draw_polygon_init()
953            (MapRenderer.draw_polygon_shape): Use new signature of
954            draw_polygon_shape.
955    
956            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
957            weirdness by setting the range to (1, maxint).
958    
959            * Thuban/Model/classification.py (ClassGroupProperties): Make
960            instance variables private and optimize comparison operator
961            by first checking if the color references are the same.
962            (ClassGroupSingleton): Make instance variables private.
963            (ClassGroupRange): Make instance variables private.
964    
965            * HOWTO-Release: Filled in missing steps for releasing packages.
966    
967    2003-04-15  Bernhard Herzog  <[email protected]>
968    
969            First stab at internationalized messages:
970    
971            * Thuban/__init__.py (_): Implement the translation function for
972            real using the python gettext module.
973    
974            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
975            translate empty strings.
976    
977            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
978            Add a missing space to a warning message
979    
980            * po/README: New. Notes about the management of the translation
981            files.
982    
983            * po/Makefile: New. Makefile to help manage the translation files.
984    
985            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
986    
987            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
988            translations and support files in po/
989    
990            * setup.py (data_files): Add the *.mo files to the data_files too
991    
992            * README: Add note about the translations when building from CVS
993    
994    2003-04-14  Jonathan Coles   <[email protected]>
995    
996            * Thuban/UI/dock.py: Fixes some window resizing problems most
997            noticable under windows. Always assume the button bitmaps will
998            be there. Code clean up.
999            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
1000            images for the dock/undock button to the same images.
1001            Work around for RTbug #1801.
1002    
1003            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
1004            be allowed to grow within the sizer. Fixes a bug under Windows
1005            where the toolbar wasn't being drawn.
1006    
1007    2003-04-14  Frank Koormann   <[email protected]>
1008    
1009            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
1010            Updated design to try to make the button functionality more
1011            transparent.
1012    
1013    2003-04-14  Jonathan Coles   <[email protected]>
1014    
1015            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
1016            finalize the intialization of the panel.
1017    
1018            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
1019            creation of the panel. Should be the last thing called in the
1020            initializer of a subclass.
1021    
1022            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
1023            set the current selections in the combo boxes. This is needed
1024            under Windows.
1025    
1026            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
1027            level panel to the dialog so that the background colors are
1028            consistent under Windows.
1029    
1030    2003-04-11  Jonathan Coles   <[email protected]>
1031    
1032            * Thuban/UI/classgen.py: Change color ramps to start at white
1033            not black.
1034    
1035            * Thuban/UI/legend.py: Enable/disable the legend buttons when
1036            the legend changes. Fixes RTbug #1793.
1037    
1038            * test/test_classification.py: Added test for copying of
1039            classifications.
1040    
1041    2003-04-11  Jonathan Coles   <[email protected]>
1042    
1043            * Thuban/UI/resource.py: New. Centralize the loading of resources
1044            such as bitmaps.
1045    
1046            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
1047            added images to the move buttons, added 'reverse' button.
1048            (CustomRampPanel.__init__): Added images to the move buttons.
1049            (GreyRamp): New. Generates a ramp from white to black.
1050            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
1051    
1052            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
1053            ID_PROPERTY_*.
1054            (Classifier.__init__): Minor changes to the layout.
1055            (Classifier._OnTitleChanged): Listen for when the user edits the
1056            title and update the dialog's title and the layer's title.
1057    
1058            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
1059    
1060            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
1061            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
1062            if the layer's title changes.
1063    
1064            * Thuban/UI/mainwindow.py: Added new menu item and associated code
1065            to open a dialog to rename the map.
1066            (MainWindow): Use new resource class to import bitmaps.
1067    
1068    2003-04-11  Jonathan Coles   <[email protected]>
1069    
1070            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
1071            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
1072            Resources/Bitmaps/group_use_none.xpm,
1073            Resources/Bitmaps/group_use_not.xpm,
1074            Resources/Bitmaps/hide_layer.xpm,
1075            Resources/Bitmaps/layer_properties.xpm,
1076            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
1077            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
1078            New.
1079    
1080    2003-04-10  Jonathan Coles   <[email protected]>
1081    
1082            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
1083            Should pass group to ClassGroup constructor.
1084    
1085    2003-04-10  Jonathan Coles   <[email protected]>
1086    
1087            * Thuban/Model/classification.py: (ClassGroup): Move all the common
1088            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
1089            here. Implement SetVisible(), IsVisible().
1090            (ClassGroup.__init__): Add group parameter which acts as a copy
1091            constructor.
1092    
1093            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
1094            "Visible" check boxes.
1095            (Classifier): Rename the buttons and refactor the code to match
1096            the new labels.
1097    
1098            * Thuban/UI/legend.py: Classify button is now called "Properties".
1099            Refactored the code to change variable names.
1100            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
1101    
1102            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
1103            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
1104            renamed to MainWindow.LayerEditProperties.
1105            (MainWindow.ToggleLegend): Don't include map name in legend title.
1106            (MainWindow.SetMap): Added the map name to the window title.
1107            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
1108            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
1109            Functionality is found in the layer properties dialog.
1110    
1111            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1112            draw visible groups.
1113    
1114    2003-04-09  Jonathan Coles   <[email protected]>
1115    
1116            * Thuban/UI/classgen.py: Modifications to allow simple
1117            addition and selection of new color schemes.
1118            (MonochromaticRamp): New. Generates a ramp between two colors.
1119            (RedRamp): New. Generates a ramp of all red.
1120            (GreenRamp): New. Generates a ramp of all green.
1121            (BlueRamp): New. Generates a ramp of all blue.
1122    
1123    2003-04-09  Jonathan Coles   <[email protected]>
1124    
1125            * Thuban/Model/classification.py (Classification.__deepcopy__):
1126            Need to copy over field and fieldType attributes.
1127    
1128            * Thuban/Model/table.py (Table.field_range): New. Retrive the
1129            maximum and minimum values over the entire table for a given
1130            field.
1131            (Table.GetUniqueValues): New. Retrieve all the unique values
1132            in the table for a given field.
1133    
1134            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
1135            (GenUniquePanel): New. Controls to allow the user to select
1136            which unique field values they would like in the classification.
1137            (CustomRampPanel): Code that was in ClassGenDialog that allows
1138            the user to select the properties for a custom ramp.
1139            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
1140    
1141            * Thuban/UI/classifier.py: Removed a lot of debugging code.
1142            (Classifier._SetClassification): Callback method so that the
1143            class generator can set the classification in the grid.
1144            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
1145            editing of a group properties class into a wxWindows control.
1146    
1147            * Thuban/UI/dock.py: It was decided that if the user closes
1148            a dockable window the window should simply hide itself. That
1149            way if the user wants to show the dock again it appears in the
1150            same place as it was when it was closed.
1151            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
1152            (DockableWindow._OnButtonClose): Hide the window instead of
1153            destroying it.
1154            (DockableWindow._OnClose): Hide the window instead of
1155            destroying it.
1156    
1157            * Thuban/UI/legend.py (LegendTree): Use a private method to
1158            consistently set the font and style of the text. Fixes RTbug #1786.
1159    
1160            * Thuban/UI/mainwindow.py: Import just the Classifier class.
1161    
1162    2003-04-07  Bernhard Herzog  <[email protected]>
1163    
1164            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
1165            to the map module
1166    
1167    2003-04-07  Bernhard Herzog  <[email protected]>
1168    
1169            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
1170            favor of ToggleSessionTree
1171            (MainWindow.ToggleSessionTree): New method to toggle visibility of
1172            the session tree.
1173            (MainWindow.SessionTreeShown): New method to return whether the
1174            session tree is currently shown.
1175            (MainWindow.ToggleLegend): New method to toggle visibility of the
1176            legend
1177            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
1178            LegendShown
1179            (MainWindow.LegendShown): New method to return whether the legend
1180            is currently shown.
1181            (_method_command): Add checked parameter so we can define check
1182            menu items
1183            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
1184            mainwindow methods.
1185            (show_session_tree, show_legend commands): Removed.
1186            (toggle_session_tree, toggle_legend commands): New commands to
1187            toggle the visibility of the dialogs
1188    
1189    2003-04-07  Jonathan Coles   <[email protected]>
1190    
1191            * Thuban/UI/classgen.py: Fix Windows problem.
1192    
1193            * Thuban/UI/dock.py: Fix Windows problem.
1194    
1195            * Thuban/UI/mainwindow.py: Use False instead of false.
1196            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
1197    
1198    2003-04-07  Jonathan Coles   <[email protected]>
1199    
1200            Since we now say that the order of the groups in a classification
1201            matters, it makes sense to be able to manipulate that order. Most
1202            of the changes to Thuban/Model/classification.py are to that end.
1203    
1204            * Thuban/Model/classification.py (Classification.AppendGroup,
1205            Classification.InsertGroup, Classification.ReplaceGroup,
1206            Classification.RemoveGroup, Classification.GetGroup): Do as the
1207            names imply.
1208            (Classification.FindGroup): This was called GetGroup, but GetGroup
1209            takes an index, while FindGroup takes a value.
1210            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
1211            REFERENCE. Currently there is a cyclic reference between the layer
1212            and its classification. If the classification doesn't need to know
1213            its owning layer we can change this, since it may make sense to be
1214            able to use the same classification with different layers.
1215    
1216            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
1217    
1218            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
1219            not AddGroup()
1220    
1221            * Thuban/UI/classifier.py: Now that we can depend on the order in
1222            a Classification and have methods to manipulate that order we don't
1223            need to use our own data structures in the grid. We can simply make
1224            the grid/table access the information they need from a copy of
1225            the classification object.
1226            (Classifier._OnCloseBtn): Event handler for when the user clicks
1227            'Close'. This is needed so if the user applies changes and then
1228            continues to change the table the user has the option of discarding
1229            the most recent changes and keeping what they applied.
1230    
1231            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
1232            into the same group.
1233    
1234            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
1235            with a really old version of proj, PJ_VERSION won't even be defined.
1236            If it isn't defined then just compile so that the function always
1237            returns Py_False.
1238    
1239            * test/test_classification.py: Fix tests to use the renamed methods.
1240            Still need to write tests for the new methods.
1241    
1242    2003-04-04  Jonathan Coles   <[email protected]>
1243    
1244            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
1245            call to SetSelection out of the method and before the call
1246            to __SelectField in __init__. This prevents a recursion of events
1247            when _OnFieldSelect is triggered by the user.
1248    
1249    2003-04-04  Jonathan Coles   <[email protected]>
1250    
1251            * Thuban/Model/classification.py: Rename Color.None to
1252            Color.Transparent.
1253            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
1254            Don't bother copying the color, since Colors are immutable.
1255    
1256            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
1257            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
1258            Thuban/UI/renderer.py, Thuban/UI/view.py:
1259            Rename Color.None to Color.Transparent.
1260        
1261            * test/test_classification.py, test/test_load.py: Rename Color.None
1262            to Color.Transparent.
1263    
1264    2003-04-04  Jonathan Coles   <[email protected]>
1265    
1266            * Thuban/Model/classification.py: Fix assert calls.
1267            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
1268            Copy the color parameter rather than hold onto a reference.
1269    
1270            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
1271            the color object.
1272            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
1273            are sure there exists only one refernce to Color.None in the system.
1274            This allows us to use 'is' rather than the comparision functions.
1275            
1276            * Thuban/Model/save.py: Fix assert calls.
1277            
1278            * Thuban/UI/classifier.py: Fix assert calls.
1279            (ClassGrid._OnCellDClick): Call up to the classifier to open the
1280            dialog to edit the groups properties.
1281            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
1282            correctly if a cell is resized.
1283            (ClassTable.SetClassification): New. Changes the classification
1284            that is in the table.
1285            (ClassTable.__SetRow): Allow groups to be prepended.
1286            (Classifier): New code for opening the EditProperties and
1287            GenerateRanges dialogs.
1288            (SelectPropertiesDialog.__GetColor): Only set the color in the
1289            color dialog if the current color is not None.
1290            
1291            * Thuban/UI/dock.py: Fix assert calls.
1292            
1293            * Thuban/UI/legend.py: Fix assert calls.
1294            
1295            * Thuban/UI/renderer.py: Fix assert calls.
1296            
1297            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
1298            classifications.
1299            (GenRangePanel): Panel specific to range generation.
1300            (GenSingletonPanel): Panel specific to singleton generation.
1301            (ClassGenerator): Class responsible for actually generating
1302            the classification from the data gathered in the dialog box.
1303            (PropertyRamp): Generates properties whose values range from
1304            a starting property to an ending property.
1305    
1306    2003-04-03  Bernhard Herzog  <[email protected]>
1307    
1308            * test/support.py (print_garbage_information): New function that
1309            prints information about still connected messages and memory
1310            leaks.
1311            (run_suite): Removed.
1312            (run_tests): New function for use as a replacement of
1313            unittest.main in the test_* files. This one calls
1314            print_garbage_information at the end.
1315    
1316            * test/runtests.py (main): Use support.print_garbage_information
1317    
1318            * test/test_layer.py: Use support.run_tests instead of
1319            unittest.main so we get memory leak information
1320            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1321            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1322            (TestLayerLegend.test_visibility): Call the layer's Destroy method
1323            to fix a memory leak.
1324    
1325            * test/test_classification.py: Use support.run_tests instead of
1326            unittest.main so we get memory leak information
1327            (TestClassification.test_classification): Call the layer's Destroy
1328            method to fix a memory leak.
1329    
1330    2003-04-02  Bernhard Herzog  <[email protected]>
1331    
1332            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1333            Handle the reference counts of the return value and errors in
1334            PyArg_ParseTuple correctly.
1335    
1336            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1337            sure the filename is absolute to avoid problems when saving the
1338            session again
1339    
1340            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
1341    
1342    2003-04-01  Jonathan Coles   <[email protected]>
1343    
1344            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
1345            that there actually are points in the returned list of points
1346            before trying to index into the list. The list may be empty if
1347            the shape is a Null Shape.
1348    
1349    2003-04-01  Bernhard Herzog  <[email protected]>
1350    
1351            * test/test_map.py: Don't use from <module> import *
1352    
1353  2003-04-01  Jonathan Coles   <[email protected]>  2003-04-01  Jonathan Coles   <[email protected]>
1354    
1355          * Thuban/Model/session.py: Use LAYER_CHANGED instead of          * Thuban/Model/session.py: Use LAYER_CHANGED instead of

Legend:
Removed from v.581  
changed lines
  Added in v.870

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26