/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.445  
changed lines
  Added in v.924

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26