/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Diff of /branches/greater-ms3/thuban/ChangeLog

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

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

Legend:
Removed from v.277  
changed lines
  Added in v.843

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26