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

Legend:
Removed from v.154  
changed lines
  Added in v.826

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26