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

Legend:
Removed from v.587  
changed lines
  Added in v.867

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26