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

Legend:
Removed from v.349  
changed lines
  Added in v.988

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26