/[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 425 by bh, Mon Feb 24 14:17:19 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]>
1354    
1355            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
1356            LAYER_LEGEND_CHANGED
1357    
1358            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
1359            self.Destroy() to close the window after yesterday's changes.
1360    
1361            * test/test_map.py, test/test_session.py: Fix messages that
1362            are sent from maps and layers.
1363    
1364    2003-03-31  Jonathan Coles   <[email protected]>
1365    
1366            * Thuban/UI/classifier.py: Commented out some debugging statements.
1367            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
1368            RTbug #1769.
1369    
1370            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
1371            position (although position doesn't work yet under GTK).
1372            (DockableWindow.Destroy): New. Called when the window must be
1373            closed. Namely needed when the DockFrame closes and must close
1374            its children.
1375            (DockFrame): Listen for EVT_CLOSE and destroy all children.
1376    
1377            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
1378            when then window is told to close.
1379            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
1380            comment in source for more info.
1381    
1382            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
1383    
1384            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
1385            symmetry with other such methods.
1386            (MainWindow.ShowLegend): Show the legend docked by default.
1387    
1388    2003-03-28  Jonathan Coles   <[email protected]>
1389    
1390            * Thuban/UI/classifier.py: Support for highlighting a specific
1391            group within the grid when the classification dialog is opened.
1392            Also contains a lot of debugging printouts which will later
1393            be removed.
1394    
1395            * Thuban/UI/dock.py: Complete rework on the dock code so that
1396            that it is fairly removed from the rest of the Thuban application.
1397            It is easy to add new docks which the rest of the program having
1398            to be aware of them.
1399    
1400            * Thuban/UI/legend.py: Modifications to support selecting a
1401            specific group in the classification dialog. Changed how layers
1402            are drawn when the layer is visible/invisible.
1403    
1404            * Thuban/UI/mainwindow.py: Removed legend specific code and
1405            replaced it with calls to the new dock code.
1406    
1407            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
1408            to check if scale > 0. Trying to track down a divide by zero.
1409    
1410    2003-03-26  Jonathan Coles   <[email protected]>
1411    
1412            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
1413            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
1414            now part of DockableWindow.
1415            (LegendPanel.DoOnSelChanged): Select the current layer in the
1416            map.
1417            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
1418            with the selected layer and/or group.
1419    
1420    2003-03-26  Jonathan Coles   <[email protected]>
1421    
1422            This putback contains the code for dockable windows. There is
1423            no support in wxWindows as of this date for windows that can
1424            attach themselves to other windows.
1425    
1426            The current model contains a DockableWindow which has a parent
1427            window for when it is detached and a dock window that it puts
1428            its contents in when it is docked. The contents of a DockableWindow
1429            must be a DockPanel. DockPanel itself derives from wxPanel.
1430    
1431            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
1432            message, not a LAYER_LEGEND_CHANGED message.
1433    
1434            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
1435    
1436            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
1437            as one of the style properties for the fieldTypeText item to
1438            be sure that its size is correct when the text changes.
1439    
1440            * Thuban/UI/dock.py: New. Classes for the DockPanel and
1441            DockableWindow.
1442    
1443            * Thuban/UI/legend.py: Added some more buttons and made the
1444            LegendPanel a DockPanel.
1445    
1446            * Thuban/UI/mainwindow.py: Added sash windows to the main window
1447            and supporting functions for manipulating the sashes.
1448            (MainWindow.ShowLegend): Create a DockableWindow with the
1449            LegendPanel as the contents.
1450    
1451            * Thuban/UI/messages.py: Added DOCKABLE_* messages
1452    
1453            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
1454            not LAYER_LEGEND_CHANGED, messages.
1455    
1456    2003-03-25  Jonathan Coles   <[email protected]>
1457    
1458            * setup.py: Added custom script bdist_rpm_build_script so that
1459            when the rpm is built the path to wx-config is correct.
1460    
1461            * setup.cfg: Added line saying to use the custom build script
1462    
1463    2003-03-20  Jonathan Coles   <[email protected]>
1464    
1465            Initial implementation of the Legend.
1466    
1467            * Thuban/UI/legend.py: New. Creates a window that shows the map's
1468            Legend information and allows the user to add/modify classifications
1469            and how the layers are drawn on the map.
1470    
1471            * setup.py: New command 'build_docs' which currently uses
1472            happydoc to generate html documentation for Thuban.
1473    
1474            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
1475            Returns a string which is appropriately describes the group.
1476    
1477            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
1478            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
1479    
1480            * Thuban/Model/map.py (Map): Rename messages and use new, more
1481            specific, messages.
1482    
1483            * Thuban/Model/messages.py: New message to indicate that a layer's
1484            data has changed (LAYER_CHANGED). New map messages to indicate
1485            when layers have been added/removed/changed or if the stacking order
1486            of the layers has changed.
1487    
1488            * Thuban/Model/session.py: Rename and use new messages.
1489    
1490            * Thuban/UI/classifier.py: Remember if any changes have actually
1491            been applied so that if the dialog is cancelled without an application
1492            of changes we don't have to set a new classification.
1493            (ClassDataPreviewer): Pulled out the window specific code and put it
1494            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
1495            symbols on any DC.
1496            
1497            * Thuban/UI/mainwindow.py: New code to open the legend.
1498    
1499            * Thuban/UI/view.py: Use new message names.
1500    
1501    2003-03-19  Jonathan Coles   <[email protected]>
1502    
1503            * Thuban/UI/main.py (verify_versions): New. Checks the versions
1504            of Python, wxPython, and some other libraries.
1505    
1506            * extensions/thuban/wxproj.cpp (check_version): Checks the given
1507            version against what wxproj was compiled with.
1508            (check_version_gtk): If wxproj was compiled with gtk then check
1509            the given version against the version of the gtk library
1510            currently being used.
1511    
1512    2003-03-14  Bernhard Herzog  <[email protected]>
1513    
1514            * test/test_command.py: Run the tests when the module is run as a
1515            script
1516    
1517    2003-03-14  Bernhard Herzog  <[email protected]>
1518    
1519            Implement selection of multiple selected shapes in the same layer:
1520    
1521            - Introduce a new class to hold the selection. This basically
1522              replaces the interactor which was nothing more than the
1523              selection anyway. A major difference is of course that the new
1524              selection class supports multiple selected shapes in one layer
1525            
1526            - Move the object that represents the selection from the
1527              application to the canvas. The canvas is a better place than the
1528              application because the selection represents which shapes and
1529              layer of the map displayed by the canvas are selected and
1530              affects how the map is drawn.
1531    
1532            - Make the selection and its messages publicly available through
1533              the mainwindow.
1534    
1535            - The non-modal dialogs do not get a reference to the interactor
1536              anymore as they can simply refer to their parent, the
1537              mainwindow, for the what the interactor had to offer.
1538    
1539            * Thuban/UI/selection.py: New module with a class to represent the
1540            selection.
1541    
1542            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
1543            these unused messages
1544    
1545            * Thuban/UI/application.py (ThubanApplication.OnInit)
1546            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
1547            interactor is gone now.
1548            (ThubanApplication.CreateMainWindow): There is no interactor
1549            anymore so we pass None as the interactor argument for now for
1550            compatibility.
1551    
1552            * Thuban/UI/view.py (MapCanvas.delegated_messages)
1553            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
1554            Unsubscribe, delegate messages according to the delegated_messages
1555            class variable.
1556            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
1557            attributes from instance variables as described with the
1558            delegated_methods class variable.
1559            (MapCanvas.__init__): New instance variable selection holding the
1560            current selection
1561            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
1562            pass them on to the renderer
1563            (MapCanvas.SetMap): Clear the selection when a different map is
1564            selected.
1565            (MapCanvas.shape_selected): Simple force a complete redraw. The
1566            selection class now takes care of only issueing SHAPES_SELECTED
1567            messages when the set of selected shapes actually does change.
1568            (MapCanvas.SelectShapeAt): The selection is now managed in
1569            self.selection
1570    
1571            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
1572            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
1573            Unsubscribe, delegate messages according to the delegated_messages
1574            class variable.
1575            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
1576            attributes from instance variables as described with the
1577            delegated_methods class variable.
1578            (MainWindow.__init__): The interactor as ivar is gone. The
1579            parameter is still there for compatibility. The selection messages
1580            now come from the canvas.
1581            (MainWindow.current_layer, MainWindow.has_selected_layer):
1582            Delegate to the the canvas.
1583            (MainWindow.LayerShowTable, MainWindow.Classify)
1584            (MainWindow.identify_view_on_demand): The dialogs don't need the
1585            interactor parameter anymore.
1586    
1587            * Thuban/UI/tableview.py (TableFrame.__init__)
1588            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
1589            (LayerTableFrame.row_selected): The interactor is gone. It's job
1590            from the dialog's point of view is now done by the mainwindow,
1591            i.e. the parent. Subscribe to SHAPES_SELECTED instead
1592            of SELECTED_SHAPE
1593            
1594            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
1595            is gone. It's job from the dialog's point of view is now done by
1596            the mainwindow, i.e. the parent.
1597            
1598            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
1599            gone. It's job from the dialog's point of view is now done by the
1600            mainwindow, i.e. the parent.
1601    
1602            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
1603            gone. It's job from the dialog's point of view is now done by the
1604            mainwindow, i.e. the parent.
1605            (SessionTreeCtrl.__init__): New parameter mainwindow which is
1606            stored as self.mainwindow. The mainwindow is need so that the tree
1607            can still subscribe to the selection messages.
1608            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
1609            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
1610            selection is now accessible through the mainwindow. Subscribe to
1611            SHAPES_SELECTED instead of SELECTED_SHAPE
1612    
1613            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
1614            SHAPES_SELECTED message now.
1615            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
1616            so deal with multiple shapes
1617            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
1618            gone. It's job from the dialog's point of view is now done by the
1619            mainwindow, i.e. the parent.
1620    
1621            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
1622            parameter is now a list of shape ids.
1623            (RecordTable.SetTable): The second parameter is now a list of
1624            indices.
1625    
1626            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
1627            selected_shape parameter and ivar to selected_shapes. It's now a
1628            list of shape ids.
1629            (MapRenderer.draw_label_layer): Deal with multiple selected
1630            shapes. Rearrange the code a bit so that the setup and shape type
1631            distinctions are only executed once.
1632    
1633            * test/test_selection.py: Test cases for the selection class
1634    
1635    2003-03-11  Jonathan Coles   <[email protected]>
1636    
1637            * Thuban/Model/load.py: Temporary fix so that the xml reader
1638            doesn't cause Thuban to crash.
1639    
1640            * Thuban/Model/layer.py: Handle the cyclic references between
1641            a layer and its classification better, and be sure to disconnect
1642            the classification from the layer when the layer is destroyed
1643            so that we don't maintain a cyclic reference that may not be
1644            garbage collected.
1645    
1646            * Thuban/Model/classification.py: See comment for layer.py.
1647    
1648    2003-03-12  Jan-Oliver Wagner <[email protected]>
1649    
1650            * HOWTO-Release: New. Information on the steps for releasing
1651            a new version of Thuban.
1652    
1653    2003-03-11  Jonathan Coles   <[email protected]>
1654    
1655            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
1656            Use True instead of true.
1657            (Classifier): Should have a single panel in which all the controls lie.
1658    
1659            * Thuban/UI/proj4dialog.py: Add normal border.
1660    
1661            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
1662    
1663            * Thuban/UI/mainwindow.py: Use True instead of true.
1664    
1665            * setup.py: Update some definitions to use wxWindows2.4 files
1666    
1667            * Data/iceland_sample_class.thuban: Fixed file so that the
1668            field_type information is present.
1669    
1670    2003-03-10  Jonathan Coles   <[email protected]>
1671    
1672            * Thuban/UI/classifier.py (Classifier.__init__): Make the
1673            field type label grow so that when the text changes the
1674            size is updated correctly. This may be a wxWindows bug.
1675    
1676    2003-03-10  Jonathan Coles   <[email protected]>
1677    
1678            * Thuban/UI/application.py: Changed SESSION_CHANGED to
1679            SESSION_REPLACED.
1680    
1681            * Thuban/UI/classifier.py: Wrap text with _().
1682            (ClassGrid.CreateTable): Set dimensions and size hints here,
1683            instead of in Reset, so we only set the size once.
1684    
1685            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1686    
1687            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1688            Call Close() instead of Shutdown().
1689    
1690            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1691    
1692            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1693            Go back to using OnClose() instead of Shutdown().
1694    
1695    2003-03-10  Jonathan Coles   <[email protected]>
1696    
1697            * Thuban/UI/classifier.py (Classifier): SelectField() needed
1698            to know the old field index as well as the new one.
1699    
1700    2003-03-10  Jonathan Coles   <[email protected]>
1701    
1702            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1703            to correctly set the table information and call this from
1704            __init__ and from _OnFieldSelect so that all the information
1705            is up to date when the dialog opens and when a field is changed.
1706    
1707    2003-03-10  Jonathan Coles   <[email protected]>
1708    
1709            * Thuban/Model/classification.py (Classification): Don't use
1710            layer's message function directly, use the ClassChanged() method
1711            when then classification changes. SetField/SetFieldType/SetLayer
1712            must keep the information about field name and field type in
1713            sync when an owning layer is set or removed.
1714    
1715            * Thuban/Model/layer.py: Added ClassChanged() so that the
1716            classification can tell the layer when its data has changed.
1717            (Layer.SetClassification): Accepts None as an arguement to
1718            remove the current classification and correctly handles
1719            adding a new classification.
1720    
1721            * Thuban/Model/load.py: Comment out print statement
1722    
1723            * test/test_classification.py, test/test_save.py: New and
1724            improved tests.
1725    
1726    2003-03-07  Jonathan Coles   <[email protected]>
1727    
1728            * Thuban/Model/classification.py: Implemented __copy__ and
1729            __deepcopy__ for ClassGroup* and ClassGroupProperites so
1730            they can easily be copied by the classifier dialog.
1731            (ClassGroupProperites.__init__): The default line color should
1732            have been Color.Black.
1733    
1734            * Thuban/UI/classifier.py: Setting and Getting table values now
1735            uses a consistent set of functions.
1736            (Classifier): Now non-modal. Has field type label which changes
1737            as the field changes. Keep track of buttons in a list so that
1738            we can enable/disable the buttons when the None field is selected.
1739            (SelectPropertiesDialog): Add buttons to make the colors transparent.
1740    
1741            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
1742            does what OnClose did, but can be called by the application to
1743            close a window. Needed when a session changes, and we have to
1744            close the classifier windows.
1745    
1746            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1747            Shuts down open dialogs. Used when a new session is created
1748            or a session is opened.
1749            (MainWindow.SaveSession): Should only call application.SaveSession()
1750            if we don't call SaveSessionAs first.
1751            (MainWindow.Classify): Allow different classifier dialogs for
1752            different layers.
1753    
1754            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
1755            the parent class handle it. Add Shutdown() to unsubscibe from
1756            event notification and call the parent Shutdown(). This was
1757            necessary so the application can close the tree window.
1758    
1759    2003-03-06  Jonathan Coles   <[email protected]>
1760    
1761            * Thuban/Model/classification.py: Minor documentation changes,
1762            Addition of __eq__ and __ne__ methods.
1763            (Classification.SetLayer): prevent recursion between this method
1764            and Layer.SetClassification().
1765    
1766            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
1767    
1768            * Thuban/Model/layer.py (SetClassification): prevent recursion
1769            between this method and Classification.SetLayer().
1770    
1771            * test/test_classification.py, test/test_load.py,
1772            test/test_session.py: Fixed and added tests for the classification
1773            classes.
1774    
1775    2003-03-06  Bernhard Herzog  <[email protected]>
1776    
1777            * Thuban/UI/classifier.py (ClassGrid.__init__)
1778            (ClassGrid.CreateTable): Move the SetSelectionMode call to
1779            CreateTable because otherwise it triggers an assertion in
1780            wxPython/wxGTK 2.4.
1781    
1782    2003-03-05  Jonathan Coles   <[email protected]>
1783    
1784            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
1785    
1786            * Thuban/Model/load.py: import FIELDTYPE constants from table.
1787    
1788            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
1789    
1790            * Thuban/Model/table.py: Put FIELDTYPE constants back.
1791    
1792    2003-03-05  Jonathan Coles   <[email protected]>
1793    
1794            * Thuban/UI/classifier.py: Added class documentation.
1795            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
1796            Store just the groups in the table and generate the other
1797            column information when it is requested. Add "None" field
1798            to pull-down to select no classification.
1799    
1800            * Thuban/common.py: Moved FIELDTYPE constants from table.py
1801            (Str2Num): Only catch ValueError exceptions.
1802    
1803            * Thuban/Model/classification.py: Class documentation. Renaming
1804            of methods with Stroke to Line. Groups are stored in a single
1805            list with the default as the first element. Groups are searched
1806            in the order they appear in the list.
1807    
1808            * Thuban/Model/color.py: Documentation.
1809    
1810            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
1811            the kind of data represented by a field.
1812    
1813            * Thuban/Model/load.py (ProcessSession): Use proper string
1814            conversion function; fixes RTbug #1713.
1815    
1816            * Thuban/Model/save.py (Saver): Store field type information.
1817    
1818            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
1819            (Table): Add field_info_by_name() to retrieve field information
1820            by specifying the field name, not the number.
1821    
1822            * Thuban/UI/mainwindow.py: Function name changes.
1823    
1824            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1825            get the layer classification once. Don't try to classify
1826            values when the field is None: just use the default properties.
1827    
1828            * Thuban/UI/view.py: Function name changes.
1829    
1830            * Doc/thuban.dtd: Add field_type attribute to a classification.
1831    
1832    2003-03-04  Bernhard Herzog  <[email protected]>
1833    
1834            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
1835            the fill and stroke layer attributes optional with suitable
1836            default values. Add the stroke_width layer attribute. Use correct
1837            syntax for empty elements. Make the attribute list for labels
1838            refer to the label element.
1839    
1840    2003-03-04  Bernhard Herzog  <[email protected]>
1841    
1842            * setup.py (thuban_build_py.build): Add a comment about distutils in
1843            Python 2.3 containing some of the functionality we implement in
1844            setup.py ourselves.
1845    
1846            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
1847            before the selection mode. Doing it the other way round triggers
1848            an assertion in wxWindows.
1849    
1850            * Thuban/Model/save.py (escape): Fix typo in doc-string
1851    
1852            * Thuban/Model/classification.py: Remove unnecessary wxPython
1853            import
1854    
1855    2003-03-04  Jonathan Coles   <[email protected]>
1856    
1857            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
1858            Parameter 'value' should default to None.
1859    
1860            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
1861            the class attribute __classification is now private.
1862    
1863            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
1864            Classifier to ClassGrid. Added support for removing selected rows,
1865            which including code for keeping track of when cells are selected,
1866            and deselected.
1867            (ClassTable): Support for added/removing rows. Fixed a problem
1868            with __ParseInput whereby it would not allow strings (only numbers)
1869            to be entered.
1870            (Classifier): Added button and supporting code for removing
1871            selected rows.
1872    
1873    2003-02-27  Jonathan Coles   <[email protected]>
1874    
1875            * Thuban/common.py: Moved color conversion functions into
1876            Thuban/UI/common.py.
1877            (Str2Num): Now converts the float (not the string) to a long/int
1878            so that an exception isn't thrown.
1879    
1880            * Thuban/UI/common.py: Common functions used in several UI modules
1881    
1882            * Thuban/Model/classification.py: Changed the class hierarchy
1883            so that a Classification consists of Groups which return
1884            Properties when a value matches a Group.
1885    
1886            * Thuban/Model/layer.py: Fixed name resolution problem.
1887    
1888            * Thuban/Model/load.py: Use new Classification and Group functions.
1889    
1890            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
1891            failure.
1892            (Saver.write_classification): Use new Classification and Group
1893            functions.
1894    
1895            * Thuban/UI/classifier.py: Changes to use new Classification and Group
1896            functions. Fix to create a tuple with a single value instead of
1897            simply returning the value.
1898    
1899            * Thuban/UI/renderer.py: Use new Classification and Group functions.
1900            Use common.py functions.
1901    
1902            * Thuban/UI/tree.py: Use common.py functions.
1903            
1904            * test/test_classification.py: Use new Classification and Group
1905            classes.
1906    
1907    2003-02-24  Jonathan Coles   <[email protected]>
1908    
1909            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
1910            functions from Thuban color objects to wxWindow colour objects.
1911    
1912            * Thuban/Model/classification.py (Classification): Renamed
1913            GetProperties() to GetClassData(). Used the new iterator
1914            in TreeInfo().
1915            (ClassIterator): Iterator implementation to iterate over the
1916            ClassData objects in a classification object.
1917    
1918            * Thuban/Model/save.py (Saver.write_classificaton): Uses
1919            the new iterator to save the classification information.
1920    
1921            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
1922            for changing the stroke and fill colors and previewing the
1923            changes.
1924    
1925            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
1926            MainWindow.SaveSessionAs): Text string changes so the dialogs
1927            have more meaningful titles.
1928    
1929            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
1930            Classification method name from GetProperties to GetClassData.
1931    
1932            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
1933            instead of accessing now non-existent class variables.
1934    
1935  2003-02-24  Bernhard Herzog  <[email protected]>  2003-02-24  Bernhard Herzog  <[email protected]>
1936    
1937          * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove          * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26