/[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 184 by bh, Thu May 23 14:59:28 2002 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]>
2551    
2552            Extended version information for Thuban
2553    
2554            * Thuban/version.py: New, version information for Thuban: Last
2555            modification date and last ChangeLog entry date.
2556    
2557            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
2558            information: Display Thuban, wxPython and Python version.
2559    
2560    2003-05-16  Bernhard Herzog  <[email protected]>
2561    
2562            * Thuban/Model/save.py: Remove some unused imports including the
2563            __future__ import for nested_scopes as Thuban relies on Python 2.2
2564            now.
2565            (XMLWriter.encode): Remove the special case for a None argument.
2566            In the saver encode is always called with a string argument.
2567    
2568    2003-05-16  Bernhard Herzog  <[email protected]>
2569    
2570            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
2571            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
2572            of the bug was that e.g. float("1.2") would fail. Thuban now
2573            requires 2.4.x.
2574            
2575    2003-05-16  Frank Koormann   <[email protected]>
2576    
2577            Printing enhancement and WMF export (under Win32)
2578    
2579            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
2580            ScreenRenderer. Renders Map, Legend and Scalebar for export.
2581            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
2582            PrintRender.
2583    
2584            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
2585            to fullfil information needed for PrinterRenderer.
2586            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
2587            (MapCanvas.Print): Adapted to new MapPrintout.
2588            (OutputTransform): General calculations to transform from canvas
2589            coordinates to export/printing devices.
2590    
2591            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
2592            new method_command to call ExportMap, with platform dependency (only
2593            __WXMSW__)
2594      
2595            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2596            of scalebar drawing area as new parameters.
2597            
2598            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2599    
2600            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2601            Update to extended scalebar.DrawScalebar header.
2602    
2603            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2604    
2605            * test/test_scalebar.py: Made test executable as standalone.
2606    
2607    2003-05-16  Bernhard Herzog  <[email protected]>
2608    
2609            * Thuban/Model/table.py (Table): Remove this compatibility alias
2610            for DBFTable.
2611    
2612            * test/test_table.py: Import DBFTable as Table because that alias
2613            doesn't exist anymore.
2614    
2615            * Thuban/UI/classgen.py: Remove some unused imports
2616    
2617    2003-05-14  Jonathan Coles   <[email protected]>
2618    
2619            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
2620            Fix docstring.
2621            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
2622            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
2623            values of the supplied range to determine the beginning and end
2624            bounds of the generated classes.
2625    
2626            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
2627            do not have a leading 0 (.5 is now accepted as well as 0.5).
2628    
2629            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
2630            call to ClassGenerator.GenUniformDistribution.
2631    
2632            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
2633            layout bug with the 'Projection' label.
2634    
2635            * test/support.py (FloatTestCase): New. Needed for the Range tests.
2636    
2637            * test/test_range.py: New. Imported from SciParam.
2638    
2639    2003-05-12  Jonathan Coles   <[email protected]>
2640    
2641            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
2642            to table.UniqueValues() with calls that retrieve all the values
2643            from the table. This will need to be replaced by a method on table
2644            which can simply return the list (perhaps more efficiently).
2645    
2646    2003-05-12  Jonathan Coles   <[email protected]>
2647    
2648            The return value of ClassGenerator.CalculateQuantiles has changed.
2649            Refer to the documentation for details.
2650    
2651            * test/test_classgen.py: Modified Quantile tests to use the
2652            new return values.
2653    
2654            * Thuban/Model/classgen.py
2655            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
2656            use new return values from CalculateQuantiles to produce the correct
2657            range bounds in the Classification.
2658            (ClassGenerator.CalculateQuantiles): Add more comments describing
2659            the return values and parameters. Make minor adjustments to improve
2660            the legibility of the code. Fix problem with adjusted not being set
2661            in most cases.
2662    
2663    2003-05-12  Frank Koormann <[email protected]>
2664            
2665            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
2666            and latin1. Fixes #1851 finally.
2667    
2668    2003-05-09  Jonathan Coles   <[email protected]>
2669    
2670            * test/test_classgen.py: New. Tests the Quantile algorithm.
2671    
2672            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
2673            Clean up debugging statement, add comments, fix a small bug in the
2674            returned adjusted percentiles.
2675            
2676    2003-05-09  Jonathan Coles   <[email protected]>
2677    
2678            Introduces Range class from SciParam into the ClassGroupRange class,
2679            and such ranges can now be saved and loaded from disk.
2680    
2681            Quantiles are now available in the Classification Generator.
2682    
2683            Initial support for building Queries on a table. Doesn't do anything
2684            but run some tests.
2685    
2686            * Thuban/Model/classification.py: Explicit imports.
2687            (ClassGroupRange): Use the Range class to store the underlying
2688            range information. The interface remains the same, except for
2689            GetRange(), and you can also supply a Range object as the min
2690            parameter to SetRange or __init__.
2691    
2692            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
2693            string appropriately for use in Thuban. Fixes RTbug #1851.
2694            (SessionLoader.end_projection): Handle the context of the
2695            projection tag a bit better by looking at what objects are not
2696            None. There was an assumption that a projection tag for a map
2697            could occur before any layers.
2698            (SessionLoader.start_clrange): Provide backward compatibility for
2699            reading min/max values as well as the new range parameter.
2700    
2701            * Thuban/Model/map.py: Explicit imports.
2702    
2703            * Thuban/Model/resource.py: Import _.
2704            (ProjFileSaver.write): write header using projfile.dtd.
2705    
2706            * Thuban/Model/save.py: Explicit imports.
2707            (XMLWriter.encode): New. Encode the given string from a format
2708            used by Thuban into UTF-8. Fixes RTbug #1851.
2709    
2710            * Thuban/UI/classgen.py: Explicit imports.
2711            (ClassGenDialog.__init__): Clean up the code and add support
2712            for Quantiles.
2713            (ClassGenDialog.OnOK): Add support for Quantiles.
2714            (GenQuantilesPanel): New. Input panel for Quantiles.
2715            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
2716            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
2717    
2718            * Thuban/Model/classgen.py: New. Contains all the classes named above.
2719    
2720            * Thuban/UI/classifier.py: Explicit imports.
2721            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
2722            ClassTable.SetValueAsCustom): Reworked to use new Range class.
2723    
2724            * Thuban/UI/legend.py: Explicit imports.
2725    
2726            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
2727            a Table menu and associated method calls.
2728            (MainWindow.choose_color): Removed. No longer needed.
2729    
2730            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
2731            should be disabled if no projection is selected in the available
2732            list.
2733    
2734            * Thuban/UI/renderer.py: Explicit imports.
2735    
2736            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
2737            with correctly selecting the rows and issuing the right events.
2738            Be sure to call Skip() to allow the grid to do some of its own
2739            handling which allows the rows to actually be selected.
2740            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
2741            selecting multiple shapes.
2742            (LayerTableFrame): Support for building Queries.
2743            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
2744    
2745            * Thuban/UI/tree.py: Explicit imports.
2746    
2747            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
2748            table view can call it.
2749    
2750            * test/test_classification.py: Explicit imports.
2751            (TestClassification.test_ClassGroupRange): Fix test for new
2752            Range class.
2753    
2754            * Doc/thuban.dtd: Add range parameter for clrange.
2755    
2756            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
2757            object in ClassGroupRange, and also uesd for inputting ranges in
2758            the classifer table and elsewhere.
2759    
2760            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
2761            yet.
2762    
2763    2003-05-09  Frank Koormann <[email protected]>
2764    
2765            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2766    
2767    2003-05-08  Frank Koormann <[email protected]>
2768    
2769            Coding style updates
2770    
2771            * test/test_scalebar.py: Replaced tab indentation by spaces.
2772    
2773            * Thuban/UI/scalebar.py: Explicit imports.
2774    
2775    2003-05-08  Frank Koormann <[email protected]>
2776    
2777            * Thuban/UI/scalebar.py
2778            (ScaleBar.DrawScalebar): Format string bug fixed.
2779    
2780    2003-05-08  Frank Koormann <[email protected]>
2781    
2782            Reorganization of scalebar component (no wx in Thuban/Model)
2783    
2784            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2785            (deriveInterval):
2786            Calculate scalebar interval and unit which fits in width for scale.
2787            (roundInterval): Round float.
2788    
2789            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2790    
2791            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2792    
2793            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2794    
2795    2003-05-08  Frank Koormann <[email protected]>
2796    
2797            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2798            Initialize ScaleBar with canvas.map
2799    
2800            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2801            round intervals to display smarter lengths
2802            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2803            layer. If the maps has no projection applied grey the scalebar.
2804    
2805    2003-05-07  Frank Koormann <[email protected]>
2806            
2807            Basic Scalebar features added.
2808    
2809            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2810    
2811            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2812            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2813            and the renderer.
2814    
2815            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2816    
2817            * Thuban/UI/messages.py: SCALE_CHANGED added.
2818    
2819    2003-05-07  Bernhard Herzog  <[email protected]>
2820    
2821            * Thuban/Model/session.py (Session.__init__): New instance
2822            variable shapestores to hold a list of all open shapestore objects
2823            (Session.ShapeStores): New. Accessor method for the shapestores
2824            list.
2825            (Session._add_shapestore, Session._clean_weak_store_refs): New.
2826            Internal methods to maintain the shapestores list.
2827            (Session.Tables): New. Return all tables open in the session.
2828            (Session.OpenShapefile): Insert the new ShapeStore into the
2829            shapestores list.
2830    
2831            * test/test_session.py (TestSessionSimple.test_initial_state): Add
2832            tests for ShapeStores and Tables
2833            (TestSessionWithContent.test_shape_stores)
2834            (TestSessionWithContent.test_tables): New. Test cases for
2835            ShapeStores and Tables
2836    
2837    2003-05-07  Bernhard Herzog  <[email protected]>
2838    
2839            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
2840            Add comments about the optimizations used.
2841            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
2842            Implement the ReadValue table interface method.
2843    
2844            * test/test_transientdb.py
2845            (TestTransientTable.run_iceland_political_tests)
2846            (TestTransientTable.test_transient_joined_table): Add tests for
2847            ReadValue
2848    
2849    2003-05-07  Frank Koormann <[email protected]>
2850    
2851            * Resources/Bitmaps/fulllayerextent.xpm,
2852            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
2853            new icons.
2854    
2855    2003-05-06  Bernhard Herzog  <[email protected]>
2856    
2857            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2858            New. Simply delegate to the transient table's version.
2859    
2860            * test/test_transientdb.py
2861            (TestTransientTable.test_auto_transient_table_query): New. Test
2862            case for AutoTransientTable's SimpleQuery
2863    
2864    2003-05-06  Bernhard Herzog  <[email protected]>
2865    
2866            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
2867            Implement a simple query method for the query dialog
2868            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
2869            the row index or shapeid.
2870            (TransientTable.create): Insert the right value of the row index
2871            (TransientJoinedTable.create): Copy the row index of the left
2872            table to the joined result table
2873    
2874            * test/test_transientdb.py
2875            (TestTransientTable.test_transient_table_read_twice): Fix
2876            doc-string
2877            (TestTransientTable.test_transient_table_query): New. Test for the
2878            SimpleQuery method
2879    
2880    2003-05-06  Bernhard Herzog  <[email protected]>
2881    
2882            Convert all table users to use the new table interface. This only
2883            covers Thuban itself, not GREAT-ER or other applications built on
2884            Thuban yet, so the compatibility interface stays in place for the
2885            time being but it now issues DeprecationWarnings.
2886    
2887            Finally, the new Table interface has a new method, HasColumn.
2888    
2889            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
2890            issue deprecation warnings when they're. The warnings refer to the
2891            caller of the method.
2892            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
2893            for the deprecation warnings
2894    
2895            * test/test_table.py: Ignore the deprecation warnings for the old
2896            table in the tests in this module. The purpose of the tests is to
2897            test the old interface, after all.
2898    
2899            * test/test_transientdb.py
2900            (TestTransientTable.run_iceland_political_tests): Use the
2901            constants for the types. Add a test for HasColumn
2902            (TestTransientTable.test_transient_joined_table): Adapt to new
2903            table interface. Add a test for HasColumn
2904            (TestTransientTable.test_transient_table_read_twice): Adapt to new
2905            table interface
2906    
2907            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
2908            Adapt to new table interface
2909    
2910            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
2911            new table interface
2912    
2913            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
2914            (RecordTable.SetTable): Adapt to new table interface
2915    
2916            * Thuban/UI/classifier.py (Classifier.__init__)
2917            (Classifier.__init__): Adapt to new table interface
2918    
2919            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2920            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
2921            to new table interface
2922    
2923            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
2924            (AutoTransientTable.HasColumn): Implement the new table interface
2925            method
2926            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
2927            (AutoTransientTable.UniqueValues): Adapt to new table interface
2928    
2929            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
2930            Adapt to new table interface
2931    
2932            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
2933            simplify opening shapefiles a bit easier.
2934            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2935            (TestLayer.test_point_layer): Use the new helper method
2936            (TestLayer.test_get_field_type): New. Test for the GetFieldType
2937            method
2938    
2939            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
2940            the new table method
2941    
2942            * test/test_memory_table.py (TestMemoryTable.test_has_column):
2943            Test for the new table method HasColumn
2944    
2945    2003-05-06  Jonathan Coles   <[email protected]>
2946    
2947            Addresses the "Selection Extent" wish of RTbug #1787.
2948    
2949            * Resources/Bitmaps/fulllayerextent.xpm,
2950            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
2951            extent. These are just place holders for the real bitmaps.
2952    
2953            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
2954            calculate the bounding box once (the first time compute_bbox() is
2955            called).
2956            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
2957            the bounding box for the shapes in lat/long coordinates.
2958    
2959            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
2960            option.
2961            (MainWindow.has_selected_shapes): New. Returns true if there are
2962            any selected shapes.
2963            (MainWindow.FullSelectionExtent): New. Calls
2964            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
2965            (_has_selected_shapes): New. Returns true if there are any
2966            selected shapes.
2967    
2968            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
2969            true if there are any selected shapes.
2970    
2971            * Thuban/UI/view.py (MapCanvas): Added delegated method
2972            HasSelectedShapes.
2973            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
2974            shapes on the canvas using the map projection (if any).
2975    
2976            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
2977            for Layer.ShapesBoundingBox().
2978    
2979    2003-05-06  Bernhard Herzog  <[email protected]>
2980    
2981            * Resources/Projections/defaults.proj: Fix spelling of Mercator
2982    
2983    2003-05-05  Jonathan Coles   <[email protected]>
2984    
2985            Addresses the "Full Layer Extent" wish of RTbug #1787.
2986    
2987            * Resources/Projections/defaults.proj: Added UK National Grid.
2988    
2989            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
2990            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
2991            when the user selects the menu option.
2992    
2993            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
2994            scales the given layer on the canvas using the map projection.
2995    
2996    2003-05-05  Bernhard Herzog  <[email protected]>
2997    
2998            Convert the table implementations to a new table interface. All
2999            tables use a common mixin class to provide backwards compatibility
3000            until all table users have been updated.
3001    
3002            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3003            provide backwards compatibility for table classes implementing the
3004            new interface
3005            (DBFTable, MemoryTable): Implement the new table interface. Use
3006            OldTableInterfaceMixin as base for compatibility
3007            (DBFColumn, MemoryColumn): New. Column description for DBFTable
3008            and MemoryTable resp.
3009    
3010            * test/test_dbf_table.py: New. Test cases for the DBFTable with
3011            the new table interface.
3012    
3013            * test/test_memory_table.py: New. Test cases for the MemoryTable
3014            with the new table interface.
3015    
3016            * test/test_table.py: Document the all tests in this file as only
3017            for backwards compatibility. The equivalent tests for the new
3018            interface are in test_memory_table.py and test_dbf_table.py
3019            (MemoryTableTest.test_read): field_info should be returning tuples
3020            with four items
3021            (MemoryTableTest.test_write): Make doc-string a more precise.
3022    
3023            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3024            table interface. Derive from from OldTableInterfaceMixin for
3025            compatibility.
3026            (TransientTableBase.create): New intance variable column_map to
3027            map from names and indices to column objects
3028            (TransientTable.create): Use the new table interface of the input
3029            table
3030            (AutoTransientTable): Convert to new table interface. Derive from
3031            from OldTableInterfaceMixin for compatibility.
3032            (AutoTransientTable.write_record): Removed. It's not implemented
3033            yet and we still have to decide how to handle writing with the new
3034            table and data framework.
3035    
3036            * test/test_transientdb.py
3037            (TestTransientTable.run_iceland_political_tests)
3038            (TestTransientTable.test_transient_joined_table): Use the new
3039            table interface
3040    
3041    2003-05-05  Jonathan Coles   <[email protected]>
3042    
3043            This is namely a collection of UI updates to improve user interactivity.
3044            Tabbing between controls now exists and you can use ESC to close dialog
3045            boxes; ENTER will active the default button.
3046    
3047            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3048            order that the controls are created so that tabbing works correctly.
3049            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3050            wxDialog can handle the default button correctly.
3051            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3052            same reasons as for OnOK.
3053            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3054            when we ask the table for the maximum/minimum values of a field
3055            which could take a very long time.
3056    
3057            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3058            order that the controls are created so that tabbing works correctly.
3059            (SelectPropertiesDialog.__init__): Rearrange the order that the
3060            controls are created so that tabbing works correctly.
3061    
3062            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3063            to derive from a wxDialog but behave like the original implementation
3064            which was derived from a wxFrame. wxDialog provides useful key
3065            handling functionality like ESC calling OnCancel and ENTER calling
3066            OnOK which is lost with wxFrame.
3067    
3068            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3069            new dialogs.
3070    
3071            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3072            order that the controls are created so that tabbing works correctly.
3073            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3074            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3075            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3076            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3077            can provide the "UK National Grid" as a default projection.
3078            (UTMPanel.__init__): Rearrange the order that the controls are
3079            created so that tabbing works correctly.
3080    
3081    2003-05-05  Bernhard Herzog  <[email protected]>
3082    
3083            * extensions/thuban/wxproj.cpp: Fix some of the comments.
3084            (project_point): If a map projection but no layer projection is
3085            given, convert degrees to radians before applying the map
3086            projection.
3087    
3088            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3089            (TableGrid.allow_messages): New methods to make it possible to
3090            inhibit message sending.
3091            (TableGrid.issue): Only send the message if not inhibited.
3092            (LayerTableGrid.select_shape): Use the new methods to make sure
3093            that no ROW_SELECTED message is sent while we're updating the
3094            selected rows to match the selected shapes.
3095    
3096    2003-05-02  Jan-Oliver Wagner <[email protected]>
3097    
3098            Implementation of MemoryTable.
3099    
3100            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3101            implementation that operates on a list of tuples. All of the data
3102            are kept in the memory.
3103    
3104            * test/test_table.py (MemoryTableTest): New.
3105    
3106            * test/test_transientdb.py (SimpleTable): Removed.
3107            (TestTransientTable.test_transient_joined_table,
3108            (TestTransientTable.test_transient_table_read_twice): Replaced
3109            SimpleTable by MemoryTable.
3110    
3111    2003-04-30  Jonathan Coles   <[email protected]>
3112    
3113            * Data/iceland_sample.thuban: Now contains correct projections
3114            for each of the layers.
3115    
3116            * Resources/Projections/defaults.proj: Geographic projection
3117            contains unit conversion parameter.
3118    
3119    2003-04-30  Jonathan Coles   <[email protected]>
3120    
3121            The most important part of this putback is the projection changes.
3122            It should now be possible to specify the projection that a layer
3123            is in and then specify a different projection for the map. The
3124            projection dialog has an extra parameter for a geographic projection
3125            which lets the user select if the input is in degrees or radians.
3126    
3127            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3128            to say that the parameter is a tuple of unprojected
3129            points (which is what the callers to this method were assuming).
3130            Also, since the points are unprojected we need to projected them.
3131    
3132            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3133            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3134            groups are selected, move the layer up/down. Fixes RTbug #1833.
3135    
3136            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3137    
3138            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3139            parameter in call to SetClientData.
3140            (GeoPanel): Add support for selecting the units that the
3141            source data is in (Radians or Degrees).
3142    
3143            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3144            the rendering loop by reducing the number of if's, removing the
3145            unnecessary try/except block, and checking if the old group
3146            is the same as the new one (which happens a lot if there is
3147            no classification, or lots of shapes are in the same group).
3148    
3149            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3150            around the redraw routine to try to catch problems that the user
3151            may create by selecting invalid projections for the data set and
3152            map. Clears the display if there are any problems and prints the
3153            error.
3154            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3155            rectangle.
3156    
3157            * extensions/thuban/wxproj.cpp (project_point): First invert the
3158            supplied point (which should be in projected coordinates) using
3159            the layer's projection and then project the point using the
3160            map's projection.
3161            (project_points): Use project_point() to project each point.
3162    
3163    2003-04-30  Jan-Oliver Wagner <[email protected]>
3164    
3165            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3166            don't set the Classification to None if the classfication field
3167            is None (ie only a DEFAULT).
3168    
3169    2003-04-30  Bernhard Herzog  <[email protected]>
3170    
3171            * Thuban/UI/view.py: Fix some typos.
3172    
3173            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3174            not pop up the dialog if the selection becomes empty (this could
3175            happen if e.g. a new selection is opened while the identify tool
3176            is active and dialog had been closed)
3177    
3178    2003-04-30  Bernhard Herzog  <[email protected]>
3179    
3180            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3181            instance variable read_record_last_result
3182            (TransientTableBase.read_record): Make sure reading the same
3183            record twice works. The implementation uses the new instance
3184            variable read_record_last_result
3185    
3186            * test/test_transientdb.py
3187            (TestTransientTable.test_transient_table_read_twice): New test
3188            case for the above bug-fix.
3189    
3190    2003-04-29  Jonathan Coles   <[email protected]>
3191    
3192            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3193    
3194            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3195    
3196            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3197            (ClassTable.SetValueAsCustom): Rename keyword argument in
3198            ClassGroup* constructors to match argument name.
3199    
3200    2003-04-29  Bernhard Herzog  <[email protected]>
3201    
3202            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3203            transient DB if it exists to make sure it doesn't leave a journal
3204            file in the temp directory.
3205    
3206            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3207            self.conn to None after closing the connection to make sure it's
3208            not closed twice
3209    
3210    2003-04-29  Jonathan Coles   <[email protected]>
3211    
3212            Add a visible parameter in the layer XML tag. The default value is
3213            "true". If anything other than "false" is specified we also assume
3214            "true". Addresses RTbug #1025.
3215    
3216            * Doc/thuban.dtd: Add visible parameter to a layer.
3217    
3218            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3219            of visible from 1 to True.
3220            (Layer.__init__): Change default value of visible from 1 to True.
3221    
3222            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3223            parameter.
3224    
3225            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3226            parameter.
3227    
3228            * test/test_load.py: Add new test data contents_test_visible.
3229            (LoadSessionTest.setUp): save test data.
3230            (LoadSessionTest.testLayerVisibility): Test if the visible flag
3231            is loaded correctly.
3232    
3233            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3234            for saving an invisible layer.
3235    
3236    2003-04-29  Jonathan Coles   <[email protected]>
3237    
3238            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3239            legend dialog box and tell it to change its map to the one
3240            supplied to SetMap(). Fixes RTbug #1770.
3241    
3242    2003-04-29  Bernhard Herzog  <[email protected]>
3243    
3244            Next step of table implementation. Introduce a transient database
3245            using SQLite that some of the data is copied to on demand. This
3246            allows us to do joins and other operations that require an index
3247            for good performance with reasonable efficiency. Thuban now needs
3248            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3249            haven't tested that.
3250            
3251            * Thuban/Model/transientdb.py: New. Transient database
3252            implementation.
3253    
3254            * test/test_transientdb.py: New. Tests for the transient DB
3255            classes.
3256    
3257            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3258            classes to help automatically remove temporary files and
3259            directories.
3260            (Session.__init__): New instance variables temp_dir for the
3261            temporary directory and transient_db for the SQLite database
3262            (Session.temp_directory): New. Create a temporary directory if not
3263            yet done and return its name. Use AutoRemoveDir to have it
3264            automatically deleted
3265            (Session.TransientDB): Instantiate the transient database if not
3266            done yet and return it.
3267    
3268            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3269            AutoTransientTable so that data is copied to the transient DB on
3270            demand.
3271            (SimpleStore): New class that simply combines a table and a
3272            shapefile
3273    
3274            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3275            DBFTable and update its doc-string to reflect the fact that this
3276            is only the table interface to a DBF file. Table is now an alias
3277            for DBFTable for temporary backwards compatibility.
3278    
3279            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3280            the last reference to the session goes away so that the temporary
3281            files are removed properly.
3282    
3283            * test/test_load.py (LoadSessionTest.tearDown): Remove the
3284            reference to the session to make sure the temporary files are
3285            removed.
3286    
3287    2003-04-29  Bernhard Herzog  <[email protected]>
3288    
3289            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3290            the __parser instance variable into a normal local variable in
3291            read. It's only used there and read will never be called more than
3292            once. Plus it introduces a reference cycle that keeps can keep the
3293            session object alive for a long time.
3294    
3295    2003-04-29  Jonathan Coles   <[email protected]>
3296    
3297            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3298            Projection an immutable item. Fixes RTbug #1825.
3299            (Projection.__init__): Initialize instance variables here.
3300            (ProjFile.Replace): New. Replace the given projection object with
3301            the new projection object. This solves the problem of needing the
3302            mutator Projection.SetProjection() in the ProjFrame class and
3303            allows a projection to change parameters without changing its
3304            location in the file.
3305    
3306            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3307            be of type wxSAVE and should verify overwriting a file.
3308    
3309            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3310            ProjFile.Replace() method instead of the mutator
3311            Projection.SetProjection(). Also requires that we reassign the
3312            client data to the new projection.
3313    
3314            * test/test_proj.py (TestProjection.test): Test GetName() and
3315            GetAllParameters()
3316            (TestProjFile.test): Remove tests for Set*() methods. Add tests
3317            for Replace().
3318    
3319    2003-04-25  Jonathan Coles   <[email protected]>
3320    
3321            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3322            to save the name of the projection.
3323    
3324            * test/test_save.py (SaveSessionTest.testLayerProjection): New
3325            test to verify layer projections are saved correctly.
3326    
3327    2003-04-25  Jonathan Coles   <[email protected]>
3328    
3329            * Thuban/Model/proj.py (Projection.SetName): Set the name
3330            to "Unknown" if name is None.
3331            (Projection.SetAllParameters): New. Set the projection's
3332            parameter list to the one supplied.
3333            (Projection.SetProjection): New. Set the projection's
3334            properties to those of the supplied Projection.
3335    
3336            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3337            the dialog title to include the map's title.
3338            (MainWindow.LayerProjection): Set the dialog title to include
3339            the layer's title.
3340    
3341            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3342            error dialogs into a single method call.
3343            (ProjFrame.__VerifyButtons): Add more states to check.
3344            (ProjFrame.__GetProjection): Return the current state of an
3345            edited projection or None.
3346            (ProjFrame.__FillAvailList): Remove checks for states that
3347            shouldn't exist.
3348            (ProjFrame._OnNew): Clear all selected items and supply
3349            a projection panel if necessary.
3350    
3351            * test/test_proj.py (TestProjFile.test): Add tests for
3352            ProjFile.SetAllParameters, ProjFile.SetProjection,
3353            ProjFile.SetName.
3354    
3355    2003-04-25  Jonathan Coles   <[email protected]>
3356    
3357            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
3358            takes an optional argument to select the current projection.
3359            This does not guarantee that the item is visible due to
3360            limited wxWindows functionality. Fixes RTBug #1821.
3361    
3362    2003-04-25  Jonathan Coles   <[email protected]>
3363    
3364            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
3365            the projection name and use it when constructing the Projection
3366            object.
3367    
3368            * Thuban/Model/proj.py (Projection.__init__): Change the default
3369            value for 'name' to None and then test if name is equal to None
3370            in the body of the constructor. This way the caller doesn't have to
3371            know what the default value should be. Namely, useful in load.py
3372            where we have to pick a default value if the 'name' parameter
3373            doesn't exist in the XML file.
3374    
3375            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
3376            Tests a file where a layer has a projection.
3377    
3378    2003-04-25  Jonathan Coles   <[email protected]>
3379    
3380            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
3381            tree for projection information.
3382    
3383            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
3384            XMLReader.GetFileName.
3385            (SessionLoader): Added support for loading projection tags that
3386            appear inside a layer.
3387    
3388            * Thuban/Model/proj.py (ProjFile): Document the class. Move
3389            back to using a list because the order of the projections in
3390            the file is important to maintain. Fixes RTbug #1817.
3391    
3392            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
3393            to ProjFile.GetFilename.
3394    
3395            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
3396            information.
3397    
3398            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
3399            ProjFrame._OnSaveAs. Removed old dead code from previous
3400            implementation.
3401            (ProjFrame._OnExport): Add support for exporting more than one
3402            projection to a single file.
3403            (ProjFrame.__FillAvailList): use string formatting (% operator)
3404            to build strings that are (partly) translated. Fixes RTbug #1818.
3405    
3406            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
3407            class.
3408    
3409    2003-04-24  Bernhard Herzog  <[email protected]>
3410    
3411            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
3412    
3413            * po/fr.po: New. French translation by Daniel Calvelo Aros
3414    
3415            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
3416            empty strings.
3417    
3418    2003-04-24  Jonathan Coles   <[email protected]>
3419    
3420            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
3421            implement the interface that the ProjFrame dialog expects.
3422    
3423            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
3424            name of the projection to be changed.
3425            (ProjFile): Use a dictionary instead of a list so that removing
3426            projections is easier and we are sure about uniqueness.
3427            (ProjFile.Remove): Remove the given projection object.
3428    
3429            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
3430            Return a list with only one projection file instead of searching for
3431            any projection file. This simplifies many things if the user can
3432            only have one system file and one user file.
3433    
3434            * Thuban/UI/classgen.py: Change all references to
3435            genCombo to genChoice.
3436    
3437            * Thuban/UI/mainwindow.py: Add a Projection option under the
3438            layer menu.
3439            (MainWindow.LayerProjection): New. Open up a projection window
3440            for a layer.
3441    
3442            * Thuban/UI/projdialog.py: Large changes to how the dialog is
3443            laid out. Use three panels instead of one. One for the list of
3444            projections, one for the edit controls, and one for the buttons.
3445            Fixed resizing problems so that the dialog resizes correctly
3446            when the projection panel changes. Added import/export, save, and
3447            new buttons/functionality.
3448    
3449    2003-04-24  Bernhard Herzog  <[email protected]>
3450    
3451            First step towards table management. Introduce a simple data
3452            abstraction so that we replace the data a layer uses more easily
3453            in the next step.
3454    
3455            * Thuban/Model/data.py: New file with a simple data abstraction
3456            that bundles shapefile and dbffile into one object.
3457    
3458            * Thuban/Model/session.py (Session.OpenShapefile): New method to
3459            open shapefiles and return a shape store object
3460    
3461            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
3462            object instead of a shapefile filename. This introduces a new
3463            instance variable store holding the datastore. For intermediate
3464            backwards compatibility keep the old instance variables.
3465            (open_shapefile): Removed. No longer needed with the shape store.
3466            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
3467            get the shape store used by a layer.
3468            (Layer.Destroy): No need to explicitly destroy the shapefile or
3469            table anymore.
3470    
3471            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
3472            (MainWindow.AddLayer): Use the session's OpenShapefile method to
3473            open shapefiles
3474    
3475            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
3476            session's OpenShapefile method to open shapefiles
3477    
3478            * test/test_classification.py
3479            (TestClassification.test_classification): Use the session's
3480            OpenShapefile method to open shapefiles and build the filename in
3481            a more platform independed way
3482    
3483            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3484            Implement to have a session to use in the tests
3485            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3486            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
3487            session's OpenShapefile method to open shapefiles
3488            (TestLayerLegend.setUp): Instantiate a session so that we can use
3489            it to open shapefiles.
3490            (TestLayerLegend.tearDown): Make sure that all references to
3491            layers and session are removed otherwise we may get a resource
3492            leak
3493    
3494            * test/test_map.py (TestMapAddLayer.test_add_layer)
3495            (TestMapWithContents.setUp): Instantiate a session so that we can
3496            use it to open shapefiles.
3497            (TestMapWithContents.tearDown): Make sure that all references to
3498            layers, maps and sessions are removed otherwise we may get a
3499            resource leak
3500            ("__main__"): use support.run_tests() so that more info about
3501            uncollected garbage is printed
3502    
3503            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
3504            session's OpenShapefile method to open shapefiles
3505            ("__main__"): use support.run_tests() so that more info about
3506            uncollected garbage is printed
3507    
3508            * test/test_selection.py (TestSelection.tearDown): Make sure that
3509            all references to the session and the selection are removed
3510            otherwise we may get a resource leak
3511            (TestSelection.get_layer): Instantiate a session so that we can
3512            use it to open shapefiles.
3513            ("__main__"): use support.run_tests() so that more info about
3514            uncollected garbage is printed
3515    
3516            * test/test_session.py (TestSessionBase.tearDown)
3517            (TestSessionWithContent.tearDown): Make sure that all references
3518            to the session and layers are removed otherwise we may get a
3519            resource leak
3520            (TestSessionWithContent.setUp): Use the session's OpenShapefile
3521            method to open shapefiles
3522    
3523    2003-04-24  Jonathan Coles   <[email protected]>
3524    
3525            * Thuban/Model/load.py (XMLReader.read): Should have been checking
3526            if the file_or_filename object had the 'read' attribute.
3527    
3528    2003-04-23  Jonathan Coles   <[email protected]>
3529    
3530            * Thuban/Model/resource.py: Fixes RTbug #1813.
3531            (ReadProjFile): Add documentation about which exceptions are raised.
3532            Always pass the exceptions up to the caller.
3533            (GetProjFiles): If the directory can't be read return an empty list.
3534            If any of the proj files can't be read skip that file and go
3535            on to the next one.
3536    
3537            * test/test_proj.py: Added test cases to handle nonexistent files,
3538            unreadable files, and files that don't parse correctly.
3539    
3540    2003-04-23  Jonathan Coles   <[email protected]>
3541    
3542            Projection dialog. Allows the user to select from a list
3543            of projection templates and optionally edit them and save new ones.
3544    
3545            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
3546            (ProjPanel): Base class for projection specific panels.
3547            (TMPanel): Projection panel for Transverse Mercartor.
3548            (UTMPanel): Projection panel for Universal Transverse Mercartor.
3549            (LCCPanel): Projection panel for Lambert Conic Conformal.
3550            (GeoPanel): Projetion panel for Geographic Projection.
3551    
3552    2003-04-23  Jonathan Coles   <[email protected]>
3553    
3554            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
3555            promote symmetry. There now exists XMLReader and XMLWriter.
3556            (XMLReader.read): New. Call to read the given file descriptor or
3557            filename.
3558            (XMLReader.close): New. Make sure the file is closed.
3559            (XMLReader.GetFileName): New. Return just the file name that is being
3560            read from.
3561            (XMLReader.GetDirectory): New. Return just the directory of the file
3562            that is being read.
3563            (XMLReader.AddDispatchers): New. Take a dictionary which contains
3564            the names of functions to call as the XML tree is parsed.
3565            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
3566            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
3567            (SessionLoader): Removed class variables start_dispatcher and
3568            end_dispatcher since this functionality is now part of a class
3569            instance. Fixes RTbug #1808.
3570            (SessionLoader.__init__): Add dispatcher functions.
3571            (load_xmlfile): Code was moved into the XMLReader.read().
3572            (load_session): Use modified SessionLoader.
3573    
3574            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
3575            map's projection.
3576    
3577            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
3578            GetAllParameters.
3579            (Projection.GetParameter): Returns the value for the given parameter.
3580    
3581            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
3582            (GetProjFiles): Renamed from GetProjections. Now returns a list
3583            of ProjFile objects.
3584            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
3585            a list of ProjFile objects whose files are not user defined.
3586            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
3587            list of ProjFile objects whose files are user defined.
3588            (ProjFileReader): Extend new XMLReader.
3589    
3590            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
3591            promote symmetry.
3592    
3593            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
3594            control instead of a wxComboBox. wxChoice controls do not generate
3595            events as the uses highlights possible choices which fixes problems
3596            with resizing the dialog when the use selects an option.
3597    
3598            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
3599            control instead of a wxComboBox.
3600    
3601            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
3602            dialog.
3603    
3604            * test/test_proj.py (TestProjection.test): New tests for GetParameter
3605            method.
3606    
3607    2003-04-22  Bernhard Herzog  <[email protected]>
3608    
3609            * Thuban/UI/mainwindow.py: Remove some unused imports and global
3610            constants
3611    
3612            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3613            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
3614    
3615    2003-04-17  Bernhard Herzog  <[email protected]>
3616    
3617            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
3618            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
3619            anymore.
3620            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
3621            (Layer.ShapeType, Layer.Shape): No need to call
3622            self.open_shapefile since it's always called in __init__
3623    
3624            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
3625            In wxPython 2.4 there's no need to extend MainLoop anymore since
3626            wxPython itself makes sure OnExit is called.
3627    
3628    2003-04-16  Jonathan Coles   <[email protected]>
3629    
3630            Initial putback of projection management code. Includes new
3631            classes to read and write projection files. The current load
3632            and save classes were abstracted a bit so they could be reused.
3633            The Projection class was extended to provide new methods and
3634            have a name.
3635    
3636            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
3637            general XML reading methods that were part of ProcessSession.
3638    
3639            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
3640            name.
3641            (ProjFile): New. Represents a file that contains projection
3642            information.
3643    
3644            * Thuban/Model/resource.py: New. Contains general utilities
3645            for read and writing projection files.
3646    
3647            * Thuban/Model/save.py (XMLSaver): New. Contains all the
3648            general XML writing methods that were part of SessionSaver.
3649            (SessionSaver): Renamed from Saver.
3650    
3651            * test/test_proj.py: New test cases for the projection
3652            file read and write functions.
3653    
3654    2003-04-16  Jonathan Coles   <[email protected]>
3655    
3656            * Thuban/Model/classification.py: Use repr() around values
3657            in the ClassGroup*.__repr__() methods so it is clearer when
3658            a value is a string and when it is a number.
3659    
3660            * test/test_load.py: Rework the classification test to test
3661            that we can load old files.
3662            (testLabels): Test a file where the groups have labels.
3663    
3664    2003-04-16  Bernhard Herzog  <[email protected]>
3665    
3666            Safer implementation of the performance enhancements of the
3667            low-level renderer:
3668            
3669            * extensions/thuban/wxproj.cpp (extract_projection)
3670            (extract_pointer): Rename extract_projection to extract_pointer
3671            and redefine its purpose to return the pointer stored in a CObject
3672            returned by the object's cobject method. Update all callers.
3673            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
3674            handling of these low-level parameters so that each s_draw_info
3675            instance is handled as a CObject at python level that also
3676            contains real references to the actual python objects which
3677            contain the values in the struct. Add free_draw_info as the
3678            destructor.
3679            (draw_polygon_shape): Add the py_draw_info parameter which must a
3680            cobject containing an s_draw_info pointer.
3681    
3682            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
3683            method to instantiat the low-level render parameter
3684            (MapRenderer.draw_shape_layer): Use the new method. Remove some
3685            commented out code.
3686            (MapRenderer.draw_polygon_shape): Make the first parameter not the
3687            layer but the low-level render parameter
3688            (ScreenRenderer.draw_shape_layer): Use the low-level render
3689            parameter.
3690    
3691    2003-04-15  Jonathan Coles   <[email protected]>
3692    
3693            * Thuban/Model/classification.py: Implemented __repr__ for
3694            the ClassGroup* classes to make debugging a bit easier.
3695            (ClassGroup.SetLabel): Check that the string is an instance
3696            of StringTypes not StringType. Accounts for Unicode strings.
3697    
3698            * Thuban/Model/color.py: Implemented __repr__ to make
3699            debugging a bit easier.
3700    
3701            * Thuban/Model/save.py (Saver.write_classification): Need to
3702            save the group label.
3703    
3704            * test/test_load.py (testClassification): New. Loads the
3705            iceland_sample_test.thuban file and checks if it was loaded
3706            correctly.
3707    
3708    2003-04-15  Jonathan Coles   <[email protected]>
3709    
3710            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
3711            to improve rendering performance by initializing the variables
3712            that are not change each time draw_polygon_shape() is called.
3713            The values are stored in a global struct draw_info.
3714            (draw_polygon_shape): Removed initialization code that is
3715            now in draw_polygon_init().
3716    
3717            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
3718            drawing initialization call to draw_polygon_init()
3719            (MapRenderer.draw_polygon_shape): Use new signature of
3720            draw_polygon_shape.
3721    
3722            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
3723            weirdness by setting the range to (1, maxint).
3724    
3725            * Thuban/Model/classification.py (ClassGroupProperties): Make
3726            instance variables private and optimize comparison operator
3727            by first checking if the color references are the same.
3728            (ClassGroupSingleton): Make instance variables private.
3729            (ClassGroupRange): Make instance variables private.
3730    
3731            * HOWTO-Release: Filled in missing steps for releasing packages.
3732    
3733    2003-04-15  Bernhard Herzog  <[email protected]>
3734    
3735            First stab at internationalized messages:
3736    
3737            * Thuban/__init__.py (_): Implement the translation function for
3738            real using the python gettext module.
3739    
3740            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
3741            translate empty strings.
3742    
3743            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3744            Add a missing space to a warning message
3745    
3746            * po/README: New. Notes about the management of the translation
3747            files.
3748    
3749            * po/Makefile: New. Makefile to help manage the translation files.
3750    
3751            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
3752    
3753            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
3754            translations and support files in po/
3755    
3756            * setup.py (data_files): Add the *.mo files to the data_files too
3757    
3758            * README: Add note about the translations when building from CVS
3759    
3760    2003-04-14  Jonathan Coles   <[email protected]>
3761    
3762            * Thuban/UI/dock.py: Fixes some window resizing problems most
3763            noticable under windows. Always assume the button bitmaps will
3764            be there. Code clean up.
3765            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
3766            images for the dock/undock button to the same images.
3767            Work around for RTbug #1801.
3768    
3769            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
3770            be allowed to grow within the sizer. Fixes a bug under Windows
3771            where the toolbar wasn't being drawn.
3772    
3773    2003-04-14  Frank Koormann   <[email protected]>
3774    
3775            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
3776            Updated design to try to make the button functionality more
3777            transparent.
3778    
3779    2003-04-14  Jonathan Coles   <[email protected]>
3780    
3781            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
3782            finalize the intialization of the panel.
3783    
3784            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
3785            creation of the panel. Should be the last thing called in the
3786            initializer of a subclass.
3787    
3788            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
3789            set the current selections in the combo boxes. This is needed
3790            under Windows.
3791    
3792            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
3793            level panel to the dialog so that the background colors are
3794            consistent under Windows.
3795    
3796    2003-04-11  Jonathan Coles   <[email protected]>
3797    
3798            * Thuban/UI/classgen.py: Change color ramps to start at white
3799            not black.
3800    
3801            * Thuban/UI/legend.py: Enable/disable the legend buttons when
3802            the legend changes. Fixes RTbug #1793.
3803    
3804            * test/test_classification.py: Added test for copying of
3805            classifications.
3806    
3807    2003-04-11  Jonathan Coles   <[email protected]>
3808    
3809            * Thuban/UI/resource.py: New. Centralize the loading of resources
3810            such as bitmaps.
3811    
3812            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
3813            added images to the move buttons, added 'reverse' button.
3814            (CustomRampPanel.__init__): Added images to the move buttons.
3815            (GreyRamp): New. Generates a ramp from white to black.
3816            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
3817    
3818            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
3819            ID_PROPERTY_*.
3820            (Classifier.__init__): Minor changes to the layout.
3821            (Classifier._OnTitleChanged): Listen for when the user edits the
3822            title and update the dialog's title and the layer's title.
3823    
3824            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
3825    
3826            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
3827            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
3828            if the layer's title changes.
3829    
3830            * Thuban/UI/mainwindow.py: Added new menu item and associated code
3831            to open a dialog to rename the map.
3832            (MainWindow): Use new resource class to import bitmaps.
3833    
3834    2003-04-11  Jonathan Coles   <[email protected]>
3835    
3836            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
3837            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
3838            Resources/Bitmaps/group_use_none.xpm,
3839            Resources/Bitmaps/group_use_not.xpm,
3840            Resources/Bitmaps/hide_layer.xpm,
3841            Resources/Bitmaps/layer_properties.xpm,
3842            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
3843            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
3844            New.
3845    
3846    2003-04-10  Jonathan Coles   <[email protected]>
3847    
3848            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
3849            Should pass group to ClassGroup constructor.
3850    
3851    2003-04-10  Jonathan Coles   <[email protected]>
3852    
3853            * Thuban/Model/classification.py: (ClassGroup): Move all the common
3854            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
3855            here. Implement SetVisible(), IsVisible().
3856            (ClassGroup.__init__): Add group parameter which acts as a copy
3857            constructor.
3858    
3859            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
3860            "Visible" check boxes.
3861            (Classifier): Rename the buttons and refactor the code to match
3862            the new labels.
3863    
3864            * Thuban/UI/legend.py: Classify button is now called "Properties".
3865            Refactored the code to change variable names.
3866            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
3867    
3868            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
3869            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
3870            renamed to MainWindow.LayerEditProperties.
3871            (MainWindow.ToggleLegend): Don't include map name in legend title.
3872            (MainWindow.SetMap): Added the map name to the window title.
3873            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
3874            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
3875            Functionality is found in the layer properties dialog.
3876    
3877            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3878            draw visible groups.
3879    
3880    2003-04-09  Jonathan Coles   <[email protected]>
3881    
3882            * Thuban/UI/classgen.py: Modifications to allow simple
3883            addition and selection of new color schemes.
3884            (MonochromaticRamp): New. Generates a ramp between two colors.
3885            (RedRamp): New. Generates a ramp of all red.
3886            (GreenRamp): New. Generates a ramp of all green.
3887            (BlueRamp): New. Generates a ramp of all blue.
3888    
3889    2003-04-09  Jonathan Coles   <[email protected]>
3890    
3891            * Thuban/Model/classification.py (Classification.__deepcopy__):
3892            Need to copy over field and fieldType attributes.
3893    
3894            * Thuban/Model/table.py (Table.field_range): New. Retrive the
3895            maximum and minimum values over the entire table for a given
3896            field.
3897            (Table.GetUniqueValues): New. Retrieve all the unique values
3898            in the table for a given field.
3899    
3900            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
3901            (GenUniquePanel): New. Controls to allow the user to select
3902            which unique field values they would like in the classification.
3903            (CustomRampPanel): Code that was in ClassGenDialog that allows
3904            the user to select the properties for a custom ramp.
3905            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
3906    
3907            * Thuban/UI/classifier.py: Removed a lot of debugging code.
3908            (Classifier._SetClassification): Callback method so that the
3909            class generator can set the classification in the grid.
3910            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
3911            editing of a group properties class into a wxWindows control.
3912    
3913            * Thuban/UI/dock.py: It was decided that if the user closes
3914            a dockable window the window should simply hide itself. That
3915            way if the user wants to show the dock again it appears in the
3916            same place as it was when it was closed.
3917            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
3918            (DockableWindow._OnButtonClose): Hide the window instead of
3919            destroying it.
3920            (DockableWindow._OnClose): Hide the window instead of
3921            destroying it.
3922    
3923            * Thuban/UI/legend.py (LegendTree): Use a private method to
3924            consistently set the font and style of the text. Fixes RTbug #1786.
3925    
3926            * Thuban/UI/mainwindow.py: Import just the Classifier class.
3927    
3928    2003-04-07  Bernhard Herzog  <[email protected]>
3929    
3930            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
3931            to the map module
3932    
3933    2003-04-07  Bernhard Herzog  <[email protected]>
3934    
3935            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
3936            favor of ToggleSessionTree
3937            (MainWindow.ToggleSessionTree): New method to toggle visibility of
3938            the session tree.
3939            (MainWindow.SessionTreeShown): New method to return whether the
3940            session tree is currently shown.
3941            (MainWindow.ToggleLegend): New method to toggle visibility of the
3942            legend
3943            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
3944            LegendShown
3945            (MainWindow.LegendShown): New method to return whether the legend
3946            is currently shown.
3947            (_method_command): Add checked parameter so we can define check
3948            menu items
3949            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
3950            mainwindow methods.
3951            (show_session_tree, show_legend commands): Removed.
3952            (toggle_session_tree, toggle_legend commands): New commands to
3953            toggle the visibility of the dialogs
3954    
3955    2003-04-07  Jonathan Coles   <[email protected]>
3956    
3957            * Thuban/UI/classgen.py: Fix Windows problem.
3958    
3959            * Thuban/UI/dock.py: Fix Windows problem.
3960    
3961            * Thuban/UI/mainwindow.py: Use False instead of false.
3962            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
3963    
3964    2003-04-07  Jonathan Coles   <[email protected]>
3965    
3966            Since we now say that the order of the groups in a classification
3967            matters, it makes sense to be able to manipulate that order. Most
3968            of the changes to Thuban/Model/classification.py are to that end.
3969    
3970            * Thuban/Model/classification.py (Classification.AppendGroup,
3971            Classification.InsertGroup, Classification.ReplaceGroup,
3972            Classification.RemoveGroup, Classification.GetGroup): Do as the
3973            names imply.
3974            (Classification.FindGroup): This was called GetGroup, but GetGroup
3975            takes an index, while FindGroup takes a value.
3976            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
3977            REFERENCE. Currently there is a cyclic reference between the layer
3978            and its classification. If the classification doesn't need to know
3979            its owning layer we can change this, since it may make sense to be
3980            able to use the same classification with different layers.
3981    
3982            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
3983    
3984            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
3985            not AddGroup()
3986    
3987            * Thuban/UI/classifier.py: Now that we can depend on the order in
3988            a Classification and have methods to manipulate that order we don't
3989            need to use our own data structures in the grid. We can simply make
3990            the grid/table access the information they need from a copy of
3991            the classification object.
3992            (Classifier._OnCloseBtn): Event handler for when the user clicks
3993            'Close'. This is needed so if the user applies changes and then
3994            continues to change the table the user has the option of discarding
3995            the most recent changes and keeping what they applied.
3996    
3997            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
3998            into the same group.
3999    
4000            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4001            with a really old version of proj, PJ_VERSION won't even be defined.
4002            If it isn't defined then just compile so that the function always
4003            returns Py_False.
4004    
4005            * test/test_classification.py: Fix tests to use the renamed methods.
4006            Still need to write tests for the new methods.
4007    
4008    2003-04-04  Jonathan Coles   <[email protected]>
4009    
4010            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4011            call to SetSelection out of the method and before the call
4012            to __SelectField in __init__. This prevents a recursion of events
4013            when _OnFieldSelect is triggered by the user.
4014    
4015    2003-04-04  Jonathan Coles   <[email protected]>
4016    
4017            * Thuban/Model/classification.py: Rename Color.None to
4018            Color.Transparent.
4019            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4020            Don't bother copying the color, since Colors are immutable.
4021    
4022            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4023            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4024            Thuban/UI/renderer.py, Thuban/UI/view.py:
4025            Rename Color.None to Color.Transparent.
4026        
4027            * test/test_classification.py, test/test_load.py: Rename Color.None
4028            to Color.Transparent.
4029    
4030    2003-04-04  Jonathan Coles   <[email protected]>
4031    
4032            * Thuban/Model/classification.py: Fix assert calls.
4033            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4034            Copy the color parameter rather than hold onto a reference.
4035    
4036            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4037            the color object.
4038            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4039            are sure there exists only one refernce to Color.None in the system.
4040            This allows us to use 'is' rather than the comparision functions.
4041            
4042            * Thuban/Model/save.py: Fix assert calls.
4043            
4044            * Thuban/UI/classifier.py: Fix assert calls.
4045            (ClassGrid._OnCellDClick): Call up to the classifier to open the
4046            dialog to edit the groups properties.
4047            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4048            correctly if a cell is resized.
4049            (ClassTable.SetClassification): New. Changes the classification
4050            that is in the table.
4051            (ClassTable.__SetRow): Allow groups to be prepended.
4052            (Classifier): New code for opening the EditProperties and
4053            GenerateRanges dialogs.
4054            (SelectPropertiesDialog.__GetColor): Only set the color in the
4055            color dialog if the current color is not None.
4056            
4057            * Thuban/UI/dock.py: Fix assert calls.
4058            
4059            * Thuban/UI/legend.py: Fix assert calls.
4060            
4061            * Thuban/UI/renderer.py: Fix assert calls.
4062            
4063            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4064            classifications.
4065            (GenRangePanel): Panel specific to range generation.
4066            (GenSingletonPanel): Panel specific to singleton generation.
4067            (ClassGenerator): Class responsible for actually generating
4068            the classification from the data gathered in the dialog box.
4069            (PropertyRamp): Generates properties whose values range from
4070            a starting property to an ending property.
4071    
4072    2003-04-03  Bernhard Herzog  <[email protected]>
4073    
4074            * test/support.py (print_garbage_information): New function that
4075            prints information about still connected messages and memory
4076            leaks.
4077            (run_suite): Removed.
4078            (run_tests): New function for use as a replacement of
4079            unittest.main in the test_* files. This one calls
4080            print_garbage_information at the end.
4081    
4082            * test/runtests.py (main): Use support.print_garbage_information
4083    
4084            * test/test_layer.py: Use support.run_tests instead of
4085            unittest.main so we get memory leak information
4086            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4087            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4088            (TestLayerLegend.test_visibility): Call the layer's Destroy method
4089            to fix a memory leak.
4090    
4091            * test/test_classification.py: Use support.run_tests instead of
4092            unittest.main so we get memory leak information
4093            (TestClassification.test_classification): Call the layer's Destroy
4094            method to fix a memory leak.
4095    
4096    2003-04-02  Bernhard Herzog  <[email protected]>
4097    
4098            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4099            Handle the reference counts of the return value and errors in
4100            PyArg_ParseTuple correctly.
4101    
4102            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4103            sure the filename is absolute to avoid problems when saving the
4104            session again
4105    
4106            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4107    
4108    2003-04-01  Jonathan Coles   <[email protected]>
4109    
4110            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4111            that there actually are points in the returned list of points
4112            before trying to index into the list. The list may be empty if
4113            the shape is a Null Shape.
4114    
4115    2003-04-01  Bernhard Herzog  <[email protected]>
4116    
4117            * test/test_map.py: Don't use from <module> import *
4118    
4119    2003-04-01  Jonathan Coles   <[email protected]>
4120    
4121            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4122            LAYER_LEGEND_CHANGED
4123    
4124            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4125            self.Destroy() to close the window after yesterday's changes.
4126    
4127            * test/test_map.py, test/test_session.py: Fix messages that
4128            are sent from maps and layers.
4129    
4130    2003-03-31  Jonathan Coles   <[email protected]>
4131    
4132            * Thuban/UI/classifier.py: Commented out some debugging statements.
4133            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4134            RTbug #1769.
4135    
4136            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4137            position (although position doesn't work yet under GTK).
4138            (DockableWindow.Destroy): New. Called when the window must be
4139            closed. Namely needed when the DockFrame closes and must close
4140            its children.
4141            (DockFrame): Listen for EVT_CLOSE and destroy all children.
4142    
4143            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4144            when then window is told to close.
4145            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4146            comment in source for more info.
4147    
4148            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4149    
4150            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4151            symmetry with other such methods.
4152            (MainWindow.ShowLegend): Show the legend docked by default.
4153    
4154    2003-03-28  Jonathan Coles   <[email protected]>
4155    
4156            * Thuban/UI/classifier.py: Support for highlighting a specific
4157            group within the grid when the classification dialog is opened.
4158            Also contains a lot of debugging printouts which will later
4159            be removed.
4160    
4161            * Thuban/UI/dock.py: Complete rework on the dock code so that
4162            that it is fairly removed from the rest of the Thuban application.
4163            It is easy to add new docks which the rest of the program having
4164            to be aware of them.
4165    
4166            * Thuban/UI/legend.py: Modifications to support selecting a
4167            specific group in the classification dialog. Changed how layers
4168            are drawn when the layer is visible/invisible.
4169    
4170            * Thuban/UI/mainwindow.py: Removed legend specific code and
4171            replaced it with calls to the new dock code.
4172    
4173            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4174            to check if scale > 0. Trying to track down a divide by zero.
4175    
4176    2003-03-26  Jonathan Coles   <[email protected]>
4177    
4178            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4179            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4180            now part of DockableWindow.
4181            (LegendPanel.DoOnSelChanged): Select the current layer in the
4182            map.
4183            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4184            with the selected layer and/or group.
4185    
4186    2003-03-26  Jonathan Coles   <[email protected]>
4187    
4188            This putback contains the code for dockable windows. There is
4189            no support in wxWindows as of this date for windows that can
4190            attach themselves to other windows.
4191    
4192            The current model contains a DockableWindow which has a parent
4193            window for when it is detached and a dock window that it puts
4194            its contents in when it is docked. The contents of a DockableWindow
4195            must be a DockPanel. DockPanel itself derives from wxPanel.
4196    
4197            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4198            message, not a LAYER_LEGEND_CHANGED message.
4199    
4200            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
4201    
4202            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
4203            as one of the style properties for the fieldTypeText item to
4204            be sure that its size is correct when the text changes.
4205    
4206            * Thuban/UI/dock.py: New. Classes for the DockPanel and
4207            DockableWindow.
4208    
4209            * Thuban/UI/legend.py: Added some more buttons and made the
4210            LegendPanel a DockPanel.
4211    
4212            * Thuban/UI/mainwindow.py: Added sash windows to the main window
4213            and supporting functions for manipulating the sashes.
4214            (MainWindow.ShowLegend): Create a DockableWindow with the
4215            LegendPanel as the contents.
4216    
4217            * Thuban/UI/messages.py: Added DOCKABLE_* messages
4218    
4219            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
4220            not LAYER_LEGEND_CHANGED, messages.
4221    
4222    2003-03-25  Jonathan Coles   <[email protected]>
4223    
4224            * setup.py: Added custom script bdist_rpm_build_script so that
4225            when the rpm is built the path to wx-config is correct.
4226    
4227            * setup.cfg: Added line saying to use the custom build script
4228    
4229    2003-03-20  Jonathan Coles   <[email protected]>
4230    
4231            Initial implementation of the Legend.
4232    
4233            * Thuban/UI/legend.py: New. Creates a window that shows the map's
4234            Legend information and allows the user to add/modify classifications
4235            and how the layers are drawn on the map.
4236    
4237            * setup.py: New command 'build_docs' which currently uses
4238            happydoc to generate html documentation for Thuban.
4239    
4240            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
4241            Returns a string which is appropriately describes the group.
4242    
4243            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
4244            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
4245    
4246            * Thuban/Model/map.py (Map): Rename messages and use new, more
4247            specific, messages.
4248    
4249            * Thuban/Model/messages.py: New message to indicate that a layer's
4250            data has changed (LAYER_CHANGED). New map messages to indicate
4251            when layers have been added/removed/changed or if the stacking order
4252            of the layers has changed.
4253    
4254            * Thuban/Model/session.py: Rename and use new messages.
4255    
4256            * Thuban/UI/classifier.py: Remember if any changes have actually
4257            been applied so that if the dialog is cancelled without an application
4258            of changes we don't have to set a new classification.
4259            (ClassDataPreviewer): Pulled out the window specific code and put it
4260            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
4261            symbols on any DC.
4262            
4263            * Thuban/UI/mainwindow.py: New code to open the legend.
4264    
4265            * Thuban/UI/view.py: Use new message names.
4266    
4267    2003-03-19  Jonathan Coles   <[email protected]>
4268    
4269            * Thuban/UI/main.py (verify_versions): New. Checks the versions
4270            of Python, wxPython, and some other libraries.
4271    
4272            * extensions/thuban/wxproj.cpp (check_version): Checks the given
4273            version against what wxproj was compiled with.
4274            (check_version_gtk): If wxproj was compiled with gtk then check
4275            the given version against the version of the gtk library
4276            currently being used.
4277    
4278    2003-03-14  Bernhard Herzog  <[email protected]>
4279    
4280            * test/test_command.py: Run the tests when the module is run as a
4281            script
4282    
4283    2003-03-14  Bernhard Herzog  <[email protected]>
4284    
4285            Implement selection of multiple selected shapes in the same layer:
4286    
4287            - Introduce a new class to hold the selection. This basically
4288              replaces the interactor which was nothing more than the
4289              selection anyway. A major difference is of course that the new
4290              selection class supports multiple selected shapes in one layer
4291            
4292            - Move the object that represents the selection from the
4293              application to the canvas. The canvas is a better place than the
4294              application because the selection represents which shapes and
4295              layer of the map displayed by the canvas are selected and
4296              affects how the map is drawn.
4297    
4298            - Make the selection and its messages publicly available through
4299              the mainwindow.
4300    
4301            - The non-modal dialogs do not get a reference to the interactor
4302              anymore as they can simply refer to their parent, the
4303              mainwindow, for the what the interactor had to offer.
4304    
4305            * Thuban/UI/selection.py: New module with a class to represent the
4306            selection.
4307    
4308            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
4309            these unused messages
4310    
4311            * Thuban/UI/application.py (ThubanApplication.OnInit)
4312            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
4313            interactor is gone now.
4314            (ThubanApplication.CreateMainWindow): There is no interactor
4315            anymore so we pass None as the interactor argument for now for
4316            compatibility.
4317    
4318            * Thuban/UI/view.py (MapCanvas.delegated_messages)
4319            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
4320            Unsubscribe, delegate messages according to the delegated_messages
4321            class variable.
4322            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
4323            attributes from instance variables as described with the
4324            delegated_methods class variable.
4325            (MapCanvas.__init__): New instance variable selection holding the
4326            current selection
4327            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
4328            pass them on to the renderer
4329            (MapCanvas.SetMap): Clear the selection when a different map is
4330            selected.
4331            (MapCanvas.shape_selected): Simple force a complete redraw. The
4332            selection class now takes care of only issueing SHAPES_SELECTED
4333            messages when the set of selected shapes actually does change.
4334            (MapCanvas.SelectShapeAt): The selection is now managed in
4335            self.selection
4336    
4337            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
4338            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
4339            Unsubscribe, delegate messages according to the delegated_messages
4340            class variable.
4341            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
4342            attributes from instance variables as described with the
4343            delegated_methods class variable.
4344            (MainWindow.__init__): The interactor as ivar is gone. The
4345            parameter is still there for compatibility. The selection messages
4346            now come from the canvas.
4347            (MainWindow.current_layer, MainWindow.has_selected_layer):
4348            Delegate to the the canvas.
4349            (MainWindow.LayerShowTable, MainWindow.Classify)
4350            (MainWindow.identify_view_on_demand): The dialogs don't need the
4351            interactor parameter anymore.
4352    
4353            * Thuban/UI/tableview.py (TableFrame.__init__)
4354            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
4355            (LayerTableFrame.row_selected): The interactor is gone. It's job
4356            from the dialog's point of view is now done by the mainwindow,
4357            i.e. the parent. Subscribe to SHAPES_SELECTED instead
4358            of SELECTED_SHAPE
4359            
4360            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
4361            is gone. It's job from the dialog's point of view is now done by
4362            the mainwindow, i.e. the parent.
4363            
4364            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
4365            gone. It's job from the dialog's point of view is now done by the
4366            mainwindow, i.e. the parent.
4367    
4368            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
4369            gone. It's job from the dialog's point of view is now done by the
4370            mainwindow, i.e. the parent.
4371            (SessionTreeCtrl.__init__): New parameter mainwindow which is
4372            stored as self.mainwindow. The mainwindow is need so that the tree
4373            can still subscribe to the selection messages.
4374            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
4375            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
4376            selection is now accessible through the mainwindow. Subscribe to
4377            SHAPES_SELECTED instead of SELECTED_SHAPE
4378    
4379            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
4380            SHAPES_SELECTED message now.
4381            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
4382            so deal with multiple shapes
4383            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
4384            gone. It's job from the dialog's point of view is now done by the
4385            mainwindow, i.e. the parent.
4386    
4387            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
4388            parameter is now a list of shape ids.
4389            (RecordTable.SetTable): The second parameter is now a list of
4390            indices.
4391    
4392            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
4393            selected_shape parameter and ivar to selected_shapes. It's now a
4394            list of shape ids.
4395            (MapRenderer.draw_label_layer): Deal with multiple selected
4396            shapes. Rearrange the code a bit so that the setup and shape type
4397            distinctions are only executed once.
4398    
4399            * test/test_selection.py: Test cases for the selection class
4400    
4401    2003-03-11  Jonathan Coles   <[email protected]>
4402    
4403            * Thuban/Model/load.py: Temporary fix so that the xml reader
4404            doesn't cause Thuban to crash.
4405    
4406            * Thuban/Model/layer.py: Handle the cyclic references between
4407            a layer and its classification better, and be sure to disconnect
4408            the classification from the layer when the layer is destroyed
4409            so that we don't maintain a cyclic reference that may not be
4410            garbage collected.
4411    
4412            * Thuban/Model/classification.py: See comment for layer.py.
4413    
4414    2003-03-12  Jan-Oliver Wagner <[email protected]>
4415    
4416            * HOWTO-Release: New. Information on the steps for releasing
4417            a new version of Thuban.
4418    
4419    2003-03-11  Jonathan Coles   <[email protected]>
4420    
4421            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
4422            Use True instead of true.
4423            (Classifier): Should have a single panel in which all the controls lie.
4424    
4425            * Thuban/UI/proj4dialog.py: Add normal border.
4426    
4427            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
4428    
4429            * Thuban/UI/mainwindow.py: Use True instead of true.
4430    
4431            * setup.py: Update some definitions to use wxWindows2.4 files
4432    
4433            * Data/iceland_sample_class.thuban: Fixed file so that the
4434            field_type information is present.
4435    
4436    2003-03-10  Jonathan Coles   <[email protected]>
4437    
4438            * Thuban/UI/classifier.py (Classifier.__init__): Make the
4439            field type label grow so that when the text changes the
4440            size is updated correctly. This may be a wxWindows bug.
4441    
4442    2003-03-10  Jonathan Coles   <[email protected]>
4443    
4444            * Thuban/UI/application.py: Changed SESSION_CHANGED to
4445            SESSION_REPLACED.
4446    
4447            * Thuban/UI/classifier.py: Wrap text with _().
4448            (ClassGrid.CreateTable): Set dimensions and size hints here,
4449            instead of in Reset, so we only set the size once.
4450    
4451            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
4452    
4453            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4454            Call Close() instead of Shutdown().
4455    
4456            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4457    
4458            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4459            Go back to using OnClose() instead of Shutdown().
4460    
4461    2003-03-10  Jonathan Coles   <[email protected]>
4462    
4463            * Thuban/UI/classifier.py (Classifier): SelectField() needed
4464            to know the old field index as well as the new one.
4465    
4466    2003-03-10  Jonathan Coles   <[email protected]>
4467    
4468            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
4469            to correctly set the table information and call this from
4470            __init__ and from _OnFieldSelect so that all the information
4471            is up to date when the dialog opens and when a field is changed.
4472    
4473    2003-03-10  Jonathan Coles   <[email protected]>
4474    
4475            * Thuban/Model/classification.py (Classification): Don't use
4476            layer's message function directly, use the ClassChanged() method
4477            when then classification changes. SetField/SetFieldType/SetLayer
4478            must keep the information about field name and field type in
4479            sync when an owning layer is set or removed.
4480    
4481            * Thuban/Model/layer.py: Added ClassChanged() so that the
4482            classification can tell the layer when its data has changed.
4483            (Layer.SetClassification): Accepts None as an arguement to
4484            remove the current classification and correctly handles
4485            adding a new classification.
4486    
4487            * Thuban/Model/load.py: Comment out print statement
4488    
4489            * test/test_classification.py, test/test_save.py: New and
4490            improved tests.
4491    
4492    2003-03-07  Jonathan Coles   <[email protected]>
4493    
4494            * Thuban/Model/classification.py: Implemented __copy__ and
4495            __deepcopy__ for ClassGroup* and ClassGroupProperites so
4496            they can easily be copied by the classifier dialog.
4497            (ClassGroupProperites.__init__): The default line color should
4498            have been Color.Black.
4499    
4500            * Thuban/UI/classifier.py: Setting and Getting table values now
4501            uses a consistent set of functions.
4502            (Classifier): Now non-modal. Has field type label which changes
4503            as the field changes. Keep track of buttons in a list so that
4504            we can enable/disable the buttons when the None field is selected.
4505            (SelectPropertiesDialog): Add buttons to make the colors transparent.
4506    
4507            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
4508            does what OnClose did, but can be called by the application to
4509            close a window. Needed when a session changes, and we have to
4510            close the classifier windows.
4511    
4512            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4513            Shuts down open dialogs. Used when a new session is created
4514            or a session is opened.
4515            (MainWindow.SaveSession): Should only call application.SaveSession()
4516            if we don't call SaveSessionAs first.
4517            (MainWindow.Classify): Allow different classifier dialogs for
4518            different layers.
4519    
4520            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
4521            the parent class handle it. Add Shutdown() to unsubscibe from
4522            event notification and call the parent Shutdown(). This was
4523            necessary so the application can close the tree window.
4524    
4525    2003-03-06  Jonathan Coles   <[email protected]>
4526    
4527            * Thuban/Model/classification.py: Minor documentation changes,
4528            Addition of __eq__ and __ne__ methods.
4529            (Classification.SetLayer): prevent recursion between this method
4530            and Layer.SetClassification().
4531    
4532            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
4533    
4534            * Thuban/Model/layer.py (SetClassification): prevent recursion
4535            between this method and Classification.SetLayer().
4536    
4537            * test/test_classification.py, test/test_load.py,
4538            test/test_session.py: Fixed and added tests for the classification
4539            classes.
4540    
4541    2003-03-06  Bernhard Herzog  <[email protected]>
4542    
4543            * Thuban/UI/classifier.py (ClassGrid.__init__)
4544            (ClassGrid.CreateTable): Move the SetSelectionMode call to
4545            CreateTable because otherwise it triggers an assertion in
4546            wxPython/wxGTK 2.4.
4547    
4548    2003-03-05  Jonathan Coles   <[email protected]>
4549    
4550            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
4551    
4552            * Thuban/Model/load.py: import FIELDTYPE constants from table.
4553    
4554            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
4555    
4556            * Thuban/Model/table.py: Put FIELDTYPE constants back.
4557    
4558    2003-03-05  Jonathan Coles   <[email protected]>
4559    
4560            * Thuban/UI/classifier.py: Added class documentation.
4561            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
4562            Store just the groups in the table and generate the other
4563            column information when it is requested. Add "None" field
4564            to pull-down to select no classification.
4565    
4566            * Thuban/common.py: Moved FIELDTYPE constants from table.py
4567            (Str2Num): Only catch ValueError exceptions.
4568    
4569            * Thuban/Model/classification.py: Class documentation. Renaming
4570            of methods with Stroke to Line. Groups are stored in a single
4571            list with the default as the first element. Groups are searched
4572            in the order they appear in the list.
4573    
4574            * Thuban/Model/color.py: Documentation.
4575    
4576            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
4577            the kind of data represented by a field.
4578    
4579            * Thuban/Model/load.py (ProcessSession): Use proper string
4580            conversion function; fixes RTbug #1713.
4581    
4582            * Thuban/Model/save.py (Saver): Store field type information.
4583    
4584            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
4585            (Table): Add field_info_by_name() to retrieve field information
4586            by specifying the field name, not the number.
4587    
4588            * Thuban/UI/mainwindow.py: Function name changes.
4589    
4590            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4591            get the layer classification once. Don't try to classify
4592            values when the field is None: just use the default properties.
4593    
4594            * Thuban/UI/view.py: Function name changes.
4595    
4596            * Doc/thuban.dtd: Add field_type attribute to a classification.
4597    
4598    2003-03-04  Bernhard Herzog  <[email protected]>
4599    
4600            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
4601            the fill and stroke layer attributes optional with suitable
4602            default values. Add the stroke_width layer attribute. Use correct
4603            syntax for empty elements. Make the attribute list for labels
4604            refer to the label element.
4605    
4606    2003-03-04  Bernhard Herzog  <[email protected]>
4607    
4608            * setup.py (thuban_build_py.build): Add a comment about distutils in
4609            Python 2.3 containing some of the functionality we implement in
4610            setup.py ourselves.
4611    
4612            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
4613            before the selection mode. Doing it the other way round triggers
4614            an assertion in wxWindows.
4615    
4616            * Thuban/Model/save.py (escape): Fix typo in doc-string
4617    
4618            * Thuban/Model/classification.py: Remove unnecessary wxPython
4619            import
4620    
4621    2003-03-04  Jonathan Coles   <[email protected]>
4622    
4623            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
4624            Parameter 'value' should default to None.
4625    
4626            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
4627            the class attribute __classification is now private.
4628    
4629            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
4630            Classifier to ClassGrid. Added support for removing selected rows,
4631            which including code for keeping track of when cells are selected,
4632            and deselected.
4633            (ClassTable): Support for added/removing rows. Fixed a problem
4634            with __ParseInput whereby it would not allow strings (only numbers)
4635            to be entered.
4636            (Classifier): Added button and supporting code for removing
4637            selected rows.
4638    
4639    2003-02-27  Jonathan Coles   <[email protected]>
4640    
4641            * Thuban/common.py: Moved color conversion functions into
4642            Thuban/UI/common.py.
4643            (Str2Num): Now converts the float (not the string) to a long/int
4644            so that an exception isn't thrown.
4645    
4646            * Thuban/UI/common.py: Common functions used in several UI modules
4647    
4648            * Thuban/Model/classification.py: Changed the class hierarchy
4649            so that a Classification consists of Groups which return
4650            Properties when a value matches a Group.
4651    
4652            * Thuban/Model/layer.py: Fixed name resolution problem.
4653    
4654            * Thuban/Model/load.py: Use new Classification and Group functions.
4655    
4656            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
4657            failure.
4658            (Saver.write_classification): Use new Classification and Group
4659            functions.
4660    
4661            * Thuban/UI/classifier.py: Changes to use new Classification and Group
4662            functions. Fix to create a tuple with a single value instead of
4663            simply returning the value.
4664    
4665            * Thuban/UI/renderer.py: Use new Classification and Group functions.
4666            Use common.py functions.
4667    
4668            * Thuban/UI/tree.py: Use common.py functions.
4669            
4670            * test/test_classification.py: Use new Classification and Group
4671            classes.
4672    
4673    2003-02-24  Jonathan Coles   <[email protected]>
4674    
4675            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
4676            functions from Thuban color objects to wxWindow colour objects.
4677    
4678            * Thuban/Model/classification.py (Classification): Renamed
4679            GetProperties() to GetClassData(). Used the new iterator
4680            in TreeInfo().
4681            (ClassIterator): Iterator implementation to iterate over the
4682            ClassData objects in a classification object.
4683    
4684            * Thuban/Model/save.py (Saver.write_classificaton): Uses
4685            the new iterator to save the classification information.
4686    
4687            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
4688            for changing the stroke and fill colors and previewing the
4689            changes.
4690    
4691            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
4692            MainWindow.SaveSessionAs): Text string changes so the dialogs
4693            have more meaningful titles.
4694    
4695            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
4696            Classification method name from GetProperties to GetClassData.
4697    
4698            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
4699            instead of accessing now non-existent class variables.
4700    
4701    2003-02-24  Bernhard Herzog  <[email protected]>
4702    
4703            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
4704            unneeded Shape() call. Rendering is substantially faster without
4705            it and it avoids some problems with broken shape files.
4706    
4707    2003-02-20  Frank Koormann   <[email protected]>
4708    
4709            Force minimal size of identify and label dialogs. The autosizing
4710            looked too ugly.
4711    
4712            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
4713            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
4714            Set size of listctrl.
4715            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4716            Set size of dialog.
4717    
4718    2003-02-19  Jonathan Coles   <[email protected]>
4719    
4720            * test/test_classification.py, test/test_layer.py,
4721            test/test_load.py, test/test_map.py, test/test_session.py:
4722            Updated the tests to use the new functions that are in the
4723            respective classes.
4724    
4725            * Thuban/Model/classification.py (Classification):
4726            Uses the new ClassData* classes. Modification messages are
4727            passed up to the parent layer (if it exists).
4728            (ClassData): New class to encapsulate the common data in each
4729            classification property.
4730            (ClassDataDefault): Represents the Default class. data.
4731            (ClassDataPoint): Represents a single class. data point
4732            (ClassDataRange): Represents a class. range
4733            (ClassDataMap): Represents a class. map (unused).
4734    
4735            * Thuban/Model/color.py: Added Color.None to represent something
4736            with no color. Color.Black represents the color black.
4737            (NoColor): Helper class derived from Color to represent something
4738            with no color.
4739    
4740            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
4741            stroke_width attributes. Made the 'classification' attribute private.
4742            New methods for setting/getting the classification.
4743    
4744            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
4745            to get the classifcation and use the new ClassData* classes to
4746            hold the classification data. Use Str2Num to convert numbers
4747            properly.
4748    
4749            * Thuban/Model/save.py (Saver): Use new Color and Classification
4750            methods
4751    
4752            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
4753            custom grid.
4754            (ClassTable): Support for editing Values and Labels and for
4755            changing what type (point or range) of data is stored in each
4756            property based on how the user enters the data.
4757            (Classifier): Support for saving the new classifications and
4758            launching the dialog to edit a property.
4759            (SelectPropertiesDialog): New class for editing the visual
4760            properties of a classification (stroke color, width, and fill color)
4761            (ClassPreviewer): Took the Draw method from ClassRenderer and
4762            made most of it into this new class. Intend to use this class in
4763            the SelectPropertiesDialog for previewing changes.
4764    
4765            * Thuban/UI/renderer.py: Use new Color and Classification methods.
4766    
4767            * Thuban/UI/tree.py: Formatting changes.
4768    
4769            * Doc/thuban.dtd: Add 'label' element
4770    
4771            * Thuban/common.py: New. Contains common routines used throughout
4772            the code.
4773            (Str2Num): Takes a string and converts it to the "best" type of
4774            number.
4775    
4776    2003-02-14  Bernhard Herzog  <[email protected]>
4777    
4778            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
4779            dragging flag is always set to 0 even when the tool implementation
4780            raises an exception
4781    
4782    2003-02-11  Bernhard Herzog  <[email protected]>
4783    
4784            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
4785            method to create a splash screen.
4786            (ThubanApplication.ShowMainWindow): New. Show the main window.
4787            Needed so the splash screen can display the mainwindow
4788            (ThubanApplication.OnInit): Call the
4789            new splash_screen method to determine whether the application
4790            should display a splash screen. If it displays a splash screen do
4791            not immediately show the main window.
4792    
4793    2003-02-11  Jonathan Coles  <[email protected]>
4794    
4795            * Thuban/Model/classification.py: Added import line to fix
4796            feature conflicts between running on python2.2 and python2.1.
4797    
4798            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
4799            onto the clinfo parameter, so removed the deepcopy().
4800    
4801    2003-02-10  Jonathan Coles  <[email protected]>
4802    
4803            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4804            Added element_open variable to track opening and closing of tags
4805            so that tags that don't span more than one line are closed with
4806            /> instead of </tag_name>. Use the GetDefault*() methods of
4807            the Classification class.
4808    
4809            * Thuban/Model/classification.py (Classificaton): Added set and
4810            get methods for the default data. The class also takes a layer
4811            reference so that modification messages can be sent. Fixed the
4812            methods to use the new ClassData class.
4813            (ClassData): New class to encapsulate the classification data
4814    
4815            * Thuban/Model/layer.py (Layer): Remove the
4816            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4817            SetDefault*() methods on the layer's classification object.
4818            (Layer.__init__): Use the new SetDefault*() methods in the
4819            Classification class.
4820    
4821            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4822            object instead of a dictionary.
4823    
4824            * Thuban/UI/classifier.py (ClassRenderer): New class to
4825            draw the classifications in the dialog box's table.
4826            (Classifier): Modified to use the ClassRenderer class.
4827    
4828            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
4829            methods of the Classification class.
4830    
4831            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
4832            of the ClassData class.
4833    
4834            * test/test_classification.py, test/test_layer.py,
4835            test/test_map.py, test/test_session.py: Fix the tests to work
4836            with the above code changes.
4837    
4838    2003-02-03  Jonathan Coles  <[email protected]>
4839    
4840            * Thuban/Model/classification.py (Classification): Added getNull()
4841            to return the NullData reference
4842    
4843            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
4844            Layer.SetStrokeWidth): Modified these functions to change the
4845            null data in the classification rather than keep these values
4846            directly in the Layer class. Menu options to change these values
4847            work again.
4848    
4849    2003-01-28  Jonathan Coles  <[email protected]>
4850    
4851            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
4852            Fixed crashing problem on some systems. Dialog box shows
4853            classification data.
4854    
4855            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
4856            Colors in the tree view.
4857    
4858            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
4859            the tree info for classifications. Commented out unnecessary lines.
4860    
4861            * Thuban/Model/classification.py (Classification.TreeInfo): New
4862            function to add information about the classification into the
4863            tree view.
4864    
4865    2003-01-27  Jan-Oliver Wagner <[email protected]>
4866    
4867            * Thuban/__init__.py (_): New.
4868    
4869            * Thuban/Model/classification.py, Thuban/Model/extension.py,
4870            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
4871            Thuban/Model/session.py, Thuban/UI/application.py,
4872            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
4873            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
4874            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
4875            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
4876            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
4877    
4878    2003-01-27  Jonathan Coles  <[email protected]>
4879    
4880            * Thuban/Model/layer.py: Classification initialization calls.
4881    
4882            * Thuban/Model/classification.py: Created class to encapsulate
4883            a layer classification. Supports specific data points and
4884            ranges.
4885    
4886            * Thuban/Model/load.py: Added support for loading classification
4887            information.
4888    
4889            * Thuban/Model/save.py: Added support for saving classification
4890            information.
4891    
4892            * Thuban/UI/classifier.py: Initial class for a dialog box for
4893            specifying classification information.
4894    
4895            * Thuban/UI/mainwindows.py: Support for opening the classifier
4896            dialog.
4897    
4898            * Thuban/UI/renderer.py: Support for drawing a layer with the
4899            classification information.
4900    
4901            * Data/iceland_sample_class.thuban: iceland_sample with
4902            classification data.
4903    
4904            * test/test_classification: Tests for the Classification class.
4905    
4906    2002-12-09  Bernhard Herzog  <[email protected]>
4907    
4908            * test/test_command.py: New. Tests for the command classes.
4909    
4910            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
4911            (Command.IsTool): New method to distinguish between command
4912            switching tools and other commands.
4913    
4914            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
4915            the tool to avoid direct assignments to instance variables
4916            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
4917            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
4918            change the tool
4919    
4920            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
4921            active tool's command turns insensitive, disable the tool.
4922            (_tool_command): Use the new ToolCommand class
4923    
4924            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
4925            SelectTool method to change the tool
4926            (iconfile): Use the ToolCommand class
4927    
4928    2002-12-03  Bernhard Herzog  <[email protected]>
4929    
4930            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
4931            the case of selected items that are not children of Layers or Maps
4932            properly. Previously this bug would trigger an assertion in
4933            wxWindows.
4934    
4935    2002-11-06  Frank Koormann  <[email protected]>
4936    
4937            * Thuban/UI/mainwindow.py: Altered the order of tools in the
4938            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
4939            Full Extent).
4940    
4941    2002-10-23  Bernhard Herzog  <[email protected]>
4942    
4943            * setup.py (setup call): version now 0.1.3
4944    
4945            * MANIFEST.in: Add the files in test/
4946    
4947            * test/README: Add note about tests requiring the iceland data
4948    
4949            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
4950            copyright notice.
4951    
4952    2002-10-18  Bernhard Herzog  <[email protected]>
4953    
4954            * test/test_map.py
4955            (TestMapWithContents.test_projected_bounding_box): Use an explicit
4956            epsilon.
4957    
4958            * test/support.py (FloatComparisonMixin.assertFloatEqual)
4959            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
4960            message if the assertion fails and don't return the return value
4961            of self.assert_. In assertFloatSeqEqual the return meant that not
4962            all items of the sequence were compared.
4963    
4964    2002-09-20  Bernhard Herzog  <[email protected]>
4965    
4966            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
4967    
4968            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
4969    
4970            * test/test_map.py (TestMapWithContents.test_tree_info): Create
4971            the string with the bounding box on the fly because of platform
4972            differences in the way %g is handled.
4973    
4974            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
4975            DBFfile too because Thuban layers can't yet cope missing DBF
4976            files.
4977    
4978    2002-09-20  Bernhard Herzog  <[email protected]>
4979    
4980            * test/test_menu.py: Use initthuban instead of
4981            add_thuban_dir_to_path to initialize Thuban.
4982    
4983            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
4984            Mixin class for float comparisons
4985            (SubscriberMixin): New. Mixin class to test messages sent through
4986            the Connector class
4987    
4988            * test/README: Fix a typo and add the -v flag to the command for
4989            individual tests
4990    
4991            * test/test_session.py: New. Test cases for Thuban.Model.session
4992    
4993            * test/test_proj.py: New. Test cases for Thuban.Model.proj
4994    
4995            * test/test_map.py: New. Test cases for Thuban.Model.map
4996    
4997            * test/test_layer.py: New. Test cases for Thuban.Model.layer
4998    
4999            * test/test_label.py: New. Test cases for Thuban.Model.label
5000    
5001            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5002    
5003            * test/test_color.py: New. Test cases for Thuban.Model.color
5004    
5005            * test/test_base.py: New. Test cases for Thuban.Model.base
5006    
5007    2002-09-13  Bernhard Herzog  <[email protected]>
5008    
5009            * Thuban/Model/session.py (Session.forwarded_channels): Forward
5010            the CHANGED channel too.
5011    
5012            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5013            CHANGED channel too.
5014            (Map.__init__): Call the Modifiable constructor as well.
5015    
5016            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5017            event if the modified flag changes.
5018            (Modifiable.changed): Tweak the doc-string.
5019    
5020            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5021            (MainWindow.set_position_text): Put the code that puts the text
5022            with the mouse position into the status bar into the new method
5023            set_position_text so that it can overwritten in derived classes.
5024    
5025    2002-09-12  Bernhard Herzog  <[email protected]>
5026    
5027            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5028            message box on the main window.
5029    
5030    2002-09-11  Bernhard Herzog  <[email protected]>
5031    
5032            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5033            the 'E' because it's less likely to interfere with other menu
5034            entries.
5035            (MainWindow.build_menu): remove an incorrect comment.
5036    
5037    2002-09-10  Bernhard Herzog  <[email protected]>
5038    
5039            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5040            (_tool_command): Add sensitive parameter
5041            (_has_visible_map): Sensitivity callback to tools and other
5042            commands that require a visible map. Use it in map_zoom_in_tool,
5043            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5044            and map_full_extent
5045    
5046    2002-09-06  Bernhard Herzog  <[email protected]>
5047    
5048            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5049            VIEW_POSITION
5050    
5051    2002-09-04  Frank Koormann  <[email protected]>
5052    
5053            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5054    
5055    2002-09-02  Bernhard Herzog  <[email protected]>
5056    
5057            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5058            wxWindows already and our implementation doesn't work correctly
5059            with wxGTK 2.3:
5060            (MapCanvas.__init__): Remove the instance variable
5061            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5062            be drawin
5063            (MapCanvas.OnIdle): Removed.
5064    
5065            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5066            a parameter to determine the size of the rectangle.
5067            (MapCanvas.find_shape_at): Create the box around the point on a
5068            layer by layer basis and make the size depend on the shape type.
5069            This solves a problem with the selection of point shapes at the
5070            border of the layer's bounding box
5071    
5072    2002-08-30  Bernhard Herzog  <[email protected]>
5073    
5074            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5075            for the sensitivity  of remove layer.
5076            (_can_remove_layer): New. Sensitivity callback for remove layer
5077            (Command layer_remove): Use _can_remove_layer
5078    
5079            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5080            determine whether a given layer can be deleted.
5081    
5082            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5083            (MapCanvas.do_redraw): Get rid of the unused update_region
5084            instance variable
5085    
5086            * Thuban/UI/view.py: Add/update some doc-strings.
5087    
5088            * test/: new subdirectory with a bunch of unit tests.
5089    
5090            * test/README, test/test_table.py, test/test_save.py,
5091            test/test_menu.py, test/test_load.py: Initial set of tests and
5092            brief instructions on how to run them
5093    
5094    2002-08-29  Bernhard Herzog  <[email protected]>
5095    
5096            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5097            arcs with multiple parts.
5098    
5099            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5100            Handle degenrate rectangles.
5101    
5102            * Thuban/Model/table.py: Make writing records work correctly:
5103            (Table.__init__): Keep track of whether the DBF is open for
5104            writing
5105            (Table.write_record): Open the DBF file for writing when necessary
5106    
5107    2002-08-27  Bernhard Herzog  <[email protected]>
5108    
5109            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5110            dbf files only for reading by default. Use a new writable dbf
5111            object for writing.
5112    
5113    2002-08-26  Bernhard Herzog  <[email protected]>
5114    
5115            * Thuban/UI/mainwindow.py: Refactor the context creation:
5116            (MainWindow.Context): New method to return a context
5117            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5118            new method
5119    
5120            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5121            layer table specific code from TableGrid into LayerTableGrid
5122            (TableFrame, LayerTableFrame): Split the layer table specific code
5123            from TableFrame into LayerTableFrame
5124            (LayerTableGrid.select_shape): Remove a debug print
5125    
5126            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5127            LayerTableFrame
5128    
5129    2002-08-23  Bernhard Herzog  <[email protected]>
5130    
5131            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5132            absolute filename.
5133    
5134    2002-08-22  Bernhard Herzog  <[email protected]>
5135    
5136            * Thuban/Model/table.py (Table.write_record): New method to write
5137            records.
5138            (Table.__init__): Open the DBF file for writing too.
5139    
5140            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5141            into the underlying table.
5142    
5143            * extensions/shapelib/shapefil.h (DBFCommit),
5144            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5145            commit any changes made to the DBF file.
5146    
5147            * Thuban/UI/mainwindow.py (make_check_current_tool)
5148            (_tool_command): Put the code that generates the "checked"
5149            callback into a separate function so that we can reuse it
5150            elsewhere
5151    
5152            * Thuban/Model/save.py (Saver): New class to handle serializing a
5153            session into an XML file. The main reason to introduce a class is
5154            that applications built on Thuban can derive from it so that they
5155            can save additional information in a session file.
5156            (save_session): Delegate almost all the work to the Saver class.
5157            Rename the filename argument to file because it may be a file like
5158            object now.
5159    
5160            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5161            code. Remove the little test code which would be executed when the
5162            module is run as a script which didn't work anymore since it can't
5163            import the other Thuban modules.
5164            (ProcessSession, load_session): Refactor the ProcessSession to
5165            have one method for each element start and end tag so that derived
5166            classes can easily override the processing of individual tags.
5167            Also, always parse with namespaces enabled because applications
5168            built on top of Thuban will likely use namespaces if they extend
5169            the session file format.
5170    
5171    2002-08-21  Bernhard Herzog  <[email protected]>
5172    
5173            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5174            because thubaninit_contents will do it for us.
5175    
5176    2002-08-16  Jan-Oliver Wagner <[email protected]>
5177    
5178            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5179            tree window already open
5180    
5181    2002-08-15  Bernhard Herzog  <[email protected]>
5182    
5183            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5184            with self.
5185    
5186            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5187            when we have actually captured it.
5188    
5189            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5190            shapefile and destroy the table.
5191    
5192            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5193    
5194    2002-08-14  Bernhard Herzog  <[email protected]>
5195    
5196            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5197            instance variable columns
5198            (RecordTable.GetTypeName): row and col may be negative in some
5199            cases.
5200    
5201            * setup.py (InstallLocal.initialize_options)
5202            (InstallLocal.finalize_options, InstallLocal.user_options): New
5203            option create-init-file to build a thubaninit.py when running
5204            install_local
5205            (InstallLocal.run): Create the thubaninit.py module when requested
5206            (thubaninit_contents): Split the template into several parts and
5207            create a new function thubaninit_contents that creates the
5208            contents of a thubaninit module.
5209            (ThubanInstall.run): Use the new function to create the thubaninit
5210            module.
5211    
5212    2002-07-30  Bernhard Herzog  <[email protected]>
5213    
5214            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
5215            cleanup.
5216            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
5217    
5218            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
5219            direct base class' Destroy method.
5220    
5221            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
5222            layers.
5223            (Map.Destroy): Destroy the label_layer as well and call the
5224            inherited Desatroymethod first so that no more messages are
5225            issued.
5226            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
5227            message if the stacking order actually has changed. Add
5228            doc-strings.
5229            (Map.BoundingBox): Correct the doc-string.
5230            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
5231            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
5232    
5233            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
5234            all labels.
5235    
5236    2002-07-29  Bernhard Herzog  <[email protected]>
5237    
5238            * Thuban/Model/map.py (Map.subscribe_layer_channels)
5239            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
5240            to a layer's channels into separate methods.
5241            (Map.RemoveLayer, Map.AddLayer): Call the new methods
5242            (Map.Destroy): Unsubscribe from a layer's channels before
5243            destroying it.
5244    
5245            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
5246            selected_layer parameter to searched_layer which is the layer to
5247            search in.
5248            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
5249            search to that layer. Return the selected layer and shape.
5250    
5251            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
5252            typo
5253    
5254    2002-07-24  Bernhard Herzog  <[email protected]>
5255    
5256            * Thuban/UI/application.py (ThubanApplication.create_session):
5257            Extend the doc string.
5258            (ThubanApplication.subscribe_session)
5259            (ThubanApplication.unsubscribe_session): New methods to
5260            subscribe/unsubscribe to/from session channels.
5261            (ThubanApplication.SetSession): Call the new methods here.
5262            (ThubanApplication.maps_changed, ThubanApplication.set_map):
5263            Renamed set_map to maps_changed. Its now a subscriber for
5264            MAPS_CHANGED.
5265    
5266            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
5267            x-coordinate in case of simple clicks
5268    
5269            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
5270            don't pass it as a parameter
5271    
5272            * Thuban/Model/session.py (Session.RemoveMap): New
5273    
5274            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5275            window size into a parameter.
5276    
5277    2002-07-23  Bernhard Herzog  <[email protected]>
5278    
5279            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5280            just commands.
5281    
5282            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
5283            parameter list a bit to allow setting the window title and the
5284            initial message in the status bar. Update the callers.
5285    
5286            * Thuban/UI/application.py (ThubanApplication.OnInit)
5287            (ThubanApplication.CreateMainWindow): Put the mainwindow
5288            instantiation into a separate method so that it can be overridden
5289            by a subclass.
5290    
5291    2002-07-19  Bernhard Herzog  <[email protected]>
5292    
5293            * Thuban/Model/session.py: Issue a CHANGED message every time
5294            another changed message is issued to make it easier to get
5295            notified of changes.
5296            (Session): Update the doc string
5297            (Session.forward): Issue changed-events as CHANGED as well.
5298            (Session.changed): Overwrite the inherited version to issue
5299            CHANGED events as well.
5300    
5301            * Thuban/UI/tree.py: We can now simply subscribe to the session's
5302            CHANGED channel to be informed of changes.
5303            (SessionTreeCtrl.session_channels): Not needed any longer.
5304            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5305            Only have to (un)subscribe CHANGED
5306    
5307            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5308    
5309            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
5310            for the wxPython locale bug to __init__.py so that it's
5311            automatically executed by anybody using UI code from Thuban.
5312    
5313    2002-07-18  Bernhard Herzog  <[email protected]>
5314    
5315            * Thuban/UI/main.py (main): app no longer needs to be global
5316    
5317            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
5318            as parameter and store it in an instance variable
5319            (MainWindow.invoke_command, MainWindow.update_command_ui)
5320            (MainWindow.save_modified_session, MainWindow.NewSession)
5321            (MainWindow.OpenSession, MainWindow.SaveSession)
5322            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
5323            application object.
5324    
5325            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
5326            the main window with self.
5327    
5328            * Thuban/UI/context.py: New module with the context class
5329    
5330            * Thuban/UI/command.py (Command): Update doc string.
5331    
5332            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
5333            MainWindow.update_command_ui): Pass an instance of the context
5334            class to the command's methods
5335            (check_current_tool, call_method): Handle the new context
5336            implementation
5337    
5338            * Examples/simple_extensions/simple_tool.py (simple_tool,
5339            check_simple_tool): Handle the new context implementation
5340    
5341            * Examples/simple_extensions/simple_command.py (simple_command):
5342            Handle the new context implementation. Update the comments about
5343            the context.
5344    
5345            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
5346            doc-string
5347            (ThubanApplication.Session): New method to return the session
5348            object
5349    
5350            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
5351            interactor's selected_layer may not be a layer of the current
5352            session when the tree is updated while a new session is being set.
5353    
5354    2002-07-17  Bernhard Herzog  <[email protected]>
5355    
5356            * Thuban/UI/tree.py (color_string): Removed. No longer used.
5357            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
5358            update_tree into update_tree and add_items. The tree now uses a
5359            more generic way to display the contents of the tree.
5360            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
5361    
5362            * Thuban/Model/layer.py (Layer.TreeInfo),
5363            Thuban/Model/extension.py (Extension.TreeInfo),
5364            Thuban/Model/map.py (Map.TreeInfo),
5365            Thuban/Model/session.py (Session.TreeInfo):
5366            Add TreeInfo methods to implement the new tree view update scheme
5367    
5368    2002-07-16  Bernhard Herzog  <[email protected]>
5369    
5370            * Thuban/UI/application.py: Don't use "import from" for the
5371            MainWindow. It can't always be resolved.
5372            (ThubanApplication.OnInit): change reference to MainWindow
5373            accordingly.
5374    
5375            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
5376            completely
5377    
5378    2002-07-10  Bernhard Herzog  <[email protected]>
5379    
5380            * setup.py (create_init_module): New configurable variable whose
5381            default depends on the platform we're running on.
5382            (ThubanInstall.initialize_options): Initialize
5383            self.create_init_module from the global create_init_module
5384            (ThubanInstall.user_options): indictate that the options
5385            create-init-module and init-module-dir have arguments.
5386    
5387            * setup.py: In the setup call change the version number to include
5388            cvs.
5389    
5390            * MANIFEST.in: Add the files in Examples
5391    
5392    2002-07-09  Bernhard Herzog  <[email protected]>
5393    
5394            * setup.py: In the setup call, use the thuban homepage as the
5395            value of the url parameter.
5396    
5397            * Examples: New subdirectory for examples.
5398    
5399            * Examples/simple_extensions/simple_tool.xpm,
5400            Examples/simple_extensions/simple_tool.py,
5401            Examples/simple_extensions/simple_command.py,
5402            Examples/simple_extensions/README: Simple examples showing how to
5403            add new commands and tools.
5404    
5405            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
5406            bdist_rpm that we also have an install script.
5407            (bdist_inno): Add 2002 to the copyright notice.
5408    
5409            * setup.py: Create a file in python's site-packages directory to
5410            make installation of Thuban as a library easier.
5411            (ThubanInstall.user_options): Add two new options,
5412            create-init-module and init-module-dir
5413            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
5414            filenames for installation in the default directories.
5415            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
5416            the inherited methods to capture some filenames before they're
5417            transformed too much by distutils.
5418            (ThubanInstall.run): Create the init module if requested.
5419            (ThubanInstall.thuban_init_filename): New method to return the
5420            full name of the init module.
5421            (ThubanInstall.get_outputs): Append the filename of the init
5422            module.
5423    
5424    2002-07-08  Bernhard Herzog  <[email protected]>
5425    
5426            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
5427            handle the prefix properly which means that the default for the
5428            installation prefix should be /usr for RPMs and /usr/local when
5429            doing a normal source install.
5430            (bdist_rpm_install_script): Script to override the default install
5431            commands in the specfile generated by the bdist_rpm command.
5432            (thuban_bdist_rpm.user_options): Add a prefix option
5433            (thuban_bdist_rpm.initialize_options): Init the prefix option.
5434            Create the script files for the spec files as empty files here
5435            (thuban_bdist_rpm._make_spec_file): Override the inherited method
5436            to fill the script files with content.
5437    
5438            * Thuban/Model/save.py (relative_filename): Wrapper around
5439            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
5440            argument. save_session now automatically uses this version,
5441            solving a problem when saving to a relative filename.
5442    
5443            * setup.py: In the setup call, make sure that the library
5444            directories are under $prefix/lib not directly under $prefix.
5445    
5446    2002-06-20  Jan-Oliver Wagner <[email protected]>
5447    
5448            * Thuban/Model/extension.py: new module to handle extension objects.
5449            * Thuban/Model/messages.py: new messages for extensions.
5450            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
5451            Session.AddExtension): new for handling extensions.
5452            Also some other minor changes to round up extension handling.
5453            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
5454            of Extension titles and title and names of its objects.
5455    
5456    2002-05-29  Bernhard Herzog  <[email protected]>
5457    
5458            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
5459            the events for a command.
5460            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
5461            Call bind_command_events to bind the events. add_toolbar_command
5462            can now bind events too so that it's possible to have commands
5463            that are only available through the toolbar.
5464            (MainWindow.init_ids): New instance variable events_bound to keep
5465            track of for which commands events have been bound.
5466    
5467    2002-05-28  Bernhard Herzog  <[email protected]>
5468    
5469            * Thuban/UI/menu.py: New module to build and manage menus.
5470    
5471            * Thuban/UI/mainwindow.py: Remove some unused imports.
5472            (MainWindow.__init__, main_menu): move the definition of the main
5473            menu from __init__ to the Menu instance main_menu.
5474            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
5475            build the menu bar and sub-menus from a menu description.
5476    
5477            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
5478            startup file
5479            (ThubanApplication.read_startup_files): New method to run
5480            ~/.thuban/thubanstart.py
5481    
5482            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
5483            Move the toolbar definition to the Menu instance main_toolbar.
5484            (MainWindow.build_toolbar): New method to build the toolbar
5485            similar to the build_menu methods
5486    
5487  2002-05-23  Bernhard Herzog  <[email protected]>  2002-05-23  Bernhard Herzog  <[email protected]>
5488    
5489            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
5490            layer_outline_color. Fix it in the definition of the command too.
5491    
5492          * Thuban/UI/command.py (Command): Fix typo in doc string          * Thuban/UI/command.py (Command): Fix typo in doc string
5493    
5494  2002-05-22  Bernhard Herzog  <[email protected]>  2002-05-22  Bernhard Herzog  <[email protected]>
# Line 183  Line 5672 
5672          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
5673          position in the statusbar          position in the statusbar
5674    
5675  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
5676    
5677          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
5678    
5679  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
5680            
5681          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
5682    
5683          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
5684    
5685          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
5686    
5687  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
5688            box
5689    
5690    2002-04-21  Jan-Oliver Wagner <[email protected]>
5691    
5692          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
5693    
5694          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
5695    
5696          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
5697          icon; added map_full_extend as tool          icon; added map_full_extend as tool
5698    
5699  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
5700    
5701          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
5702          saving _new_ sessions          saving _new_ sessions
# Line 308  Line 5798 
5798    
5799          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
5800          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
5801    
5802  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
5803    
5804          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5805          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
5806    
5807          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5808          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
5809          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
5810          too.          too.
# Line 425  Line 5914 
5914          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
5915          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
5916    
5917          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5918          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
5919          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
5920          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
5921          the application's OnInit method          the application's OnInit method
# Line 442  Line 5931 
5931          layer to the tableview dialog.          layer to the tableview dialog.
5932    
5933          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
5934          (TableGrid):          (TableGrid):
5935          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
5936          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
5937          (TableFrame.__init__):          (TableFrame.__init__):
# Line 509  Line 5998 
5998  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
5999    
6000          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6001            
6002          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6003          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
6004            
6005          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6006          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
6007          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 559  Line 6048 
6048          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
6049          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
6050          link_file method          link_file method
6051            
6052          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6053          the window when the first layer is added to the map.          the window when the first layer is added to the map.
6054    
# Line 596  Line 6085 
6085          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
6086          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6087          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
6088            
6089          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
6090          installer          installer
6091    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26