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

Legend:
Removed from v.924  
changed lines
  Added in v.1500

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26