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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1500 - (hide annotations)
Tue Jul 29 13:29:46 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 236327 byte(s)
update ChangeLog

1 bh 1500 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 frank 1497 2003-07-29 Frank Koormann <[email protected]>
8    
9     * Doc/manual/thuban-manual.xml: gaspell-checked.
10    
11 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
12    
13 jonathan 1495 * 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 jonathan 1493 * 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 bh 1483 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 frank 1479 2003-07-24 Frank Koormann <[email protected]>
64    
65     * Doc/manual/thuban-manual.xml: Added section on table management.
66    
67 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
68    
69     * test/runtests.py (main): Recognize the long "verbose" option
70     correctly.
71    
72 jonathan 1470 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 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
113    
114 bh 1465 * 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 bh 1463 * 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 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
159    
160     2003-07-18 Bernhard Herzog <[email protected]>
161    
162 bh 1459 * 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 bh 1457 * 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 bh 1455 * 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 bh 1453 * 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 bh 1451 * 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 jonathan 1449 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 jonathan 1442 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 jan 1424 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 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
342    
343 bh 1422 * 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 bh 1420 * 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 bh 1418 * 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 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
376    
377     * test/test_view.py: New. Tests for ViewPort.
378    
379 frank 1409 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 frank 1411 * 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 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
389    
390 jonathan 1406 * 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 jonathan 1403 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 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
478    
479 bh 1382 * 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 bh 1380 * 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 bh 1378 * 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 bh 1376 * 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 bh 1372 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 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
555    
556 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
557    
558     2003-07-03 Bernhard Herzog <[email protected]>
559    
560 bh 1368 * 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 bh 1365 * 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 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
581 jonathan 1349
582 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
583     generate_uniform_distribution, generate_quantiles,
584 jonathan 1363 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 jonathan 1360 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 jonathan 1358 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 jonathan 1349 * 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 frank 1334 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 bh 1329 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 frank 1334
757 bh 1329 * 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 frank 1325 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 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
768    
769 jonathan 1349 * 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 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
779     were too high.
780    
781     2003-06-30 Jonathan Coles <[email protected]>
782    
783 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
784    
785     * MANIFEST.in: Added Projections so that default.proj is
786     included.
787    
788 jonathan 1312 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 jonathan 1304 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 jonathan 1299 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 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
845 jonathan 1297
846     * setup.py: Add Resources/XML to resource list.
847    
848     2003-06-23 Jonathan Coles <[email protected]>
849 jonathan 1286
850 jonathan 1297 * setup.cfg: Fix copyright dates
851    
852     2003-06-23 Jonathan Coles <[email protected]>
853    
854 jonathan 1294 * 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 jonathan 1289 * 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 jonathan 1286 * 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 bh 1283 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 bh 1281 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 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
912    
913 jonathan 1279 * 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 jonathan 1272 * 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 bh 1270 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 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
1025    
1026 jonathan 1267 * 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 jonathan 1265 * 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 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
1050    
1051 bh 1260 * 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 bh 1258 * 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 bh 1256 * 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 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
1083    
1084 jonathan 1265 This is mainly about fixing RTbug #1949.
1085    
1086 jonathan 1254 * 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 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
1106    
1107 bh 1248 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 bh 1246 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 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
1156     the classification element.
1157     (projection): Add the "name" attribute
1158    
1159 frank 1242 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 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
1179    
1180 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
1181    
1182     2003-06-18 Jonathan Coles <[email protected]>
1183    
1184 jonathan 1235 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 jonathan 1237 * 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 jonathan 1224 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 bh 1220 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 jonathan 1212 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 bh 1208 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 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
1338    
1339 jonathan 1203 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 jonathan 1201 * 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 bh 1195 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 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
1409 jonathan 1175
1410 jonathan 1193 * 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 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
1416 jonathan 1193 user directory if it doesn't exist on a posix system.
1417     Fixes RTbug #1815.
1418 jonathan 1191
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 jonathan 1182 * 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 jonathan 1178 * 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 jonathan 1175 * 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 jonathan 1172
1459     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
1460     that was in load.py
1461 jonathan 1169
1462 jonathan 1172 * 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 jonathan 1169 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 jonathan 1172 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 jonathan 1169 * 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 jan 1156 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 frank 1151 2003-06-11 Frank Koormann <[email protected]>
1553    
1554 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1555     update.
1556    
1557     2003-06-11 Frank Koormann <[email protected]>
1558    
1559 frank 1151 * 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 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
1569    
1570 bh 1147 * 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 bh 1145 * 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 bh 1143 * 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 jan 1141 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 frank 1134 2003-06-05 Frank Koormann <[email protected]>
1631    
1632 frank 1139 * 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 frank 1137 * 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 frank 1134 * 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 bh 1130 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 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
1683    
1684     * Thuban/Model/classgen.py (GenQuantiles0): New function.
1685    
1686 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
1687    
1688 bh 1127 * 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 bh 1120 * 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 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
1721    
1722 bh 1118 * 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 bh 1116 * 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 bh 1114 * 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 bh 1112 * 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 jonathan 1109 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 jan 1097 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 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
1819    
1820 bh 1095 * 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 bh 1093 * 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 bh 1089 * 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 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
1842 jan 1085
1843 jan 1087 * 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 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1849     sort the selection list for the dialog.
1850    
1851 frank 1083 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 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
1859    
1860 bh 1081 * 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 bh 1079 * 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 frank 1077 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 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
1877    
1878 bh 1075 * 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 bh 1073 * 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 bh 1071 * 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 bh 1069 * 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 frank 1065 2003-05-27 Frank Koormann <[email protected]>
1941    
1942 frank 1067 * 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 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1948    
1949     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1950    
1951 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
1952    
1953 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
1954     Menu.RemoveItem().
1955 jan 1062
1956 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1957     the menu.
1958 jan 1062
1959 frank 1059 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 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
1979    
1980 bh 1055 * 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 bh 1053 * 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 frank 1051 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 jan 1048 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 frank 1046 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 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
2023    
2024 bh 1044 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 bh 1038 * 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 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
2057     New. test case for OpenTableFile
2058    
2059 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
2060    
2061 jan 1035 * 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 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2069     already a selection present, update the grid accordingly.
2070 jan 1033
2071     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2072     resizeable and increase its initial size.
2073    
2074 frank 1030 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 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
2097    
2098 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2099     Use QueryTableFrame instead of TableFrame.
2100 jan 1021
2101 jan 1024 * 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 jan 1021 * 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 bh 1017 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 jan 1015 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 frank 1011 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 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
2153    
2154 bh 1008 * 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 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2161     the wxMessageDialog's Destroy() method.
2162    
2163 frank 1004 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 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
2182    
2183 bh 999 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 bh 997 * 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 bh 995 * 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 tkoester 993 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 frank 992 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 bh 988 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 tkoester 986 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 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
2264    
2265 bh 985 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 bh 983 * 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 frank 981 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 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
2354 jonathan 971
2355 jonathan 975 * 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 jonathan 971 * 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 bh 958 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 jan 955 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 frank 952 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 jonathan 949 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 frank 924 2003-05-19 Frank Koormann <[email protected]>
2544    
2545 frank 927 * 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 frank 924 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 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
2561    
2562 bh 921 * 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 bh 919 * 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 frank 917 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 bh 908 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 jonathan 906 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 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
2640    
2641 jonathan 899 * 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 jonathan 897 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 frank 893 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 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
2669    
2670 jonathan 897 * 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 jonathan 889 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 frank 872 2003-05-09 Frank Koormann <[email protected]>
2764    
2765     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2766    
2767 frank 860 2003-05-08 Frank Koormann <[email protected]>
2768    
2769 frank 870 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 frank 867 * Thuban/UI/scalebar.py
2778     (ScaleBar.DrawScalebar): Format string bug fixed.
2779    
2780     2003-05-08 Frank Koormann <[email protected]>
2781    
2782 frank 865 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 frank 860 * 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 frank 857 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 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
2820    
2821 bh 852 * 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 bh 850 * 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 frank 848 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 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
2856    
2857 bh 846 * 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 bh 843 * 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 bh 840 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 jonathan 833 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 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
2980    
2981     * Resources/Projections/defaults.proj: Fix spelling of Mercator
2982    
2983 jonathan 823 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 bh 819 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 jonathan 817 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 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
3082    
3083 bh 811 * 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 bh 809 * 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 jan 807 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 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
3112    
3113 jonathan 803 * 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 jonathan 793 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 jan 792 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 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
3170    
3171 bh 790 * Thuban/UI/view.py: Fix some typos.
3172    
3173 bh 788 * 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 bh 786 * 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 jonathan 793 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 bh 779 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3211    
3212 jonathan 769 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 jonathan 776 "true". Addresses RTbug #1025.
3215 jonathan 769
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 jonathan 767 * 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 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
3243    
3244 bh 766 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 bh 764 * 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3296 jonathan 735
3297 jonathan 762 * 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 jonathan 756 * 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 jonathan 753 * 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 jonathan 748 * 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 jonathan 743 * 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 jonathan 735 * 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 bh 734 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 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
3419 jonathan 724
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 bh 723 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 jonathan 721 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 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
3529    
3530 jonathan 720 * 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 jonathan 716 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 jonathan 715 * 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 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
3608    
3609 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
3610     constants
3611    
3612 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3613     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
3614    
3615 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
3616    
3617 bh 701 * 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 bh 700 * 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 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
3629    
3630 jonathan 693 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 jonathan 688 * 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 bh 687 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 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
3692    
3693 jonathan 680 * 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 jonathan 673 * 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 jonathan 674 drawing initialization call to draw_polygon_init()
3719     (MapRenderer.draw_polygon_shape): Use new signature of
3720     draw_polygon_shape.
3721 jonathan 673
3722 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
3723     weirdness by setting the range to (1, maxint).
3724 jonathan 673
3725 jonathan 674 * 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 jonathan 673
3731 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
3732    
3733 bh 672 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 jonathan 669 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 frank 664 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 jonathan 662 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 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
3797    
3798 jonathan 662 * 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 jonathan 647 * 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 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
3837 jonathan 647 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 jonathan 646
3846 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
3847    
3848 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
3849     Should pass group to ClassGroup constructor.
3850    
3851     2003-04-10 Jonathan Coles <[email protected]>
3852    
3853 jonathan 636 * 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 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
3881    
3882 jonathan 634 * 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 jonathan 626 * 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 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
3929    
3930 bh 625 * 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 bh 623 * 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 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
3956    
3957 jonathan 619 * 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 jonathan 612 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 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
4009 jonathan 608
4010 jonathan 612 * 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 jonathan 608 * 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 jonathan 603
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 jonathan 601
4036 jonathan 603 * 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 jonathan 601
4072 bh 600 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 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
4097    
4098 bh 595 * 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 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4103     sure the filename is absolute to avoid problems when saving the
4104     session again
4105    
4106 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4107    
4108 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
4109    
4110 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4111 jonathan 587 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 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
4116    
4117     * test/test_map.py: Don't use from <module> import *
4118    
4119 jonathan 581 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 jonathan 575 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 jonathan 569 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 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
4177    
4178 jonathan 567 * 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 jonathan 557 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 jonathan 554 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 jonathan 552 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 jonathan 541 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 bh 538 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 jonathan 527 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 jan 523 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 jonathan 514 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 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
4437    
4438 jonathan 505 * 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 jonathan 499 * 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 jonathan 497 * 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 jonathan 495 * 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 jonathan 490 * 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 jonathan 483 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 jonathan 478 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 bh 477 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 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
4549    
4550 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
4551 jonathan 471
4552 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
4553 jonathan 471
4554 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
4555 jonathan 471
4556 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
4557 jonathan 471
4558     2003-03-05 Jonathan Coles <[email protected]>
4559    
4560 jonathan 459 * 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 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
4599    
4600 bh 458 * 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 bh 456 * 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 jonathan 448 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 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
4640 jonathan 434
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 jonathan 445 functions. Fix to create a tuple with a single value instead of
4663     simply returning the value.
4664 jonathan 434
4665     * Thuban/UI/renderer.py: Use new Classification and Group functions.
4666     Use common.py functions.
4667    
4668 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
4669 jonathan 447
4670     * test/test_classification.py: Use new Classification and Group
4671     classes.
4672 jonathan 434
4673 jonathan 426 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 bh 425 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 frank 423 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 jonathan 408 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 bh 405 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 bh 402 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 jonathan 399 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 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
4802    
4803 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4804 jonathan 396 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 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4817 jonathan 396 SetDefault*() methods on the layer's classification object.
4818 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
4819 jonathan 396 Classification class.
4820    
4821     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4822     object instead of a dictionary.
4823    
4824 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
4825 jonathan 396 draw the classifications in the dialog box's table.
4826     (Classifier): Modified to use the ClassRenderer class.
4827    
4828 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
4829     methods of the Classification class.
4830 jonathan 396
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 jonathan 387 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 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
4850    
4851 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
4852 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
4853 jonathan 380 classification data.
4854    
4855 jonathan 384 * 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 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
4866 jan 375
4867 tkoester 403 * Thuban/__init__.py (_): New.
4868 jan 375
4869     * Thuban/Model/classification.py, Thuban/Model/extension.py,
4870     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
4871 tkoester 403 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 jan 375
4878 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
4879    
4880 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
4881 jonathan 370
4882 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
4883     a layer classification. Supports specific data points and
4884     ranges.
4885 jonathan 370
4886 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
4887     information.
4888 jonathan 370
4889 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
4890     information.
4891 jonathan 370
4892 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
4893     specifying classification information.
4894 jonathan 370
4895 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
4896     dialog.
4897 jonathan 370
4898 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
4899     classification information.
4900 jonathan 370
4901 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
4902     classification data.
4903 jonathan 370
4904 tkoester 403 * test/test_classification: Tests for the Classification class.
4905 jonathan 370
4906 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
4907    
4908 bh 361 * test/test_command.py: New. Tests for the command classes.
4909    
4910 bh 359 * 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 bh 354 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 frank 352 2002-11-06 Frank Koormann <[email protected]>
4936    
4937 bh 354 * 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 tkoester 403
4941 bh 349 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 bh 344 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 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
4965    
4966 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
4967    
4968     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
4969    
4970 bh 338 * 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 bh 326 * 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 bh 335 * 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 bh 322 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 bh 317 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 bh 313 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 bh 315 (MainWindow.build_menu): remove an incorrect comment.
5036 bh 313
5037 bh 311 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 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
5047    
5048     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5049     VIEW_POSITION
5050    
5051 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
5052 frank 306
5053     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5054    
5055 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
5056    
5057 bh 304 * 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 bh 302 * 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 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
5073    
5074 bh 300 * 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 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5083     (MapCanvas.do_redraw): Get rid of the unused update_region
5084     instance variable
5085    
5086 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
5087    
5088 bh 292 * 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 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
5095    
5096 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5097     arcs with multiple parts.
5098    
5099 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5100     Handle degenrate rectangles.
5101    
5102 bh 287 * 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 bh 285 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 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
5114    
5115 bh 282 * 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 bh 278 * 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 bh 280 (LayerTableGrid.select_shape): Remove a debug print
5125 bh 278
5126     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5127     LayerTableFrame
5128    
5129 bh 277 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 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
5135    
5136 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
5137     records.
5138 tkoester 403 (Table.__init__): Open the DBF file for writing too.
5139 bh 275
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 bh 271 * 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 bh 269 * 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 bh 266 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 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
5177 jan 265
5178     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5179     tree window already open
5180    
5181 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
5182    
5183 bh 263 * 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 bh 259 * 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 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
5195    
5196 bh 256 * 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 bh 254 * 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 bh 252 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 bh 247 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 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
5255    
5256 bh 243 * 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 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5275     window size into a parameter.
5276    
5277 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
5278    
5279 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5280     just commands.
5281    
5282 bh 235 * 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 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
5292    
5293 bh 234 * 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 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5305 bh 234 Only have to (un)subscribe CHANGED
5306    
5307     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5308    
5309 bh 230 * 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 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
5314    
5315 bh 228 * 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 bh 225 * 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 bh 217 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 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
5366 bh 217 Add TreeInfo methods to implement the new tree view update scheme
5367    
5368 bh 216 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 bh 213 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 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
5393    
5394 bh 210 * setup.py: In the setup call, use the thuban homepage as the
5395     value of the url parameter.
5396    
5397 bh 208 * 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 bh 207 * 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 bh 205 * 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 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
5425    
5426 bh 205 * 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 bh 202 * 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 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
5447 jan 199
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 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
5457    
5458     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
5459 bh 202 the events for a command.
5460 bh 194 (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 bh 190 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 bh 192 * 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 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
5488    
5489 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
5490     layer_outline_color. Fix it in the definition of the command too.
5491    
5492 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
5493    
5494 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
5495    
5496     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
5497     in the docstring
5498    
5499 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
5500    
5501 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
5502     when the shapefile is empty.
5503     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
5504     now return None for empty shapefiles. Update doc-strings.
5505    
5506     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
5507     the layer's bbox being None.
5508    
5509     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
5510     layer's bbox being None.
5511    
5512 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
5513     necessary.
5514     (MapCanvas.__init__): New instance variables, last_selected_layer
5515     and last_selected_shape to determine how the selection has
5516     changed.
5517    
5518     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
5519     AutoSizeColumns because it will cause a traversal of the entire
5520     table which for large .dbf files will take a very long time.
5521    
5522 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
5523    
5524     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
5525     maximum depth for the tree than shapelib does by default.
5526    
5527 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
5528    
5529     * setup.py (py_modules): The shptree modules doesn't have a
5530     wrapper, so don't include it in the py_modules
5531    
5532 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
5533    
5534     * extensions/shapelib/shptree.c (compare_ints): Make arguments
5535     const void * as in the qsort prototype
5536     (SHPTreeFindLikelyShapes): Remove some unused variables.
5537    
5538     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
5539     maintains to redraw the window during a drag.
5540     (MapCanvas.unprojected_rect_around_point): New method to determine
5541     a small region around a point for hit-testing.
5542     (MapCanvas.find_shape_at): Only test the shapes in a small region
5543     around the point.
5544    
5545     * setup.py: Increment the version to 0.1.2
5546    
5547     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
5548     debug print and set session to None after unsubscribing
5549    
5550 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
5551    
5552 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
5553     the file to have a .thuban extension.
5554    
5555 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
5556     all the session channels to subscribe to to update the tree
5557     (SessionTreeCtrl.session_changed): Remember the session so that we
5558     can unsubscribe properly. Use the new class constant to
5559     unsubscribe from the old session and subscribe to the new one.
5560     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
5561     subscriptions of the SessionTreeCtrl.
5562     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
5563    
5564     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
5565     Session Tree" command to the file menu.
5566    
5567     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
5568     as update_region to the renderer.
5569    
5570     * Thuban/UI/renderer.py
5571     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
5572     update box is now directly a tuple, not a wxRect anymore.
5573    
5574     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
5575     prints.
5576    
5577     2002-05-07 Bernhard Herzog <[email protected]>
5578    
5579 bh 146 * setup.py: Add the shptree extension module. See
5580     extensions/pyshapelib/ChangeLog for more details.
5581    
5582     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
5583     extensions/shapelib/dbfopen.c: Really update to the versions of
5584     shapelib 1.2.9. For some reason it wasn't really done on
5585     2002-04-11.
5586    
5587     * extensions/shapelib/shptree.c: Modified version of shptree.c of
5588     shapelib 1.2.9. The only real difference is the use of qsort
5589     instead of a bubble sort implementation
5590    
5591     * Thuban/Model/layer.py (Layer.__init__): New instance variable
5592     shapetree to hold the shapelib quadtree for the shapefile
5593     (Layer.open_shapefile): Create the quad tree.
5594     (Layer.ShapesInRegion): New method to return the ids of shapes in
5595     a given region using the quad tree.
5596    
5597     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
5598     comment
5599     (draw_polygon_shape): Accept both arcs and polygons.
5600     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
5601     the api.
5602    
5603     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
5604     return the shape ids to be rendered in a given layer.
5605     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
5606     ids. Use draw_polygon_shape to draw arc shapes as well.
5607     (ScreenRenderer.RenderMap): New parameter for the rectangle that
5608     has to be updated
5609     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
5610     calling it's ShapesInRegion method.
5611    
5612     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5613     update_region for the update region.
5614     (MapCanvas.OnPaint): Maintain the update region
5615     (MapCanvas.do_redraw): Pass the bounding box of the update_region
5616     to the renderer when drawing the bitmap. Reset the update_region.
5617    
5618 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
5619    
5620 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
5621     MainWindow.OpenSession): Change the file extension of the session
5622     files to .thuban
5623    
5624 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
5625     Move the map channels to be forwarded by the session into the
5626 bh 146 class constant with forwarded_channels. Also add
5627     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
5628     forwarded_channels
5629 bh 129
5630     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
5631     typo and some rewording).
5632    
5633 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
5634    
5635     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
5636     around to speed up most redraws:
5637     (MapCanvas.__init__): New instance variable bitmap which holds the
5638     bitmap
5639     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
5640     self.bitmap to draw.
5641     (MapCanvas.full_redraw): New method to force a full redraw
5642     including the bitmap
5643     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
5644     make sure the bitmap is redrawn.
5645     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
5646     MapCanvas.shape_selected): Call full_redraw instead of readraw to
5647     make sure the bitmap is redrawn.
5648     (MapCanvas.OnSize): New method to handle size events so that the
5649     bitmap can be redrawn.
5650    
5651 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
5652    
5653     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
5654     canvas' VIEW_POSITION event
5655     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
5656     Update the text in the status-bar accordingly.
5657    
5658     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
5659     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
5660     called.
5661     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
5662     current_position
5663     (MapCanvas.set_current_position): New method to set
5664     current_position. Issue a VIEW_POSITION event
5665     (MapCanvas.CurrentPosition): New public method to return the value
5666     of current_position. Should be called when the VIEW_POSITION event
5667     is processed.
5668     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
5669     Update the position.
5670     (MapCanvas.OnLeaveWindow): Set the position to None.
5671    
5672     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
5673     position in the statusbar
5674    
5675 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
5676 frank 120
5677     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
5678    
5679 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
5680    
5681 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
5682    
5683     * Resources/Bitmaps/fullextent.xpm: new
5684 jan 116
5685 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
5686 jan 116
5687 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
5688     box
5689 jan 114
5690 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
5691    
5692 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
5693    
5694     * Thuban/UI/tree.py (update_tree): added added map extent
5695    
5696     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
5697 tkoester 403 icon; added map_full_extend as tool
5698 jan 114
5699 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
5700 jan 107
5701     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
5702     saving _new_ sessions
5703    
5704     * Thuban/Model/session.py (create_empty_session): new session
5705     don't have a filename (set to None)
5706    
5707     * Thuban/UI/tree.py (update_tree): added filename and modified flag
5708    
5709     * Thuban/Model/load.py (ProcessSession): convert projection
5710     parameters from unicode to regular string
5711    
5712     * Data/iceland_sample.session: Added UTM Zone 26 projection.
5713    
5714 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
5715    
5716     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
5717     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
5718     1.2.9
5719    
5720     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
5721     the pyshapelib directoy into the list of include dirs, so that
5722     pyshapelib_api.h can be found.
5723    
5724     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
5725     holds the pyshapelib C-API
5726     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
5727     pyshapelib_api to access the shapelib functions.
5728     (initwxproj): Import the c_api from the shapelib module and
5729     initialize pyshapelib_api.
5730    
5731 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
5732    
5733 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
5734     initialize_options to create the scripts for the rpm.
5735    
5736 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
5737    
5738 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
5739    
5740 bh 87 * setup.py: Increment version to 0.1.1
5741    
5742 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
5743     Layer" and "Remove Layer" commands from the layer menu to the map
5744     menu
5745    
5746 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
5747    
5748     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
5749     argument (python <= 1.5.2 erroneously accepted multiuple
5750     arguments)
5751    
5752 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
5753    
5754     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
5755     RecordGrid in the identifyview.
5756     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
5757     IdentifyListCtrl. The grid allows editing of the values.
5758    
5759     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
5760     implementing a grid for a single row of a thuban table.
5761    
5762     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
5763     layers by default. Easier to use than the previous default of only
5764     searching through the select layer which meant that if no layer
5765     was selected, you couldn't select a shape.
5766    
5767     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
5768    
5769     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
5770     stroke_width attribute
5771    
5772     * Thuban/Model/save.py (save_session): Write the new stroke_width
5773     attribute
5774    
5775     * Thuban/Model/load.py (ProcessSession.startElement): Read the
5776     stroke_width attribute
5777    
5778     * Thuban/Model/layer.py (Layer.__init__): New parameter and
5779     instance variable stroke_width
5780     (Layer.SetStrokeWidth): Set the stroke_width.
5781    
5782 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
5783    
5784     * extensions/thuban/wxproj.cpp (project_points): Fix two
5785     off-by-one errors in the last loop that joins the various parts
5786     together.
5787    
5788 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
5789    
5790     * setup.py (data_dist.make_distribution): Fix some typos
5791    
5792 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
5793    
5794     * README: Slight tweaking in preparation for the 0.1 release
5795    
5796     * setup.cfg: Add section for sdist to create both tgz and zip
5797     archives
5798    
5799     * setup.py: increase version number to 0.1
5800     (data_dist): New command class for data distribution
5801    
5802 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
5803    
5804 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5805     Handle the case of no layer (i.e. layer is None) properly.
5806    
5807 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5808 bh 70 Set the initial selection of the combo boxes to reflect the
5809     projection we're starting with in a way that works on windows,
5810     too.
5811    
5812 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
5813     puiblisher's ids in hex to make it easier to compare them to the
5814     standard repr of python methods
5815    
5816     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
5817     messages
5818    
5819 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
5820    
5821 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
5822     deselect the layer if no layer is selected
5823    
5824 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
5825     idle time when there actually is something to draw. If there's
5826     nothing to draw simply clear the window
5827     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
5828     (MapCanvas.SetMap): force a redraw in all cases because
5829     FitMapToWindow doesn't always do it.
5830     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
5831     specify the point to move into the center of the window
5832     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
5833     dragged, zoon in/out by a factor of 2
5834 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
5835     index, i.e. reversed drawing order) so that objects appearing to
5836     be in from of others are selected first. This is probably mostly
5837     relevant for point shapes where the symbols used may overlap
5838 bh 59
5839     * Thuban/Model/session.py (create_empty_session): Unset the
5840     modified bit before returning it
5841    
5842     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
5843     create_empty_session session to create the new, empty session.
5844    
5845     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
5846     the tool bitmaps.
5847     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
5848     the code that asks whether the session should be saved into the
5849     new method save_modified_session.
5850     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
5851     method to save modified session here too.
5852    
5853 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
5854    
5855     * setup.py (InnoIconItem): fix typo
5856    
5857     (thuban_bdist_inno.run):
5858     (bdist_inno.run): Move the decision not to create symlinks on
5859     non-nt platforms to thuban_bdist_inno and do it unconditinally
5860     since we never want to create the symlinks here
5861    
5862 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
5863    
5864 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
5865     identify view immediately
5866    
5867     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
5868     and SelectableRecordListCtrl that implement the code shared by the
5869     identify view and the label dialog
5870    
5871     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
5872     new class RecordListCtrl
5873    
5874     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
5875     return value of GetValue is None instead of using it as a boolean
5876     directly so that Zero numbers are handled properly.
5877     (LabelListCtrl): Derive from the new class
5878     SelectableRecordListCtrl
5879    
5880 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
5881     (Proj4Dialog.dialogLayout): Make the window resizable and set the
5882     size of the text control explicitly to make the sizers work on
5883     both Windows and X.
5884    
5885 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
5886    
5887     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
5888     that can limit the search to the currently selected layer.
5889     (MapCanvas.SelectShapeAt): Make sure that the currently selected
5890     layer stays selected even when no shape is found
5891 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
5892     height do nothing (avoids zero division errors)
5893 bh 44
5894 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
5895    
5896 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
5897     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
5898     convenient :-)
5899     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
5900     a new instvar layer_to_item to map layers to tree items
5901     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
5902     to match the current selection in the interactor
5903    
5904 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
5905     (Interactor.HasSelectedLayer): New methods to query the current
5906     selection
5907    
5908     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
5909     (MainWindow.has_selected_layer): Simply call the appropriate
5910     interactor method
5911    
5912     * Thuban/UI/mainwindow.py (MainWindow.__init__):
5913     (MainWindow.LayerShowTable):
5914     (MainWindow.identify_view_on_demand): Store the interactor in an
5915     instvar and use that reference instead of going through main.app
5916    
5917 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5918     * Thuban/UI/application.py (ThubanApplication.OnInit):
5919 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
5920     with the new mainwindow method ShowSessionTree and not directly
5921     the application's OnInit method
5922    
5923     * Thuban/UI/tree.py (myTreeCtrlPanel):
5924     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
5925     TreeCtrl isntead of a panel. This affects most method since we now
5926     refer to self instead of self.tree
5927     (SessionTreeView): New class implementing a non-modal dialog
5928     showing the session tree.
5929    
5930 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
5931     layer to the tableview dialog.
5932    
5933     * Thuban/UI/tableview.py: Add some doc-strings
5934 tkoester 403 (TableGrid):
5935 bh 35 (TableGrid.OnRangeSelect):
5936     (TableGrid.OnSelectCell):
5937     (TableFrame.__init__):
5938     (TableFrame.row_selected):
5939     Selecting rows in the grid view now updates the selected shapes
5940     through the TableFrame. To achieve this we derive TableGrid from
5941     Publisher and introduce the message type ROW_SELECTED which the
5942     TableFrame subscribes to and which is issued by OnRangeSelect and
5943     OnSelectCell
5944    
5945     (DataTable.SelectRow): Removed because it's no longer needed in
5946     the row/shape selection scheme
5947    
5948 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
5949     dialogs
5950    
5951     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
5952     the SELECTED_SHAPE message anymore. This is now handled by the
5953     parent.
5954     (TableGrid.select_shape): Only update the selection if the shape
5955     is not None.
5956     (TableFrame): Inherit from the new NonModalDialog class.
5957     (TableFrame.__init__, TableFrame.select_shape): Handle the
5958     SELECT_SHAPE message.
5959     (TableFrame.OnClose): Extend the inherited method to unsubscribe
5960     SELECT_SHAPE
5961    
5962     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
5963     (MainWindow.add_dialog):
5964     (MainWindow.dialog_open):
5965     (MainWindow.remove_dialog):
5966     (MainWindow.get_open_dialog): New methods to maintain a dictionary
5967     of opened non-modal dialogs.
5968    
5969     (MainWindow.__init__): Initialize the new non-modal dictionary
5970     management code
5971     (MainWindow.LayerShowTable): maintain separate dialogs for each
5972     table using the non-modal dialog management code to only open a
5973     view once for each table.
5974    
5975     (MainWindow.IdentifyTool):
5976     (MainWindow.__init__):
5977     (MainWindow.identify_view_on_demand): Don't open the identify view
5978     in IdentifyTool anymore. This will be done automatically by the
5979     new method identify_view_on_demand which handles the
5980     SELECTED_SHAPE message so that the identify view will be opened on
5981     demand
5982    
5983     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
5984     the interactor argument. The SELECTED_SHAPE message is now handled
5985     by the parent.
5986     (IdentifyView.__init__): Add the interactor argument so that we
5987     can handle the SELECTED_SHAPE message here
5988     (IdentifyView.selected_shape): New method to handle the
5989     SELECTED_SHAPE messages
5990    
5991     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
5992     NonModalDialog class
5993     (IdentifyView.OnClose): Extend the inherited version to
5994     unsubscribe SELECT_SHAPE
5995    
5996     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
5997    
5998 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
5999    
6000     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6001 tkoester 403
6002 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6003     interactor to pass through to the MapCanvas
6004 tkoester 403
6005 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6006     argument to the MainWindow constructor to get rid of the ugly hack
6007     that made main.app available early just so that the mapcanvas
6008     could access the interactor object.
6009    
6010 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
6011    
6012 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
6013     that runs a modal message box
6014     (MainWindow.OnClose): Use the new method
6015     (MainWindow.RemoveLayer): Just do nothing in case no layer is
6016     selected. The command should be grayed out anyway, so there's no
6017     need to pop up a message box.
6018     (MainWindow.AddLayer): Pop up a message box with an error message
6019     if the shape file can't be opened
6020    
6021     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
6022     immediately. This will cause an exception in case the file can't
6023     be opened and we can display an appropriate message.
6024    
6025 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
6026    
6027     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
6028     specific bdist_rpm command.
6029    
6030     * Thuban/UI/main.py: Catch ImportError exceptions when importing
6031     the locale module because it may not be available on some
6032     installations.
6033    
6034     * extensions/pyprojection/LICENSE: Copy of the license text in
6035     Projection.i. Having it in a separate file makes it easier to
6036     refer to license text in e.g. RPMs
6037    
6038 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
6039    
6040 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
6041     more generic
6042    
6043     * setup.py (ThubanInstall.get_outputs): Add the symlink in
6044     <prefix>/bin to the outputs
6045     (ThubanInstall.link_file): New method to link files. We need this
6046     because the standard copy_files refuses to link non-existing
6047     files.
6048     (ThubanInstall.run): Remove the leading install root from the
6049     script filename if an install root was specified and use the new
6050     link_file method
6051 tkoester 403
6052 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6053     the window when the first layer is added to the map.
6054    
6055     * setup.py (ThubanInstall.run): Honor the build root (self.root)
6056     when linking thuban.py to <prefix>/bin
6057    
6058 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
6059    
6060     * setup.py: In the setup call, the install parameters shouldn't
6061     have trailing slashes because distutils on non-posix platforms
6062     doesn't like that. The same applies to other directories like
6063     "Resources/Bitmaps"
6064    
6065     In the configuration section for nt, move the wxWindows directory
6066     optins into the part clearly marked as editable.
6067    
6068     (InstallLocal.initialize_options):
6069     (InstallLocal.user_options): remove the currently unused debug
6070     flag
6071     (thuban_build_py.find_all_modules): Add this method so that it
6072     works for our case of having packages and modules in one
6073     distribution as well.
6074     (ThubanInstall.initialize_options):
6075     (ThubanInstall.finalize_options):
6076     (ThubanInstall.user_options):
6077     (ThubanInstall.boolean_options): Add new options, do-symlink and
6078     extra files. Since these are the first ThubanInstall specific
6079     options, override user_options and boolean_options
6080     (ThubanInstall.run): Honor the new do-symlink and extra-files
6081     options.
6082     (ThubanInstall.get_outputs): Add to override the base-class's
6083     version and add the extra-files to the outputs
6084     (bdist_inno): New class for windows distributions with Inno Setup
6085     (InnoIconItem): Helper class for bdist_inno
6086     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6087     this together with the appropriate parameters, to the setup call.
6088 tkoester 403
6089 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
6090     installer
6091    
6092     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
6093     changing_selection to avoid recursive selection events when
6094     modifying the selection in response to a selection event.
6095     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
6096     changing the tree's selection.
6097     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
6098     we're not being called indirectly from normalize_selection.
6099    
6100     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
6101     event.Check only if the command is actuall checkable.
6102     (MainWindow.__init__): Call the toolbar's Realize method to make
6103     sure that the items are actually shown
6104    
6105 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
6106    
6107 bh 9 * setup.py: Fix some doc strings
6108    
6109 bh 7 * ChangeLog: started
6110    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26