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

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

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

revision 848 by frank, Wed May 7 07:20:52 2003 UTC revision 1360 by jonathan, Wed Jul 2 10:51:58 2003 UTC
# Line 1  Line 1 
1    2003-07-02  Jonathan Coles   <[email protected]>
2    
3            * Thuban/Model/classgen.py (generate_singletons,
4            generate_uniform_distribution, generate_quantiles,
5            GenQuantiles0): The denominator was one to high when
6            calculating the index for the ramp causing the index
7            to never to reach one.
8    
9    2003-07-02  Jonathan Coles   <[email protected]>
10    
11            Changed the singature of ClassGroupRange.__init__ and
12            ClassGroupRange.SetRange() so that the min/max values are
13            passed as a tuple. This makes a better calling scheme for
14            when a Range object is passed instead.
15    
16            * Thuban/Model/classgen.py: Fixed parameters to
17            ClassGroupRange constructor.
18    
19            * Thuban/Model/classification.py (ClassGroupRange.__init__):
20            Consolidate the min/max parameters into a single _range which
21            can either be a tuple or a Range object.
22            (ClassGroupRange.SetRange): Consolidate the min/max parameters
23            into a single _range which can either be a tuple or a Range object.
24    
25            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
26            call to ClassGroupRange constructor to use a tuple.
27    
28            * Thuban/Model/layer.py (Layer.SetClassification): Switch
29            the classification instance variable to the new class
30            before calling _set_layer otherwise subscribers to a
31            LAYER_CHANGED event will not see any difference.
32    
33            * test/test_classification.py: Fix tests of ClassGroupRange
34            so that they use the new signature.
35    
36            * test/test_load.py: Fix use of ClassGroupRange so that it
37            uses the new signature.
38    
39            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
40            uses the new signature.
41    
42            * test/test_save.py: Fix use of ClassGroupRange so that it
43            uses the new signature.
44    
45    
46    2003-07-01  Jonathan Coles   <[email protected]>
47    
48            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
49            Import used objects/class from color.
50            (generate_singletons): We don't
51            need the numGroups parameter anymore because we are using
52            the new ramps with GetProperties().
53            (generate_uniform_distribution): Use new ramp method
54            GetProperties().
55            (generate_quantiles, GenQuantiles0): Use new ramp method
56            GetProperties().
57            (CustomRamp.SetNumGroups): Removed. The ramps now map
58            a value from 0 to 1 to class properties so the number
59            of groups is not needed ahead of time.
60            (CustomRamp.next): Removed. CustomRamp does not support
61            interation anymore.
62            (CustomRamp.GetProperties): Returns a ClassGroupProperties
63            object based on the index value from 0 to 1 that is
64            passed to it.
65            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
66            Made into instances of Monochromatic class instread of
67            deriving from it.
68            (HotToCold.SetNumGroups): Removed. See CustomRamp.
69            (HotToCold.next): Removed. See CustomRamp.
70    
71            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
72            (Classification.SetField, Classification.SetFieldType):
73            Replaced with SetFieldInfo.
74            (Classification.SetFieldInfo): New. Does a better job of
75            what SetField and SetFieldType used to do by combining
76            their function since they should really always be done
77            at the same time.
78            (Classification.SetLayer): Renamed to _set_layer.
79            (Classification._set_layer): Should only be called from
80            Layer's SetClassification. This does not cause a recursive
81            call as SetLayer did because we know that Layer knows about
82            the classification.
83    
84            * Thuban/Model/color.py: Fixes RTbug #1971.
85            (_Transparent): Renamed from Transparent so it doesn't
86            conflict with the module variable.
87            (Transparent, Black): Renamed from Color.Transparent,
88            Color.Black so they are not class variables.
89    
90            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
91            (Layer.Destroy): We don't need to call SetClassification
92            anymore to clear out the back reference in the classifcation
93            to the layer. It's better to set it to None using _set_layer,
94            and we won't be creating another clas object too.
95            (Layer.SetClassification): Classification._set_layer is not
96            recursive so remove all the locking variables. Also clean
97            up the code so that it remains unchanged if something fails.
98    
99            * Thuban/Model/load.py: Fixes RTbug #1971.
100            (SessionLoader.start_classification): Call
101            Classification.SetFieldInfo().
102    
103            * Thuban/Model/save.py: Removed import of Color which wasn't
104            being used.
105    
106            * Thuban/UI/classgen.py: Fixes RTbug #1972.
107            (ClassGenDialog.__init__): Color ramps are now instances
108            already so we don't need to create any new objects.
109            (ClassGenDialog.OnOK): Check for numGroups is no longer
110            necessary because we never use it.
111    
112            * Thuban/UI/classifier.py: Fixes RTbug #1971.
113            (Classifier.__BuildClassification, Classifier.__SetGridTable):
114            Call Classification.SetFieldInfo() instead of SetFieldType.
115    
116            * Thuban/UI/renderer.py: Fixes RTbug #1971.
117    
118            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
119            (MapCanvas.__init__): Subscribe to the idle time event. Set
120            background color to white.
121            (MapCanvas.OnPaint): Set a flag indicating that we should
122            render the map during idle time. If we already have a bitmap
123            just draw it now.
124            (MapCanvas.OnIdle): New. Render the map only during idle time.
125            This also fixes a problem with the busy cursor under gtk.
126    
127            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
128            Fix calls to generate_singletons because the signature changed.
129    
130            * test/test_classification.py: Fix color references and
131            change calls to Classification.[SetField|SetFieldType] to
132            SetFieldInfo.
133    
134            * test/test_load.py: Fix color references.
135    
136            * test/test_load_0_2.py: Fix color references.
137    
138            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
139            Change calls to Classification.[SetField|SetFieldType] to
140            SetFieldInfo.
141    
142    2003-07-01  Frank Koormann   <[email protected]>
143    
144            MERGE from the greater-ms3 branch.
145    
146            * test/test_transientdb.py
147            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
148            New. Test join of two tables with partly equal column names.
149    
150            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
151            If duplicates in left and right tables column names are found,
152            append '_' (underscores) to the name until it is unique.
153            Create always new internal names for the resulting table and reference
154            columns in the join statement with <table>.<column>
155    
156    2003-07-01  Bernhard Herzog  <[email protected]>
157    
158            * test/test_transientdb.py
159            (TestTransientTable.test_transient_joined_table_same_column_name):
160            New. Test whether joining on columns with the same names in both
161            tables works.
162            
163            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
164            sure to use the right internal names even when joining on field
165            with the same names in both tables. Also, detect duplicate names
166            in the joined table correctly.
167    
168    2003-07-01  Frank Koormann   <[email protected]>
169    
170            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
171            Reverse List of layers to render in same order as in desktop legend.
172    
173    2003-06-30  Jonathan Coles   <[email protected]>
174    
175            * Thuban/version.py (make_tuple): Takes a version string
176            and splits it into a tuple of at most three integers.
177            Used make_tuple() to make tuple versions of the version
178            numbers.
179    
180            * Thuban/UI/about.py: Add Thuban email addresses.
181    
182    2003-06-30  Jonathan Coles   <[email protected]>
183    
184            * Thuban/version.py: SQLite/PySQLite version dependencies
185            were too high.
186    
187    2003-06-30  Jonathan Coles   <[email protected]>
188    
189            * Thuban/version.py: Update version to 0.8.1
190            
191            * MANIFEST.in: Added Projections so that default.proj is
192            included.
193    
194    2003-06-26  Jonathan Coles   <[email protected]>
195    
196            New About box with lots more information including library
197            versions and credits. More/better version checking before
198            Thuban starts.
199    
200            * Thuban/UI/about.py: New. New About box that displays
201            library version information and credits.
202    
203            * Thuban/version.py: Added new 'versions' dictionary which
204            contains the verions of various libraries which are checked
205            when the module loads.
206            (verify_versions): Check all version numbers and returns
207            a list of errors.
208    
209            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
210            Reset the status of the buttons as the situation warrants,
211            but in a better more reliable way by not relying on the
212            current status to determine what needs to change.
213    
214            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
215            (verify_versions): Remove most of the code since it is
216            now in Thuban.version.verify_versions.o
217    
218            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
219            About box in Thuban.UI.about.
220    
221            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
222            Returns the version of gdal library being used as a string.
223    
224            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
225            Removed.
226            (get_proj_version): Return the version of PROJ that the file
227            was compiled with.
228            (get_gtk_version): Return th version of GTK that the file
229            was compiled with.
230    
231    2003-06-25  Jonathan Coles   <[email protected]>
232    
233            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
234            of the SelectPropertiesDialog should be self so the window
235            appears on top.
236            (ClassGroupPropertiesCtrl.DoEdit): The parent
237            of the SelectPropertiesDialog should be self so the window
238            appears on top.
239    
240            * Thuban/UI/resource.py: Cleaned up how we determine file
241            extensions.
242            (GetImageResource): Return an wxImage from our Resources.
243    
244    2003-06-24  Jonathan Coles   <[email protected]>
245    
246            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
247            Check that a layer has a classification before trying
248            to get it. Raster layers don't have classifications.
249    
250    2003-06-23  Jonathan Coles   <[email protected]>
251            
252            * setup.py: Add Resources/XML to resource list.
253        
254    2003-06-23  Jonathan Coles   <[email protected]>
255    
256            * setup.cfg: Fix copyright dates
257        
258    2003-06-23  Jonathan Coles   <[email protected]>
259    
260            * MANIFEST.in: Update with Resources/XML
261    
262            * setup.py: Don't include Locale resources yet as we don't
263            have any and it causes problems building the distribution
264            for Windows. Update version to 0.8.0.
265    
266            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
267    
268            * Thuban/UI/mainwindow.py: Add blank line at the end because
269            file was not being read correctly building the Windows
270            distribution.
271    
272    2003-06-23  Jonathan Coles   <[email protected]>
273    
274            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
275    
276            * Thuban/version.py: Temporarily update longversion for
277            the 0.8 release so that it doesn't have the cvs revision.
278    
279    2003-06-23  Jonathan Coles   <[email protected]>
280    
281            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
282            to make sure that we don't create reentrant possibilities with
283            wxYield.
284    
285            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
286            directly to avoid the wxSafeYield() call which generates an
287            OnPaint event causing infinite recursion. Don't try to catch
288            exception anymore. This was for before there were limits on map
289            scaling.
290    
291    2003-06-23  Bernhard Herzog  <[email protected]>
292    
293            Bug fix for RT #1961:
294    
295            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
296            Register DerivedShapestores with the session
297    
298            * Thuban/Model/session.py (Session.Tables): Make sure each table
299            is only listed once.
300    
301            * test/test_load.py (TestJoinedTable.test): Add check_format call.
302            Update file contents to match the one written out.
303    
304    2003-06-20  Bernhard Herzog  <[email protected]>
305    
306            * test/xmlsupport.py (SaxEventLister.startElementNS)
307            (SaxEventLister.endElementNS): Do not include the qname. Python
308            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
309            is (presumably incorrectly) None, whereas it's a string with the
310            element name in the later versions.
311    
312            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
313            (TestEventList.test_even_list_namespace): Update tests to reflect
314            the new behaviour
315            (TestEventList.test_even_list_id_normalization): Fix doc-string
316    
317    2003-06-20  Jonathan Coles   <[email protected]>
318    
319            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
320            by deriving classes to determine if that layer supports shapes.
321            (Layer): Override HasShapes and return true.
322    
323            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
324            instead of a direct call to wx[Begin|End]CusyCursor().
325            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
326            table data.
327    
328            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
329            New. Wrappers around the wxWindows functions that allow us to
330            make additional calls such as wxYield which gives the native
331            system a chance to update the cursor correctly.
332    
333            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
334            instead of a direct call to wx[Begin|End]CusyCursor().
335    
336            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
337            instead of a direct call to wx[Begin|End]CusyCursor().
338            (MapCanvas.find_shape_at): Check if the current search layer
339            support shapes, otherwise go on to the next layer.
340    
341            * test/test_layer.py: Add tests in each type of layer for
342            HasClassification() and HasShapes()
343    
344    2003-06-20  Jonathan Coles   <[email protected]>
345    
346            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
347            turning on the busy cursor to allow the system to change the
348            cursor before we begin painting. This fixes a problem that
349            was occuring only under GTK. Fixes RTbug #1840.
350    
351    2003-06-20  Bernhard Herzog  <[email protected]>
352    
353            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
354            version.
355    
356            * Thuban/Model/save.py (sort_data_stores): New. Make topological
357            sort of the data sources so they can be written with sources that
358            data sources that depend on other data sources come after the
359            sources they depend on.
360            (SessionSaver.__init__): Add idmap instance variable to map from
361            objects to the ids used in the file.
362            (SessionSaver.get_id, SessionSaver.define_id)
363            (SessionSaver.has_id): New. Methods to manage the idmap
364            (SessionSaver.write): Use thuban-0.8.dtd
365            (SessionSaver.write_session): Add a namespace on the session and
366            write out the data sources before the maps.
367            (SessionSaver.write_data_containers): New. Write the data
368            containers.
369            (SessionSaver.write_layer): Layer elements now refer to a
370            shapestore and don't contain filenames anymore.
371    
372            * Thuban/Model/load.py (LoadError): Exception class to raise when
373            errors in the files are discovered
374            (SessionLoader.__init__): Define dispatchers for elements with a
375            thuban-0.8 namespace too.
376            (SessionLoader.check_attrs): New helper method to check and
377            convert attributes
378            (AttrDesc): New. Helper class for SessionLoader.check_attrs
379            (SessionLoader.start_fileshapesource)
380            (SessionLoader.start_derivedshapesource)
381            (SessionLoader.start_filetable, SessionLoader.start_jointable):
382            Handlers for the new elements in the new fileformat
383            (SessionLoader.start_layer): Handle the shapestore attribute in
384            addition to filename.
385            (SessionLoader.start_table, SessionLoader.end_table): Removed.
386            They were never used in the old formats and aren't needed for the
387            new.
388    
389            * Thuban/Model/session.py (Session.DataContainers): New method to
390            return all "data containers", i.e. shapestores and tables
391    
392            * test/xmlsupport.py (SaxEventLister.__init__)
393            (SaxEventLister.startElementNS, sax_eventlist): Add support to
394            normalize IDs.
395    
396            * test/test_xmlsupport.py
397            (TestEventList.test_even_list_id_normalization): New test case for
398            id normalization
399    
400            * test/test_load.py (LoadSessionTest.check_format): Use ID
401            normalization
402            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
403            class atrributes used for ID normalization
404            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
405            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
406            file format
407            (TestJoinedTable): New test for loading sessions with joined
408            tables.
409            (TestLoadError): New. Test whether missing required attributes
410            cause a LoadError.
411    
412            * test/test_save.py (SaveSessionTest.thubanids)
413            (SaveSessionTest.thubanidrefs): New class attributes for ID
414            normalization in .thuban files.
415            (SaveSessionTest.compare_xml): Use id-normalization.
416            (SaveSessionTest.testEmptySession)
417            (SaveSessionTest.testLayerProjection)
418            (SaveSessionTest.testRasterLayer)
419            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
420            (SaveSessionTest.testLayerProjection): The filename used was the
421            same as for testSingleLayer. Use a different one.
422            (SaveSessionTest.test_dbf_table)
423            (SaveSessionTest.test_joined_table): New test cases for saving the
424            new data sources structures.
425            (TestStoreSort, MockDataStore): Classes to test the sorting of the
426            data stores for writing.
427    
428            * test/runtests.py: Add CVS keywords
429    
430    2003-06-20  Jonathan Coles   <[email protected]>
431    
432            * test/test_session.py
433            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
434            Use the cultural_landmark-point.dbf file for the store so that
435            the table rows and shape count match.
436    
437    2003-06-20  Jonathan Coles   <[email protected]>
438    
439            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
440            an exception if the number of shapes is different from the
441            number of rows in the table. Address RTbug #1933.
442    
443            * test/test_layer.py (TestLayer.test_derived_store): Add
444            a test for the new exception in DerivedShapeStore.__init__.
445    
446            * test/support.py (FloatTestCase): Removed since there is
447            already FloatComparisonMixin. Fixes RTbug #1954.
448            (FloatComparisonMixin.assertFloatEqual): Include test for
449            infinity that was part of FloatTestCase.
450    
451            * test/test_range.py (RangeTest): Inherit from
452            support.FloatComparisonMixin now that we don't have
453            support.FloatTestCase.
454    
455    2003-06-20  Bernhard Herzog  <[email protected]>
456    
457            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
458            the implementation in xmlsupport instead.
459            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
460    
461            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
462            of test_save
463    
464    2003-06-20  Bernhard Herzog  <[email protected]>
465    
466            * test/test_load.py (LoadSessionTest.check_format): New helper
467            method to make sure the test files we load might have been written
468            by the current thuban version.
469            (ClassificationTest.TestLayers, TestSingleLayer.test)
470            (TestLayerVisibility.test, TestClassification.test)
471            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
472            Add check_format() calls and fix the thuban data to match the data
473            that would be written by saving the session loaded from it.
474    
475            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
476            the same class and function in test_save.
477    
478            * test/test_xmlsupport.py (TestEventList): New. test cases for
479            sax_eventlist
480    
481    2003-06-20  Bernhard Herzog  <[email protected]>
482    
483            * Resources/XML/thuban.dtd: Add comment about which versions of
484            Thuban are covered by this DTD
485            (map): Fix content model for layers and raster layers. There can
486            be any number or layers and raster layers in any order.
487    
488    2003-06-20  Jonathan Coles   <[email protected]>
489    
490            This is mainly about fixing RTbug #1949.
491    
492            * Thuban/Model/classification.py: Remove "from __future__"
493            import statement since python 2.2 is the earliest supported
494            version.
495    
496            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
497            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
498            depending on the units this projection *forwards* into.
499    
500            * Thuban/Model/save.py (SessionSaver.write_classification):
501            Remove unnecessary use of lambdas and nested functions.
502    
503            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
504            adjustment here if the map projection uses degrees.
505    
506            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
507            scale adjust code since it is now done before calling
508            this method. Don't do anything if the map projection
509            is None.
510    
511    2003-06-19  Bernhard Herzog  <[email protected]>
512    
513            Move version specific load tests to their own file.
514    
515            * test/test_load.py: Expand the doc-string to explain a bit how to
516            handle file format changes.
517            (TestClassification.test): Update the docstring as this test is
518            not about Thuban 0.2 anymore.
519    
520            * test/test_load_0_2.py: New file with the load tests for thuban
521            files created with Thuban 0.2 and earlier.
522    
523    2003-06-19  Bernhard Herzog  <[email protected]>
524    
525            Add XML validation to some of the tests. Validation will only be
526            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
527            To make the DTD available to the test cases it's moved into
528            Resources/XML
529    
530            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
531            for versions up to and including 0.2. Two slight changes: added an
532            encoding specification and fixed the comment which refered to
533            GRASS, not Thuban
534    
535            * test/xmlsupport.py: New support module for tests involving XML.
536            Currently there's a mix-in class for XML validation.
537    
538            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
539    
540            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
541            so that we can validate the
542            (SaveSessionTest.testEmptySession)
543            (SaveSessionTest.testSingleLayer)
544            (SaveSessionTest.testSingleLayer)
545            (SaveSessionTest.testLayerProjection)
546            (SaveSessionTest.testRasterLayer)
547            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
548    
549            * test/runtests.py (main): Call print_additional_summary instead
550            of print_garbage_information
551    
552            * test/support.py (resource_dir): New function to return the
553            "Resource" subdirectory
554            (print_additional_summary): New function to combine several
555            summary functions
556            (run_tests): Use print_additional_summary instead of calling
557            print_garbage_information directly
558    
559    2003-06-19  Bernhard Herzog  <[email protected]>
560    
561            * Doc/thuban.dtd (classification): Correct the content model of
562            the classification element.
563            (projection): Add the "name" attribute
564    
565    2003-06-19  Frank Koormann   <[email protected]>
566    
567            MERGE from the greater-ms3 branch.
568    
569            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
570            scale if projection is latlong to get better estimate.
571    
572            Fix problem of hidden properties dialog under windows after double
573            click on layer tree:
574            The tree control always gets an Expanded / Collapsed event after
575            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
576            raises the already displayed window.
577    
578            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
579            raiseProperties initialized to prevent endless loops
580            (LegendTree._OnItemActivated): Depending on self.raiseProperties
581            simply raise the properties or open the dialog and issue a second
582            event.
583    
584    2003-06-18  Jonathan Coles   <[email protected]>
585    
586            * setup.py: Fix a few problems that occured under Windows.
587    
588    2003-06-18  Jonathan Coles   <[email protected]>
589    
590            When Thuban loaded the map was redrawn twice because the
591            legend was being opened after the mainwindow was created
592            and not during its creation. This meant the map was drawn
593            initially and then had to be redrawn when the legend
594            caused the display to change. Now the legend is opened
595            in the mainwindow constructor which resolves this issue.
596    
597            Also, although we were checking for the existence of
598            gdal and gdalwarp modules, the gdalwarp extension was
599            still being compiled (which may fail if the system doesn't
600            have gdal installed). the build_ext command to setup.py
601            now accepts the flags --with-gdal and --without-gdal.
602            If --without-gdal is specified setup.py will try to
603            use the gdal parameters specified by gdal-config. Under
604            windows, those parameters have to be set in setup.py
605            as with proj4 an wxWindows.
606    
607            * setup.py: Use a list instead of seperate variables for
608            extension parameters so we can create a generic function
609            that runs an appropriate *-config script.
610            (run_cs_script): Renamed from run_wx_script and modified
611            to accept a second argument which is a list of lists to
612            be filled in by the values returned from running the command.
613            (thuban_build_ext): New. Extends the build_ext command and
614            provides the options --with-gdal/--without-gdal which then
615            optionally includes the gdalwarp extension.
616    
617            * Thuban/Model/resource.py: First check if we can import
618            the gdalwarp Thuban extension before checking for gdal.
619            Also added some comments.
620            
621            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
622            the map is None which may be the case if none has been loaded
623            yet.
624    
625            * Thuban/UI/main.py (main): Remove call to ShowLegend.
626    
627            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
628    
629            * Thuban/UI/renderer.py: Check for gdal support before importing
630            gdalwarp.
631            (MapRenderer.render_map): Only try to optimize if we have gdal
632            support otherwise nothing will get drawn.
633    
634            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
635            during startup before a map has been created. Check if map is None
636            before using it and do nothing if it is.
637    
638    2003-06-17  Jonathan Coles   <[email protected]>
639    
640            Fix the problem with raster layers under Windows that caused
641            Thuban to crash. The view should respond to layer projection
642            changed events to update the display. Changes to a projection
643            should not cause the map to be set to full extent.
644            
645            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
646            current_map_proj to remember the current map projection so that
647            when the projection changes we know what the previous projection
648            was.
649            (MapCanvas.SetMap): Unsubscribe and subscribe to
650            LAYER_PROJECTION_CHANGED events.
651            (MapCanvas.projection_changed): Split into two methods that respond
652            to map and layer projection changes.
653            (MapCanvas.map_projection_changed): New. Takes the current view and
654            projects it using the new projection. This does not cause the
655            map to be redrawn at full extent.
656            (MapCanvas.layer_projection_changed): New. Cause a redraw which
657            will draw each layer in its new projection.
658            
659            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
660            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
661            under Windows.
662            
663            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
664            to twice sizeof(void*) because there are two digits for each
665            hex byte.
666    
667    2003-06-16  Bernhard Herzog  <[email protected]>
668    
669            Update to the layer interface: Direct access to the table,
670            shapetable, shapefile and filename attributes is now actively
671            deprecated by issuing deprecation warnings for all places where
672            this happens.
673    
674            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
675            to the instance variables table, shapetable, shapefile and
676            filename via __getattr__ so that we can issue a deprecation
677            warning.
678            (Layer.SetShapeStore): Don't set the deprecated instance variables
679            any more
680            (Layer.SetShapeStore): Don't use deprecated layer instance
681            variables
682            (Layer.Destroy): No need to explicitly remove the instance
683            variables any more
684            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
685            instance variables
686    
687            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
688            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
689            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
690            use deprecated layer instance variables
691    
692            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
693            deprecated layer instance variables
694    
695            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
696            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
697            instance variables
698    
699            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
700            deprecated layer instance variables
701    
702            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
703            deprecated layer instance variables
704    
705            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
706            deprecated layer instance variables
707    
708            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
709            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
710            variables
711    
712            * test/runtests.py (main): Turn Thuban's deprecation warnings into
713            errors so that they're cought by the tests
714    
715            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
716            layer instance variables
717    
718    2003-06-16  Jonathan Coles   <[email protected]>
719    
720            Fix a problem under Windows whereby if the user double-clicks on a
721            layer in the legend that tree item will expand or collapse as well
722            as open the layer properties dialog. The state of the tree item
723            should not be affected.
724    
725            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
726            preventExpandCollapse and subscribe to expanding and collapsing
727            events.
728            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
729            collapsing events and will veto the event if it has been triggered
730            by the user double clicking on a layer.
731            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
732            that an expanding/collapsing event should be vetoed.
733    
734    2003-06-13  Bernhard Herzog  <[email protected]>
735    
736            * Thuban/UI/classifier.py (Classifier.OnClose)
737            (Classifier.map_layers_removed)
738            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
739            in OnClose and not in map_layers_removed or
740            layer_shapestore_replaced to make sure it always happens when the
741            dialog is closed
742    
743    2003-06-13  Jonathan Coles   <[email protected]>
744    
745            This puts back a fix for Windows where a panel is needed so that
746            the background of the table view appears correctly.
747    
748            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
749            object that can be used by derived classes to place any
750            controls (including the grid) onto.
751            (QueryTableFrame.__init__): Use the panel as the parent window
752            for all the controls. Reparent the grid so that the panel is
753            the parent. Call UpdateStatusText() to correctly initialize
754            the status bar.
755    
756    2003-06-13  Jonathan Coles   <[email protected]>
757    
758            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
759            from wxFrame (as opposed to wxDialog like the other classes)
760            but otherwise behaves like the other classes. This is needed
761            for the TableView which isn't really a dialog and needs to
762            have a status bar and control buttons.
763    
764            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
765            instance variable to keep track of how many rows are selected.
766            Subscribe once to the the events we are interested in.
767            (ThubanGrid.OnRangeSelect): Only handle event if event handling
768            hasn't been turned off.
769            (ThubanGrid.OnSelectCell): Only handle event if event handling
770            hasn't been turned off.
771            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
772            as an event listener (which changes the event handler stack)
773            simply set an instance variable to False. This is checked in
774            the event handlers.
775            (ThubanGrid.GetNumberSelected): Return the number of currently
776            selected rows.
777            (TableFrame): Inherit from ThubanFrame so we can have a
778            status bar and control buttons.
779            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
780            Explicitly set which items are selected in the operator choice and
781            action choice so there is always a valid selection. Fixes RTbug #1941.
782            Subscribe to grid cell selection events so we can update the
783            status bar.
784            (QueryTableFrame.UpdateStatusText): Update the status bar with
785            how many rows are in the grid, how many columns, and how many
786            rows are selected.
787            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
788            Call UpdateStatusText when cells are (de)selected.
789            (QueryTableFrame.OnQuery): Use the string value in the value
790            combo if either the selected item index is 0 or if the string
791            cannot be found in the predefined list (this happens if the
792            user changes the text). Fixes RTbug #1940.
793            Only turn off the grid event listeners if there a query comes
794            back with a none empty list of ids. in the case that the list
795            is empty this causes a grid.ClearSelection() call to actually
796            clear the grid selection which causes the selected items in
797            the map to be deselected. Fixes RTbug #1939.
798    
799            * test/test_save.py (XMLWriterTest.Encode): Check return values.
800            Fixes RTbug #1851.
801    
802    2003-06-13  Bernhard Herzog  <[email protected]>
803    
804            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
805            self.selected_shape with the current selection to make sure the
806            contents of the dialog are up to date when it's shown for the
807            first time.
808            The dialog used to work without this by luck. The recent fix to
809            the connector module 'broke' a 'feature' the identify view was
810            relying on, i.e that subscribing to a message in response to
811            receiving a message of that type would mean that the new
812            subscriber would also be called for the same message.
813            
814    2003-06-12  Jonathan Coles   <[email protected]>
815    
816            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
817            the image is rendered. Fixes RTbug #1937.
818    
819    2003-06-12  Jonathan Coles   <[email protected]>
820    
821            * Thuban/Lib/fileutil.py: As is done under Windows, create the
822            user directory if it doesn't exist on a posix system.
823            Fixes RTbug #1815.
824    
825            * Thuban/Model/resource.py (get_user_proj_files): Moved the
826            called to get_application_dir here, so that the directory
827            will only be called if this method is invoked.
828    
829            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
830            the projfilepath if no projection is selected.
831    
832    2003-06-12  Jonathan Coles   <[email protected]>
833    
834            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
835            the scalebar if the current map has no projection set.
836    
837            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
838            projfilepath label to just the basename of the projection file
839            rather than include the entire path.
840    
841            * Thuban/Model/resource.py: Fix missed proj functions that
842            needed to be renamed.
843    
844    2003-06-12  Jonathan Coles   <[email protected]>
845    
846            * Thuban/Model/classification.py: Removed assert statements that
847            tested if the variable was an instance of Color.
848    
849            * Thuban/Model/color.py (Color): Remove commented code that isn't
850            used.
851            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
852            Fixes RTbug #1835.
853            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
854            Needed now that the class doesn't inherit from Color.
855    
856    2003-06-12  Jonathan Coles   <[email protected]>
857    
858            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
859            check unicode strings.
860    
861            * test/test_layer.py: Check for existence of gdal.
862    
863    2003-06-12  Jonathan Coles   <[email protected]>
864        
865            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
866            that was in load.py
867    
868            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
869            that was in save.py
870    
871    2003-06-12  Jonathan Coles   <[email protected]>
872    
873            This is largely a collection of bug fixes. We also handle the
874            case where gdal is not on the system. The XMLReader and XMLWriter
875            classes were moved into there own files to resolve some circular
876            import references and because they shouldn't really be in the
877            file that is dediciated to reading/writing session files since
878            they are also used elsewhere.
879    
880            * Thuban/Model/classgen.py: Renamed functions to follow the
881            function_names_with_underscores style. Fixes RTbug #1903.
882            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
883    
884            * Thuban/Model/layer.py: Import gdal only if it available.
885            (RasterLayer): Handle the case where the gdal library is unavailable.
886            Addresses RTbug #1877.
887    
888            * Thuban/Model/load.py (XMLReader): Moved into seperate file
889            xmlreader.py.
890    
891    2003-06-12  Jonathan Coles   <[email protected]>
892    
893            This is largely a collection of bug fixes. We also handle the
894            case where gdal is not on the system. The XMLReader and XMLWriter
895            classes were moved into there own files to resolve some circular
896            import references and because they shouldn't really be in the
897            file that is dediciated to reading/writing session files since
898            they are also used elsewhere.
899    
900            * Thuban/Model/classgen.py: Renamed functions to follow the
901            function_names_with_underscores style. Fixes RTbug #1903.
902            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
903    
904            * Thuban/Model/layer.py: Import gdal only if it available.
905            (RasterLayer): Handle the case where the gdal library is unavailable.
906            Addresses RTbug #1877.
907    
908            * Thuban/Model/load.py (XMLReader): Moved into seperate file
909            xmlreader.py.
910    
911            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
912            file xmlwriter.py.
913    
914            * Thuban/Model/resource.py: Renamed functions to following the
915            function_names_with_underscores style.
916            (has_gdal_support): New function that returns true if the gdal
917            library is available. Addresses RTbug #1877.
918    
919            * Thuban/UI/application.py (ThubanApplication.OpenSession):
920            Display a message box if the gdal library is not available, but
921            only if there are any layers that would use it. Addresses RTbug #1877.
922    
923            * Thuban/UI/classgen.py: Use renamed projection resource functions.
924            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
925            when using integers versus floats.
926    
927            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
928            determine if the "Add Image Layer" menu option should be
929            greyed out or not. Addresses RTbug #1877.
930    
931            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
932    
933            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
934            optimize if a raster layer is visible. Fixes RTbug #1931.
935            Only draw the raster layer if the gdal library is available.
936            Addresses RTbug #1877.
937    
938            * test/test_classgen.py: Add tests for generate_singletons,
939            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
940            (test_calculate_quantiles): Fix some tests to catch the new
941            ValueError that is raised.
942    
943            * test/test_proj.py: Use renamed projection resource functions.
944    
945            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
946            test for saving classified layers. Fixes RTbug #1902.
947            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
948    
949    2003-06-12  Jan-Oliver Wagner <[email protected]>
950    
951            Fix for http://intevation.de/rt/webrt?serial_num=1900.
952    
953            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
954    
955            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
956            multiplechoicedialog.py rather than from the wxPython library.
957    
958    2003-06-11  Frank Koormann  <[email protected]>
959    
960            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
961            update.
962    
963    2003-06-11  Frank Koormann  <[email protected]>
964    
965            * Thuban/Lib/fileutil.py (get_application_dir): New function to
966            determine the absolute .thuban/thuban directory under
967            "posix" (os.expanduser) and "nt" (read AppData registry key).
968    
969            * Thuban/Model/resource.py: Use get_application_dir
970    
971            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
972            Use get_application_dir.
973    
974    2003-06-10  Bernhard Herzog  <[email protected]>
975    
976            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
977            the messages MAP_LAYERS_REMOVED messages
978            (LayerTableFrame.OnClose): Unsubscribe from it.
979            (LayerTableFrame.map_layers_removed): New. Receiver for
980            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
981            dialog is showing is removed.
982    
983    2003-06-10  Bernhard Herzog  <[email protected]>
984    
985            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
986            of the receivers list so that unsubscribing in a receiver doesn't
987            modify it while iterating over it.
988    
989            * test/test_connector.py
990            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
991            unsubscribing in a receiver works correctly. See docstring for
992            details
993    
994    2003-06-10  Bernhard Herzog  <[email protected]>
995    
996            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
997            message.
998    
999            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1000            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1001            LAYER_CHANGED will still be sent if the classification changes.
1002    
1003            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1004            parameter so we can subscribe to some of its messages
1005            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1006            and the layer's LAYER_SHAPESTORE_REPLACED
1007            (Classifier.unsubscribe_messages): New. Unsubscribe from message
1008            subscribed to in __init__
1009            (Classifier.map_layers_removed)
1010            (Classifier.layer_shapestore_replaced): receivers for the messages
1011            subscribed to in __init__. Unsubscribe and close the dialog
1012    
1013            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1014            the map to the Classifier dialog
1015    
1016            * test/test_layer.py (SetShapeStoreTests): Derive from
1017            SubscriberMixin as well so we can test messages
1018            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
1019            messages
1020            (SetShapeStoreTests.tearDown): Clear the messages again
1021            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
1022            for the modified flag too
1023            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
1024            to check whether SetShapeStore sets the modified flag
1025            (SetShapeStoreTests.test_set_shape_store_different_field_name)
1026            (SetShapeStoreTests.test_set_shape_store_same_field)
1027            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
1028            Add tests for the messages. This checks both the new
1029            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
1030    
1031    2003-06-06  Jan-Oliver Wagner <[email protected]>
1032    
1033            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
1034            the menu items.
1035    
1036    2003-06-05  Frank Koormann  <[email protected]>
1037    
1038            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1039            Layout reimplemented without panel. Make life easier to fit the list
1040            in the dialog.
1041    
1042    2003-06-05  Frank Koormann  <[email protected]>
1043    
1044            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
1045            once on initialisation (Former implementation resulted in multiple
1046            entries for each projection).
1047            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
1048            if set, select the projection found under the specified name. This
1049            overwrites any other selection estimate.
1050            Removed projchoice filling from this method.
1051            (ProjFrame._OnSave, ProjFrame._OnAddToList):
1052            Updated call of ProjFrame.__FillAvailList
1053            (LCCPanel._DoLayout): Moved parameter controls in more common order.
1054    
1055            * Resources/Projections/defaults.proj: Extended defaults representing
1056            various common European projections.
1057    
1058    2003-06-05  Frank Koormann  <[email protected]>
1059    
1060            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1061            Use ListCtrl instead of GridCtrl
1062    
1063            * Thuban/Model/resource.py:
1064            Guess location of .thuban directory from tempdir parent directory.
1065    
1066            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1067            Guess location of .thuban directory from tempdir parent directory.
1068    
1069    2003-06-04  Bernhard Herzog  <[email protected]>
1070    
1071            Do not cache the values returned by the tree widget's
1072            GetFirstChild and GetNextChild methods because it led to lots of
1073            segfaults. The new way requires more brute force but is more
1074            reliable.
1075    
1076            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
1077            variable layer2id
1078            (LegendTree.find_layer): New method to do with brute force what
1079            layer2id tried to accomplish
1080            (LegendTree._OnMsgLayerChanged)
1081            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
1082            Use find_layer instead of layer2id
1083            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
1084            update layer2id anymore
1085            (LegendTree._OnMsgMapLayersRemoved)
1086            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
1087    
1088    2003-06-03  Thomas Koester  <[email protected]>
1089    
1090            * Thuban/Model/classgen.py (GenQuantiles0): New function.
1091    
1092    2003-06-02  Bernhard Herzog  <[email protected]>
1093    
1094            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
1095            New commands.
1096            (main_menu): Add the new commands.
1097            (MainWindow.TableRename): New. Implementation of the table_rename
1098            command.
1099            (MainWindow.RenameLayer): New. Implementation of the layer_rename
1100            command.
1101    
1102            * Thuban/Model/session.py (Session.AddTable): call self.changed to
1103            set the modified flag
1104    
1105            * test/test_session.py (TestSessionSimple.test_add_table): Test
1106            whether the modified flag is set properly
1107    
1108            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
1109            instead of issue so that the modified flags get updated.
1110    
1111            * test/test_base.py (SomeTitledObject): Derive from Modifiable
1112            instead of Publisher to reflect reality better and to accomodate
1113            the fact that SetTitle now calls changed instead of issue
1114    
1115    2003-06-02  Bernhard Herzog  <[email protected]>
1116    
1117            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
1118            acquisition has to happen before the try in a try-finally.
1119    
1120    2003-06-02  Bernhard Herzog  <[email protected]>
1121    
1122            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
1123            possible that a layer is removed that is not currently selected in
1124            the legend so don't check for this.
1125    
1126    2003-05-30  Bernhard Herzog  <[email protected]>
1127    
1128            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
1129            variables to None that have direct or indirect references to
1130            shapefiles or dbf files to make sure that they do go away and the
1131            files are closed.
1132    
1133    2003-05-30  Bernhard Herzog  <[email protected]>
1134    
1135            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
1136            availImgListIndices when a new image list is created
1137            
1138    2003-05-30  Bernhard Herzog  <[email protected]>
1139    
1140            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
1141            changing_selection to indicate whether the LegendTree code itself
1142            is currently changing the selection
1143            (LegendTree.normalize_selection): New method to normalize the
1144            selection by selecting the layer item even if the user clicked on
1145            the classification.
1146            (LegendTree._OnSelChanged): normalize the selection. This works
1147            around a bug in wx which doesn't keep track of the selection
1148            properly when subtrees are deleted.
1149    
1150    2003-05-30  Bernhard Herzog  <[email protected]>
1151    
1152            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
1153            maximum and minimum scale factors.
1154    
1155            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
1156            changes in classgen.py
1157    
1158    2003-05-30  Jonathan Coles   <[email protected]>
1159    
1160            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
1161            all the methods functions. Fixes RTBug #1903.
1162    
1163            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
1164            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
1165            RTBug #1907.
1166    
1167            * Thuban/UI/classgen.py: Use classgen functions that were part
1168            of the ClassGenerator class. Put try/finally blocks around
1169            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
1170            RTBug #1904.
1171    
1172            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
1173    
1174            * Thuban/UI/legend.py: The legend was cleared and repopulated any
1175            time something changed which caused some state to be lost such
1176            as which children were expanded or collapsed. Fixes RTBug #1901.
1177            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
1178            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
1179            the legend but not in the map.
1180            (LegendTree.__FillTree): Move main functionality out into smaller
1181            methods that can be used by other methods.
1182            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
1183            if they are available.
1184            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
1185            that we override the wxTreeCtrl method. Iterate over children
1186            and call __RemoveLayer.
1187            (LegendTree.__AddLayer): New. Add a new layer to the legend.
1188            (LegendTree.__RemoveLayer): Remove a layer from the legend.
1189            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1190            Should only be called with the id of a layer branch.
1191            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1192            Returns the root item or creates one if necessary.
1193    
1194            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1195            ProjectRasterFile with tuple arguments instead of strings.
1196    
1197            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1198            with try/finally. Fixes RTBug #1904.
1199    
1200            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1201            with try/finally. Fixes RTBug #1904.
1202            (MapCanvas.FitSelectedToWindow): If a single point is selected
1203            simply center it on the display. Fixes RTBug #1849.
1204    
1205            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1206            to be compiled as a standalone app. Now the code can only be
1207            called from Python which simplifies the parameter passing.
1208            (ProjectRasterFile): Handle Python arguments. Remove code that
1209            checks for a destination dataset. Add more clean up code.
1210    
1211            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1212            TestMapWithContents.test_lower_layer_bottom):
1213            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1214            Fixes RTBug #1907.
1215    
1216            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1217            extent to the map when the legend is toggled. Fixes RTBug #1881.
1218    
1219    2003-05-29  Jan-Oliver Wagner <[email protected]>
1220    
1221            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1222            unsubscribes all that is subcribed in __init__.
1223    
1224    2003-05-28  Bernhard Herzog  <[email protected]>
1225    
1226            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1227            (MainWindow.CanDuplicateLayer): New methods to implement the
1228            Layer/Duplicate command.
1229            (layer_duplicate command): New.
1230            (main_menu): Add layer_duplicate to the Layer menu.
1231    
1232    2003-05-28  Bernhard Herzog  <[email protected]>
1233    
1234            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
1235            renderer so that NULL/None values get displayed differently (by a
1236            gray rectangle).
1237            (TableGrid.__init__): Override the default renderers
1238    
1239    2003-05-28  Bernhard Herzog  <[email protected]>
1240    
1241            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
1242            classification to "None" if the type of the field has changed.
1243    
1244            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
1245            test for the Layer.SetShapeStore method
1246    
1247    2003-05-28  Jan-Oliver Wagner <[email protected]>
1248    
1249            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
1250            does not necessarily have a filename).
1251    
1252    2003-05-28  Jan-Oliver Wagner <[email protected]>
1253    
1254            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1255            sort the selection list for the dialog.
1256    
1257    2003-05-28  Frank Koormann  <[email protected]>
1258    
1259            * extensions/thuban/wxproj.cpp
1260            (project_point): Removed cast to int for projected point coordinates.
1261            (shape_centroid): Return last point if all polygon vertices fall
1262            to one point.
1263    
1264    2003-05-28  Bernhard Herzog  <[email protected]>
1265    
1266            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
1267            with layers that don't have shapestores, i.e. raster layers.
1268    
1269    2003-05-28  Bernhard Herzog  <[email protected]>
1270    
1271            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
1272            when determining the title from the filename.
1273    
1274            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
1275            reflect changes in the way the title is derived from the filename
1276    
1277    2003-05-28  Frank Koormann  <[email protected]>
1278    
1279            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
1280            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
1281    
1282    2003-05-27  Bernhard Herzog  <[email protected]>
1283    
1284            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
1285            delegate SelectedLayer.
1286            (MainWindow.LayerUnjoinTable): Implement.
1287            (_can_unjoin): New. Helper function for the sensitivity of the
1288            layer/unjoin command.
1289    
1290            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
1291            (DerivedShapeStore.OrigShapeStore): New. Return the original
1292            shapestore. Used to figure out how to unjoin.
1293            (DerivedShapeStore.Shapefile): Fix a typo.
1294    
1295    2003-05-27  Bernhard Herzog  <[email protected]>
1296    
1297            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
1298            well
1299            (JoinDialog.__init__): Use the layer parameter and only build the
1300            left choice when a layer is given
1301            (JoinDialog.OnJoin): Handle layer joins as well
1302            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1303            that the user selects the "Select..." item. The sensitivitly
1304            updating is now in update_sensitivity
1305            (JoinDialog.y): New method to refactor the sensitivity update of
1306            the join button into its own method.
1307    
1308            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1309    
1310    2003-05-27  Bernhard Herzog  <[email protected]>
1311    
1312            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1313            iff there are unreferenced tables in the session
1314    
1315    2003-05-27  Bernhard Herzog  <[email protected]>
1316    
1317            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1318    
1319            * Thuban/Model/session.py (Session.UnreferencedTables): New method
1320            to return tables that are not referenced by other tables or shape
1321            stores and can be removed.
1322            (Session.RemoveTable): Issue a TABLE_REMOVED message after
1323            removing the table
1324    
1325            * Thuban/UI/mainwindow.py: Remove unused imports
1326            (MainWindow.TableClose): Implement.
1327    
1328            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1329            messages so that the frame will be automatically closed when a new
1330            session is opened or the table is removed.
1331            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1332            __init__
1333            (TableFrame.close_on_session_replaced)
1334            (TableFrame.close_on_table_removed): New. Subscribers that close
1335            the window
1336    
1337            * test/test_session.py (TestSessionMessages.test_remove_table)
1338            (TestSessionSimple.test_remove_table): Move the test to
1339            TestSessionSimple and add test for the TABLE_REMOVED message
1340            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1341            (TestSessionSimple.test_unreferenced_tables) New. Test for the
1342            UnreferencedTables method.
1343            (UnreferencedTablesTests): New. Class with some more sophisticated
1344            tests for UnreferencedTables.
1345    
1346    2003-05-27  Frank Koormann  <[email protected]>
1347    
1348            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
1349            display has some unwanted side effects. Removed again.
1350    
1351    2003-05-27  Frank Koormann  <[email protected]>
1352    
1353            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1354    
1355            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1356    
1357    2003-05-27  Jan-Oliver Wagner <[email protected]>
1358    
1359            * test/test_menu.py (MenuTest.test): Added test for
1360            Menu.RemoveItem().
1361    
1362            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1363            the menu.
1364    
1365    2003-05-27  Frank Koormann  <[email protected]>
1366            
1367            Nonmodal dialogs without parent (i.e. they can fall behind the main
1368            window)
1369    
1370            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
1371            all dialogs in the dialogs dictionary and the canvas.
1372    
1373            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
1374            parent, i.e. can fall behind other windows.
1375            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
1376            dictionary before removing it.
1377    
1378            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
1379    
1380            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
1381            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
1382            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
1383    
1384    2003-05-27  Bernhard Herzog  <[email protected]>
1385    
1386            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
1387            tableview dialog
1388            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
1389            Also, don't use the table's titles as the dialog names. The titles
1390            aren't guaranteed to be unique.
1391            (MainWindow.TableOpen): Open a table view dialog after opening the
1392            table
1393    
1394    2003-05-27  Bernhard Herzog  <[email protected]>
1395    
1396            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
1397            effect can be achieved by simply closing the window showing the
1398            table.
1399            (MainWindow.TableHide): Removed.
1400            (main_menu): Removed "table_hide"
1401    
1402    2003-05-27  Frank Koormann  <[email protected]>
1403    
1404            Fix legend tree display problems under Win32
1405    
1406            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
1407            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
1408            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
1409    
1410            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
1411    
1412    2003-05-27  Jan-Oliver Wagner <[email protected]>
1413    
1414            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
1415            'after' now allows to insert separators almost anywhere in the menu.
1416    
1417    2003-05-27  Frank Koormann  <[email protected]>
1418    
1419            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
1420            "S" of selection box label to hint on hot key (Alt-S). Works under
1421            Win32 but is ignored under GTK.
1422    
1423    2003-05-26  Frank Koormann  <[email protected]>
1424    
1425            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
1426            Center Choices.
1427    
1428    2003-05-26  Bernhard Herzog  <[email protected]>
1429    
1430            Remove the Precision methods again. They're too DBF specific to be
1431            part of the table interface and they're only used in table_to_dbf
1432            anyway.
1433            
1434            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
1435            fixed precision of 12 for doubles.
1436            (TransientTableBase.Precision): Removed
1437            (AutoTransientTable.Width): Delegate to self.table.
1438    
1439            * Thuban/Model/table.py (DBFTable.Precision)
1440            (MemoryTable.Precision): Removed.
1441            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
1442            (table_to_dbf): Use a fixed precision of 12 for floats unless the
1443            column object specifies something else.
1444    
1445            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
1446            test for table_to_dbf
1447    
1448    2003-05-26  Bernhard Herzog  <[email protected]>
1449    
1450            * test/test_transientdb.py
1451            (TestTransientTable.run_iceland_political_tests): Fix a comment.
1452    
1453    2003-05-26  Bernhard Herzog  <[email protected]>
1454    
1455            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
1456            implementation. Mark parts of the file format strings for
1457            localization.
1458    
1459            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
1460            file and add the table to the tables managed by the session
1461    
1462            * test/test_session.py (TestSessionSimple.test_open_table_file):
1463            New. test case for OpenTableFile
1464    
1465    2003-05-26  Jan-Oliver Wagner <[email protected]>
1466    
1467            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
1468            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
1469            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
1470            Replace the true/false of wxWindows by True/False of Python 2.2.1.
1471    
1472    2003-05-26  Jan-Oliver Wagner <[email protected]>
1473    
1474            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
1475            already a selection present, update the grid accordingly.
1476    
1477            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
1478            resizeable and increase its initial size.
1479    
1480    2003-05-26  Frank Koormann  <[email protected]>
1481    
1482            Table export functionality
1483    
1484            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
1485            Return width (in characters) for a column.
1486            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
1487            (table_to_dbf): Write table to dbf file.
1488            (table_to_csv): Write table to csv file.
1489    
1490            * Thuban/Model/transientdb.py (TransientTableBase.Width,
1491            TransientTableBase.Precision): Return column width and precision.
1492    
1493            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
1494            or table_to_csv depending on file selection.
1495    
1496            * test/test_dbf_table.py:
1497            Test table_to_dbf (extension of former part of test).
1498    
1499            * test/test_csv_table.py:
1500            Test table_to_csv.
1501    
1502    2003-05-23  Jan-Oliver Wagner <[email protected]>
1503    
1504            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
1505            Use QueryTableFrame instead of TableFrame.
1506    
1507            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
1508            table window with 'Layer Table:' instead of 'Table:'.
1509    
1510    2003-05-23  Jan-Oliver Wagner <[email protected]>
1511    
1512            Give all tables a title via mix-in TitledObject.LayerShowTable
1513    
1514            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
1515            only if it exists.
1516    
1517            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
1518            and call its init-method with a default title. Remove Title() method.
1519    
1520            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
1521            AutoTransientTable): mix-in TitledObject and call its init-method with
1522            a default title. Remove Title() method.
1523    
1524    2003-05-23  Bernhard Herzog  <[email protected]>
1525    
1526            * Thuban/Model/session.py (Session.AddShapeStore): Define
1527            AddShapeStore analogously to AddTable.
1528    
1529            * test/test_session.py (TestSessionSimple.test_add_shapestore):
1530            New. Test for AddShapeStore
1531    
1532    2003-05-23  Jan-Oliver Wagner <[email protected]>
1533    
1534            Introducing QueryTableFrame and a very coarse ShowTable implementation.
1535    
1536            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
1537            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
1538            The latter implements the selection GUI without dependency on a layer.
1539            LayerTableFrame now is derived from QueryTableFrame and connects
1540            to a layer.
1541    
1542            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
1543            implementation that still needs work.
1544    
1545            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
1546    
1547    2003-05-22  Frank Koormann  <[email protected]>
1548    
1549            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1550            Added "outer_join = False" as optional parameter.
1551            (TransientJoinedTable.create): If outer join is true, perform a
1552            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
1553            the left table. Records not matching are filled with 0 / None.
1554    
1555            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
1556            (JoinDialog.OnJoin): Consider outer join check box.
1557    
1558    2003-05-22  Bernhard Herzog  <[email protected]>
1559    
1560            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
1561            somewhat safer way. Storing the traceback in a local variable can
1562            lead to memory leaks
1563    
1564    2003-05-22  Bernhard Herzog  <[email protected]>
1565    
1566            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
1567            the wxMessageDialog's Destroy() method.
1568    
1569    2003-05-22  Frank Koormann  <[email protected]>
1570    
1571            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
1572            TransientTable.Title()
1573    
1574    2003-05-22  Frank Koormann  <[email protected]>
1575    
1576            Join Dialog, initial version.
1577    
1578            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
1579    
1580            * Thuban/UI/join.py (JoinDialog): Functional implementation of
1581            former framework. Renamed Table1/Table2 to LeftTable/RightTable
1582            in all occurences.
1583    
1584            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
1585            Typo fixed.
1586    
1587    2003-05-22  Bernhard Herzog  <[email protected]>
1588    
1589            Give the tables titles so that the GUI can display more meaningful
1590            names. For now the titles are fixed but depend on e.g. filenames
1591            or the titles of the joined tables.
1592    
1593            * Thuban/Model/transientdb.py (TransientTable.Title)
1594            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1595    
1596            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1597    
1598            * test/test_transientdb.py
1599            (TestTransientTable.test_auto_transient_table_title): New. Test
1600            for the Title method
1601            (TestTransientTable.test_transient_joined_table)
1602            (TestTransientTable.test_transient_table): Add test for the Title
1603            methods
1604    
1605            * test/test_memory_table.py (TestMemoryTable.test_title): New.
1606            Test for the Title method
1607    
1608            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1609            the Title method
1610    
1611    2003-05-22  Bernhard Herzog  <[email protected]>
1612    
1613            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1614            Provide a better way to destroy the layers
1615            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1616            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1617            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1618            the new way to destroy the layers.
1619            (TestLayer.test_derived_store): New. Test for using a layer with a
1620            DerivedShapeStore
1621    
1622            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1623            filename if the shape store actually has one.
1624    
1625    2003-05-22  Bernhard Herzog  <[email protected]>
1626    
1627            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1628            for the filename
1629    
1630            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1631            for the FileName method
1632            (TestDBFTableWriting.test_write): Fix spelling of filename
1633    
1634    2003-05-22  Thomas Koester  <[email protected]>
1635    
1636            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1637            from SciParam that now really is immutable.
1638    
1639    2003-05-22  Frank Koormann  <[email protected]>
1640    
1641            Layer Top/Bottom placement added to legend.
1642    
1643            * Thuban/UI/legend.py
1644            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1645            bound to tool events.
1646            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1647            New, methods binding the event methods with the map methods.
1648    
1649            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1650            layer at top/bottom of layer stack.
1651    
1652            * Resources/Bitmaps/top_layer.xpm: New button icon.
1653    
1654            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1655    
1656    2003-05-22  Bernhard Herzog  <[email protected]>
1657    
1658            * Thuban/Model/session.py (Session.RemoveTable): New method to
1659            remove tables
1660    
1661            * test/test_session.py (TestSessionSimple.test_remove_table): New.
1662            Test for RemoveTable
1663    
1664    2003-05-22  Thomas Koester  <[email protected]>
1665    
1666            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1667            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1668    
1669    2003-05-22  Bernhard Herzog  <[email protected]>
1670    
1671            Implement a way to discover dependencies between tables and
1672            shapestores.
1673    
1674            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1675            (TransientJoinedTable.Dependencies)
1676            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1677            interface
1678            (TransientJoinedTable.__init__): Keep tack of the original table
1679            objects in addition to the corresponding transient tables.
1680    
1681            * Thuban/Model/table.py (DBFTable.Dependencies)
1682            (MemoryTable.Dependencies): New. Implement the dependencies
1683            interface
1684    
1685            * Thuban/Model/data.py (ShapeTable): New. Helper class for
1686            ShapefileStore
1687            (ShapefileStore.__init__): Use ShapeTable instead of
1688            AutoTransientTable
1689            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1690            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1691            methods for filename and type
1692            (ShapefileStore.Dependencies): New. Implement the dependencies
1693            interface
1694            (DerivedShapeStore): New class to replace SimpleStore. The main
1695            difference to SimpleStore is that it depends not on a shapefile
1696            but another shapestore which expresses the dependencies a bit
1697            better
1698            (SimpleStore.__init__): Add deprecation warning.
1699    
1700            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1701            Test for the Dependencies method.
1702    
1703            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1704            New. Test for the Dependencies method.
1705    
1706            * test/test_transientdb.py
1707            (TestTransientTable.test_auto_transient_table_dependencies): New.
1708            Test for the Dependencies method.
1709            (TestTransientTable.test_transient_joined_table): Add test for the
1710            Dependencies method.
1711    
1712            * test/test_session.py (TestSessionSimple.setUp)
1713            (TestSessionSimple.tearDown): New. Implement a better way to
1714            destroy the sessions.
1715            (TestSessionSimple.test_initial_state)
1716            (TestSessionSimple.test_add_table): Bind session to self.session
1717            so that it's destroyed by tearDown
1718            (TestSessionSimple.test_open_shapefile): New. Test for
1719            OpenShapefile and the object it returns
1720    
1721    2003-05-22  Bernhard Herzog  <[email protected]>
1722    
1723            * Thuban/Model/session.py (Session.AddTable): New method to
1724            register tables with the session.
1725            (Session.Tables): Return the tables registered with AddTable too.
1726    
1727            * test/test_session.py (TestSessionSimple.test_add_table): New.
1728            Test case for the AddTable method
1729    
1730    2003-05-22  Frank Koormann  <[email protected]>
1731    
1732            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1733            lower right corner, center labels for selections, initialize controls
1734            in reasonable order for keyboard navigation.
1735    
1736            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1737            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1738            using the wxListBox.FindString() method. Still a problem (#1886)
1739    
1740            * Thuban/UI/classifier.py
1741            (Classifier.__init__, SelectPropertiesDialog.__init__)
1742    
1743            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1744            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1745            different classification types from here to __init__.
1746            (GenUniquePanel.__init__): Set the column width of the first field
1747            in the Field ListCtrl to the full width.
1748    
1749            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1750            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1751            Grid.
1752            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1753            changes focus to the Selection when pressing "Alt-S".
1754    
1755            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1756            the text if not visible. The italic font sometimes exceeds the
1757            rendering area.
1758    
1759    2003-05-21  Jonathan Coles   <[email protected]>
1760    
1761            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1762            to OnClose so that Thuban closes correctly.
1763    
1764            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1765            DockFrame.OnClose, not DockFrame._OnClose.
1766    
1767    2003-05-21  Jonathan Coles   <[email protected]>
1768    
1769            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1770            references to 'inf' and use new Range __init__ to pass floats
1771            directly rather than converting them to strings first.
1772            Fixes RTBug #1876.
1773    
1774            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1775            Use new Range ___init__ to pass floats.
1776    
1777            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1778            filename is a valid image file. Throw IOError otherwise.
1779    
1780            * Thuban/Model/range.py: Brought over new Range from SciParam that
1781            is immutable and has an __init__ which can accept floats.
1782    
1783            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1784            into try block. AddLayer doesn't throw any exceptions anymore.
1785            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1786            try block.
1787    
1788            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1789            the first item in choices. Fixes RTBug #1882.
1790    
1791            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1792            has gone to 0 which is a serious problem. abort.
1793            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1794            print the error from GDAL.
1795    
1796            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1797            ToggleEventListeners to turn on listening.
1798            (TableGrid.ToggleEventListeners): New. Turns event listening on
1799            and off so as to prevent excessive messages.
1800            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1801            to suppress excessive messages when selecting many rows.
1802            Fixes RTBug #1880.
1803    
1804            * Thuban/UI/view.py: Added checks against if scale == 0. This
1805            is a serious problem that can occur when an image without
1806            geo data is loading and causes the map projection bounds to
1807            go to infinity. Right now, the solution is to simply try
1808            to recover.
1809    
1810            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1811            to set the MFILEReceiver attributes even if the data is NULL.
1812    
1813            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1814            and passed GDAL messages back up to the Python layer. Also
1815            tried to fix some memory leaks that were present in the original
1816            utility but didn't matter because the program aborted.
1817    
1818            * test/test_range.py: Copied over tests from SciParam. Removed
1819            tests against importing. Fixes RTBug #1867.
1820    
1821    2003-05-21  Bernhard Herzog  <[email protected]>
1822    
1823            * test/test_load.py: Remove unused imports and restructure the
1824            test code
1825            (LoadSessionTest): Split into one class for each test and turn
1826            LoadSessionTest itself into the base class for all such session
1827            tests.
1828            (ClassificationTest): New base class for load tests that test
1829            classifications
1830            (TestSingleLayer, TestLayerVisibility, TestClassification)
1831            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1832            for the individual tests
1833    
1834            * test/support.py (FileLoadTestCase.filename): New base class for
1835            file loading tests
1836    
1837    2003-05-21  Jan-Oliver Wagner <[email protected]>
1838    
1839            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1840            Mercator' to 'UTM Zone 32' as a more convenient example.
1841            Added 'Gauss Krueger Zone 6'.
1842    
1843            * Data/iceland_sample_raster.thuban: political polygon now
1844            filled transparent to have the raster image visible at once.
1845    
1846    2003-05-21  Frank Koormann  <[email protected]>
1847    
1848            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1849            OnClose() to keep in sync with extensions. Internally Thuban
1850            still uses "underscored" names.
1851    
1852    2003-05-20  Jonathan Coles   <[email protected]>
1853    
1854            This puts back Raster layer support. These layers support projections
1855            through the GDAL library. Currently, the CVS version is being used.
1856            There are no Debian packages available although this may change soon.
1857            A GDAL driver was extended to support writing to memory rather to
1858            files.
1859    
1860            There is still some work that needs to be done, such as some error
1861            handling when loading invalid images or when there is a problem
1862            projecting the image. This putback simply checks in the majority
1863            of the work.
1864    
1865            * setup.py: Add gdalwarp library extension.
1866    
1867            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1868            Defaults to False, but can be overridden by subclasses if they
1869            support classification.
1870            (RasterLayer): New. Defines a new layer that represents an
1871            image.
1872    
1873            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1874            tag handler.
1875            (SessionLoader.start_layer): Encode the filename.
1876            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1877            New. Supports reading a rasterlayer tag.
1878    
1879            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1880    
1881            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1882            get a string in Latin1. If we get such as string convert it to
1883            unicode first, otherwise leave if alone before encoding.
1884            (SessionSaver.write_layer): Add support for writing both Layers
1885            and RasterLayers.
1886    
1887            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1888            The right argument may not be a string, it could also be a Column.
1889    
1890            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1891            Make initial window size 600x400. Fixes RTBug #1872.
1892    
1893            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1894            the dialog is constructed so that we can support layers that
1895            do not have classifications.
1896            (Classifier._OnTry): Only build a classification if the layer
1897            supports one.
1898    
1899            * Thuban/UI/legend.py: Change all checks that a layer is an
1900            instance of Layer into checks against BaseLayer.
1901            (LegendTree.__FillTreeLayer): Only add children to a branch if
1902            the layer supports classification.
1903    
1904            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1905            MainWindow.OpenSession): Don't proceed with an action if the
1906            user chooses Cancel when they are asked to save changes.
1907            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1908            user to select an image file. Create a new RasterLayer and add
1909            it to the map.
1910    
1911            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1912            for rendering RasterLayer layers.
1913            (MapRenderer.draw_raster_layer): Actually method that calls
1914            the GDALWarp python wrapper and constructs an image from the
1915            data returned.
1916    
1917            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1918            Choices symbols to match those used in the table query method.
1919            Replace deprecated method calls on table with new method names.
1920    
1921            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1922            how small the scale can get. This still needs more testing.
1923    
1924            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1925            Provides a driver to output in .bmp format.
1926    
1927            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1928            New. Provides IO routines which write to memory, rather than a file.
1929    
1930            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1931            of the gdalwarp utility provided in GDAL. Added function calls
1932            that can be accessed from python.
1933    
1934            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1935            a raster layer.
1936    
1937            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1938            layer image data.
1939    
1940            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1941    
1942            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1943            tests associated with the raster layer code.
1944    
1945            * test/test_transientdb.py
1946            (TestTransientTable.test_auto_transient_table_query): Added a test
1947            for using a Column object as the "right" parameter to a query.
1948    
1949    2003-05-19  Frank Koormann  <[email protected]>
1950    
1951            * Thuban/version.py (get_changelog_date):
1952            Catch exceptions if ChangeLog does not exist.
1953    
1954            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1955    
1956    2003-05-19  Frank Koormann  <[email protected]>
1957    
1958            Extended version information for Thuban
1959    
1960            * Thuban/version.py: New, version information for Thuban: Last
1961            modification date and last ChangeLog entry date.
1962    
1963            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1964            information: Display Thuban, wxPython and Python version.
1965    
1966    2003-05-16  Bernhard Herzog  <[email protected]>
1967    
1968            * Thuban/Model/save.py: Remove some unused imports including the
1969            __future__ import for nested_scopes as Thuban relies on Python 2.2
1970            now.
1971            (XMLWriter.encode): Remove the special case for a None argument.
1972            In the saver encode is always called with a string argument.
1973    
1974    2003-05-16  Bernhard Herzog  <[email protected]>
1975    
1976            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1977            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1978            of the bug was that e.g. float("1.2") would fail. Thuban now
1979            requires 2.4.x.
1980            
1981    2003-05-16  Frank Koormann   <[email protected]>
1982    
1983            Printing enhancement and WMF export (under Win32)
1984    
1985            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1986            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1987            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1988            PrintRender.
1989    
1990            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1991            to fullfil information needed for PrinterRenderer.
1992            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1993            (MapCanvas.Print): Adapted to new MapPrintout.
1994            (OutputTransform): General calculations to transform from canvas
1995            coordinates to export/printing devices.
1996    
1997            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1998            new method_command to call ExportMap, with platform dependency (only
1999            __WXMSW__)
2000      
2001            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2002            of scalebar drawing area as new parameters.
2003            
2004            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2005    
2006            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2007            Update to extended scalebar.DrawScalebar header.
2008    
2009            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2010    
2011            * test/test_scalebar.py: Made test executable as standalone.
2012    
2013    2003-05-16  Bernhard Herzog  <[email protected]>
2014    
2015            * Thuban/Model/table.py (Table): Remove this compatibility alias
2016            for DBFTable.
2017    
2018            * test/test_table.py: Import DBFTable as Table because that alias
2019            doesn't exist anymore.
2020    
2021            * Thuban/UI/classgen.py: Remove some unused imports
2022    
2023    2003-05-14  Jonathan Coles   <[email protected]>
2024    
2025            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
2026            Fix docstring.
2027            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
2028            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
2029            values of the supplied range to determine the beginning and end
2030            bounds of the generated classes.
2031    
2032            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
2033            do not have a leading 0 (.5 is now accepted as well as 0.5).
2034    
2035            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
2036            call to ClassGenerator.GenUniformDistribution.
2037    
2038            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
2039            layout bug with the 'Projection' label.
2040    
2041            * test/support.py (FloatTestCase): New. Needed for the Range tests.
2042    
2043            * test/test_range.py: New. Imported from SciParam.
2044    
2045    2003-05-12  Jonathan Coles   <[email protected]>
2046    
2047            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
2048            to table.UniqueValues() with calls that retrieve all the values
2049            from the table. This will need to be replaced by a method on table
2050            which can simply return the list (perhaps more efficiently).
2051    
2052    2003-05-12  Jonathan Coles   <[email protected]>
2053    
2054            The return value of ClassGenerator.CalculateQuantiles has changed.
2055            Refer to the documentation for details.
2056    
2057            * test/test_classgen.py: Modified Quantile tests to use the
2058            new return values.
2059    
2060            * Thuban/Model/classgen.py
2061            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
2062            use new return values from CalculateQuantiles to produce the correct
2063            range bounds in the Classification.
2064            (ClassGenerator.CalculateQuantiles): Add more comments describing
2065            the return values and parameters. Make minor adjustments to improve
2066            the legibility of the code. Fix problem with adjusted not being set
2067            in most cases.
2068    
2069    2003-05-12  Frank Koormann <[email protected]>
2070            
2071            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
2072            and latin1. Fixes #1851 finally.
2073    
2074    2003-05-09  Jonathan Coles   <[email protected]>
2075    
2076            * test/test_classgen.py: New. Tests the Quantile algorithm.
2077    
2078            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
2079            Clean up debugging statement, add comments, fix a small bug in the
2080            returned adjusted percentiles.
2081            
2082    2003-05-09  Jonathan Coles   <[email protected]>
2083    
2084            Introduces Range class from SciParam into the ClassGroupRange class,
2085            and such ranges can now be saved and loaded from disk.
2086    
2087            Quantiles are now available in the Classification Generator.
2088    
2089            Initial support for building Queries on a table. Doesn't do anything
2090            but run some tests.
2091    
2092            * Thuban/Model/classification.py: Explicit imports.
2093            (ClassGroupRange): Use the Range class to store the underlying
2094            range information. The interface remains the same, except for
2095            GetRange(), and you can also supply a Range object as the min
2096            parameter to SetRange or __init__.
2097    
2098            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
2099            string appropriately for use in Thuban. Fixes RTbug #1851.
2100            (SessionLoader.end_projection): Handle the context of the
2101            projection tag a bit better by looking at what objects are not
2102            None. There was an assumption that a projection tag for a map
2103            could occur before any layers.
2104            (SessionLoader.start_clrange): Provide backward compatibility for
2105            reading min/max values as well as the new range parameter.
2106    
2107            * Thuban/Model/map.py: Explicit imports.
2108    
2109            * Thuban/Model/resource.py: Import _.
2110            (ProjFileSaver.write): write header using projfile.dtd.
2111    
2112            * Thuban/Model/save.py: Explicit imports.
2113            (XMLWriter.encode): New. Encode the given string from a format
2114            used by Thuban into UTF-8. Fixes RTbug #1851.
2115    
2116            * Thuban/UI/classgen.py: Explicit imports.
2117            (ClassGenDialog.__init__): Clean up the code and add support
2118            for Quantiles.
2119            (ClassGenDialog.OnOK): Add support for Quantiles.
2120            (GenQuantilesPanel): New. Input panel for Quantiles.
2121            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
2122            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
2123    
2124            * Thuban/Model/classgen.py: New. Contains all the classes named above.
2125    
2126            * Thuban/UI/classifier.py: Explicit imports.
2127            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
2128            ClassTable.SetValueAsCustom): Reworked to use new Range class.
2129    
2130            * Thuban/UI/legend.py: Explicit imports.
2131    
2132            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
2133            a Table menu and associated method calls.
2134            (MainWindow.choose_color): Removed. No longer needed.
2135    
2136            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
2137            should be disabled if no projection is selected in the available
2138            list.
2139    
2140            * Thuban/UI/renderer.py: Explicit imports.
2141    
2142            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
2143            with correctly selecting the rows and issuing the right events.
2144            Be sure to call Skip() to allow the grid to do some of its own
2145            handling which allows the rows to actually be selected.
2146            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
2147            selecting multiple shapes.
2148            (LayerTableFrame): Support for building Queries.
2149            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
2150    
2151            * Thuban/UI/tree.py: Explicit imports.
2152    
2153            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
2154            table view can call it.
2155    
2156            * test/test_classification.py: Explicit imports.
2157            (TestClassification.test_ClassGroupRange): Fix test for new
2158            Range class.
2159    
2160            * Doc/thuban.dtd: Add range parameter for clrange.
2161    
2162            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
2163            object in ClassGroupRange, and also uesd for inputting ranges in
2164            the classifer table and elsewhere.
2165    
2166            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
2167            yet.
2168    
2169    2003-05-09  Frank Koormann <[email protected]>
2170    
2171            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2172    
2173    2003-05-08  Frank Koormann <[email protected]>
2174    
2175            Coding style updates
2176    
2177            * test/test_scalebar.py: Replaced tab indentation by spaces.
2178    
2179            * Thuban/UI/scalebar.py: Explicit imports.
2180    
2181    2003-05-08  Frank Koormann <[email protected]>
2182    
2183            * Thuban/UI/scalebar.py
2184            (ScaleBar.DrawScalebar): Format string bug fixed.
2185    
2186    2003-05-08  Frank Koormann <[email protected]>
2187    
2188            Reorganization of scalebar component (no wx in Thuban/Model)
2189    
2190            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2191            (deriveInterval):
2192            Calculate scalebar interval and unit which fits in width for scale.
2193            (roundInterval): Round float.
2194    
2195            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2196    
2197            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2198    
2199            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2200    
2201    2003-05-08  Frank Koormann <[email protected]>
2202    
2203            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2204            Initialize ScaleBar with canvas.map
2205    
2206            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2207            round intervals to display smarter lengths
2208            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2209            layer. If the maps has no projection applied grey the scalebar.
2210    
2211    2003-05-07  Frank Koormann <[email protected]>
2212            
2213            Basic Scalebar features added.
2214    
2215            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2216    
2217            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2218            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2219            and the renderer.
2220    
2221            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2222    
2223            * Thuban/UI/messages.py: SCALE_CHANGED added.
2224    
2225    2003-05-07  Bernhard Herzog  <[email protected]>
2226    
2227            * Thuban/Model/session.py (Session.__init__): New instance
2228            variable shapestores to hold a list of all open shapestore objects
2229            (Session.ShapeStores): New. Accessor method for the shapestores
2230            list.
2231            (Session._add_shapestore, Session._clean_weak_store_refs): New.
2232            Internal methods to maintain the shapestores list.
2233            (Session.Tables): New. Return all tables open in the session.
2234            (Session.OpenShapefile): Insert the new ShapeStore into the
2235            shapestores list.
2236    
2237            * test/test_session.py (TestSessionSimple.test_initial_state): Add
2238            tests for ShapeStores and Tables
2239            (TestSessionWithContent.test_shape_stores)
2240            (TestSessionWithContent.test_tables): New. Test cases for
2241            ShapeStores and Tables
2242    
2243    2003-05-07  Bernhard Herzog  <[email protected]>
2244    
2245            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
2246            Add comments about the optimizations used.
2247            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
2248            Implement the ReadValue table interface method.
2249    
2250            * test/test_transientdb.py
2251            (TestTransientTable.run_iceland_political_tests)
2252            (TestTransientTable.test_transient_joined_table): Add tests for
2253            ReadValue
2254    
2255  2003-05-07  Frank Koormann <[email protected]>  2003-05-07  Frank Koormann <[email protected]>
2256    
2257          * Resources/Bitmaps/fulllayerextent.xpm,          * Resources/Bitmaps/fulllayerextent.xpm,

Legend:
Removed from v.848  
changed lines
  Added in v.1360

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26