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

Legend:
Removed from v.89  
changed lines
  Added in v.803

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26