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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1522 - (hide annotations)
Wed Jul 30 12:34:22 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 238906 byte(s)
update ChangeLog

1 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
2    
3     * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4     method directly instead of going through the transient_table
5     method. This faster because transient_table may force the copy of
6     a DBF file into the transient database and setting a table's title
7     doesnm't affect the title of the associated transient table, so
8     this fixes RT #2042
9    
10     * Thuban/UI/main.py (__version__): Don't import the already
11     removed show_exception_dialog.
12    
13 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
14    
15 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
16     Put back this method and remove the equivalent function since we
17     are setting the exception hook from within this class (OnInit).
18    
19     2003-07-29 Jonathan Coles <[email protected]>
20    
21 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
22     Doc/manual/images/5_2_quantiles.png,
23     Doc/manual/images/5_2_uniform_dist.png,
24     Doc/manual/images/5_2_unique_values.png,
25     Doc/manual/images/8_int_error.png: New screen shots.
26    
27     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
28     some points, and added more screen shots.
29    
30 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
31    
32 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
33    
34     2003-07-29 Bernhard Herzog <[email protected]>
35    
36 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
37     deprecated since before the 0.8 release and isn't used in Thuban
38     itself anymore.
39    
40 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
41    
42 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
43 jonathan 1506
44     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
45     python exception hook here so that we are sure to catch any
46     Thuban exception that happen during initialization.
47    
48     * Thuban/UI/main.py (main): Don't set the exception hook here,
49     it will get set in ThubanApplication.OnInit.
50    
51     2003-07-29 Jonathan Coles <[email protected]>
52 jonathan 1503
53     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
54     Removed and called it show_exception_dialog() so that the exception
55     handler can be set before the class is created.
56    
57     * Thuban/UI/main.py (main): Install the exception handler before
58     a ThubanApplication is created.
59    
60 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
61    
62     * po/it.po: New. Italian translation by Maurizio Napolitano
63    
64     * po/ru.po: New. Russian translation by Alex Shevlakov
65    
66 frank 1497 2003-07-29 Frank Koormann <[email protected]>
67    
68 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
69     projections.
70    
71     2003-07-29 Frank Koormann <[email protected]>
72    
73 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
74    
75 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
76    
77 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
78     on white background.
79    
80     2003-07-29 Jonathan Coles <[email protected]>
81    
82 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
83     descriptions for the legend toolbar.
84    
85     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
86     cursor from dialog box.
87    
88     2003-07-28 Jonathan Coles <[email protected]>
89    
90     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
91    
92     * Doc/manual/images/2_4_session_tree.png,
93     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
94     Doc/manual/images/4_2_layer_properties.png,
95     Doc/manual/images/4_2_raster_layer_properties.png,
96     Doc/manual/images/5_3_genclass.png,
97     Doc/manual/images/5_classification.png,
98     Doc/manual/images/6_projection.png,
99     Doc/manual/images/7_1_table_view.png,
100     Doc/manual/images/7_2_5_join.png: New screenshots.
101    
102     2003-07-24 Jonathan Coles <[email protected]>
103    
104     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
105    
106     2003-07-24 Jonathan Coles <[email protected]>
107    
108     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
109     chapter on Layer Management.
110    
111     * Doc/manual/Makefile: New. Makefile to generate all formats for the
112     manual and images.
113    
114 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
115    
116     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
117     it annoys lintian which warns about these files not being
118     executable. The #1 isn't necessary here since if you absolutely
119     must execute them you can always say "python <filename>".
120    
121     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
122     superfluous code to set brush and pen for point shapes
123    
124     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
125     belong in viewport anyway
126    
127 frank 1479 2003-07-24 Frank Koormann <[email protected]>
128    
129     * Doc/manual/thuban-manual.xml: Added section on table management.
130    
131 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
132    
133     * test/runtests.py (main): Recognize the long "verbose" option
134     correctly.
135    
136 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
137    
138     * Doc/manual/thuban-manual.xml: Continue to write first revision
139     of the manual.
140    
141     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
142     with Begin/EndDrawing() calls to ensure we aren't doing to
143     many updates to the dc during rendering.
144     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
145     a pen and brush argument so they need to be passed to the function.
146    
147     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
148     Calculates the minimum and maximum scale values. Factored out
149     of set_view_transform so that it could be used to zoom all the
150     way into a single point.
151     (ViewPort.set_view_transform): Call calc_min_max_scales().
152     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
153     if only a single point is selected.
154    
155     * Doc/manual/images/1_2_legend_close.png,
156     Doc/manual/images/1_2_legend_dock.png,
157     Doc/manual/images/1_2_mainwindow.png,
158     Doc/manual/images/1_2_mainwindow.ps,
159     Doc/manual/images/1_2_mainwindow.sk,
160     Doc/manual/images/3_2_fullextent.png,
161     Doc/manual/images/3_2_fulllayerextent.png,
162     Doc/manual/images/3_2_fullshapeextent.png,
163     Doc/manual/images/3_2_pan.png,
164     Doc/manual/images/3_2_zoomin.png,
165     Doc/manual/images/3_2_zoomout.png,
166     Doc/manual/images/3_3_identify.png,
167     Doc/manual/images/3_3_label.png,
168     Doc/manual/images/3_5_invisible.png,
169     Doc/manual/images/3_5_movedown.png,
170     Doc/manual/images/3_5_moveup.png,
171     Doc/manual/images/3_5_props.png,
172     Doc/manual/images/3_5_tobottom.png,
173     Doc/manual/images/3_5_totop.png,
174     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
175    
176 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
177    
178 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
179    
180     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
181     after the new map has been assigned
182    
183     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
184     Delegate MAP_REPLACED to the canvas too
185     (MainWindow.prepare_new_session): Removed. Thanks to the new
186     MAP_REPLACED message it's no longer needed
187     (MainWindow.OpenSession, MainWindow.NewSession):
188     prepare_new_session has been removed.
189    
190     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
191     MAP_REPLACED so that we can close the dialog if a new map is set.
192     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
193     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
194     dialog
195    
196     * test/test_viewport.py (SimpleViewPortTest)
197     (SimpleViewPortTest.test_default_size): Add doc-strings
198     (ViewPortTest.setUp): Bind map to self.map so we can use it in
199     tests. Subscribe to MAP_REPLACED messages too.
200     (ViewPortTest.tearDown): No need to explicitly unsubscribe
201     (ViewPortTest.test_set_map): New test for the SetMap method.
202    
203     2003-07-18 Bernhard Herzog <[email protected]>
204    
205 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
206     Move this test from ViewPortTest.setUp to this new separate test
207     case. setUp is not the place for the actual tests.
208     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
209     more of the test from setUp to the new test test_inital_settings.
210     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
211     (ViewPortTest.test_proj_conv): Split test_proj_conv into
212     test_win_to_proj and test_proj_to_win and make the tests easier to
213     understand
214     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
215     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
216     (ViewPortTest.test_unprojected_rect_around_point)
217     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
218     Reformat to increase readability.
219    
220     2003-07-18 Bernhard Herzog <[email protected]>
221    
222 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
223    
224     2003-07-18 Bernhard Herzog <[email protected]>
225    
226 bh 1459 * test/runtests.py: The test suite can now be run without an X
227     connection. To make sure this remains true, remove the DISPLAY
228     environment variable so that an error occurs if the wxGTK is
229     imported accidentally
230    
231     2003-07-18 Bernhard Herzog <[email protected]>
232    
233 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
234    
235     * Thuban/UI/view.py: Remove unused imports
236    
237     2003-07-18 Bernhard Herzog <[email protected]>
238    
239 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
240     function is now in viewport.py and is called output_transform
241     (TestScalebar.test_output_transform)
242     (TestScalebar.test_OutputTransform): Renamed to
243     test_output_transform and updated to use output_transform instead
244     of OutputTransform
245    
246     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
247     renamed.
248     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
249     renamed to output_transform
250    
251     * Thuban/UI/viewport.py (OutputTransform, output_transform):
252     Rename to output_transform
253    
254     2003-07-18 Bernhard Herzog <[email protected]>
255    
256 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
257     classificationField to classificatin_column and init it here so
258     that it can be used in SetClassificationColumn
259     (Layer.GetClassificationColumn, Layer.GetClassificationField):
260     Rename to GetClassificationColumn.
261     (Layer.SetClassificationColumn, Layer.SetClassificationField):
262     Rename to SetClassificationColumn and issue a LAYER_CHANGED
263     message if the column changes.
264     (Layer._classification_changed, Layer.ClassChanged): Rename to
265     _classification_changed. Update the callers.
266     (Layer.SetShapeStore): Further field->column renames.
267    
268     * Thuban/Model/load.py (SessionLoader.start_classification)
269     (SessionLoader.start_clpoint): Updates because of
270     field->column method name changes in the Layer class
271    
272     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
273     because of field->column method name changes in the Layer class
274    
275     * Thuban/UI/classifier.py (Classifier.__init__)
276     (Classifier._OnTry, Classifier._OnRevert): Updates because of
277     field->column method name changes in the Layer class
278    
279     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
280     because of field->column method name changes in the Layer class
281    
282     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
283     of field->column method name changes in the Layer class
284    
285     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
286     (SaveSessionTest.testClassifiedLayer): Update because of
287     field->column method name changes in the Layer class
288    
289     * test/test_layer.py (SetShapeStoreTests.setUp)
290     (SetShapeStoreTests.test_sanity): Update because of field->column
291     method name changes in the Layer class
292     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
293     (TestLayerModification.test_sanity)
294     (TestLayerModification.test_initial_settings): remove unsued code
295     and rename to test_sanity.
296     (TestLayerModification.test_set_classification): New test for
297     SetClassification and SetClassificationField.
298    
299     2003-07-18 Bernhard Herzog <[email protected]>
300    
301 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
302     the non-fixed values as well. The old test would have accepted a
303     fixed ramp that only returnes the fixed properties
304    
305 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
306    
307     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
308     shots for the manual. The XCF file is the source image and
309     has additional layers to support changes.
310    
311     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
312    
313     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
314     Return both the new class and the field name.
315    
316     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
317     fit the map to the window as this changes any zoom level that
318     the user may have set.
319    
320 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
321    
322     * Thuban/Model/classgen.py (generate_singletons,
323     generate_uniform_distribution, generate_quantiles): Remove
324     fixes parameter, but maintain the same functionality by having
325     the calling function pass a FixedRamp object for the ramp.
326     (FixedRamp): New. Adapts a ramp to have fixed property values.
327    
328     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
329     (Classification): Inherit from Publisher.
330     (Classification.__init__): Remove the layer parameter.
331     Classifications no longer need to have a parent layer.
332     (Classification.GetField, Classification.GetFieldType,
333     Classification.SetFieldInfo): Removed. The field name is stored
334     in the layer, and the type can be retreived by calling
335     Layer.GetFieldType().
336     (Classification._set_layer, Classification.GetLayer): Removed.
337     Classifications no longer have a parent layer.
338    
339     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
340     classification.
341     (Layer.SetShapeStore): Reset the classification first while
342     we still have the old shape store to work with.
343     (Layer.GetClassificationField, Layer.SetClassificationField):
344     New. Method for getting/setting the field to classify on.
345     (Layer.SetClassification): Simplified now that the layer
346     simply has to hold a reference to the classification and not
347     tell the classification who owns it.
348     Fixes RTbug #2023.
349    
350     * Thuban/Model/load.py (SessionLoader.start_classification):
351     Set the field name on the layer, not the classification.
352    
353     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
354     classification is modified.
355    
356     * Thuban/Model/save.py (SessionSaver.write_classification):
357     Get the field name and type from the layer.
358    
359     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
360     parameter records to rows and add docstring. Fixes RTbug #1997.
361    
362     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
363     ramp when we need to fix certain values of a ramp rather than
364     using the old fixes parameter. Fixes RTbug #2024.
365    
366     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
367     parameter.
368     (ClassTable.Reset): Add fieldType parameter and use it, rather
369     than asking the classification.
370     (Classifier.__init__): Remember the original class's field
371     and ask the layer for the field type, rather than the classification.
372     (Classifier.__SetGridTable): Retrieve the field and field type
373     for the table because they are not in the classification.
374     (Classifier._OnTry, Classifier._OnRevert): Set the classification
375     field on the layer in addition to the classification itself.
376    
377     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
378     classification field from layer.
379    
380     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
381     classification field from layer. Split up tests and remove
382     *-imports. Fixes RTbug #1992.
383    
384     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
385    
386     * test/test_classification.py
387     (TestClassification.test_classification): Remove tests for methods
388     that no longer exist.
389    
390     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
391     __init__ no longer has a field parameter, use SetClassificationField.
392     (SetShapeStoreTests.test_sanity): Use layer object to get class
393     field info.
394    
395     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
396     SetClassificationField on layer to set class field info.
397    
398     * test/test_viewport.py: Renamed from test/test_view.py.
399    
400 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
401    
402     * Doc/manual/thuban-manual.xml: Added authors and an initial
403     coarse structure.
404    
405 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
406    
407 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
408     and therefore should not be derived from any other class.
409    
410     * test/test_range.py (RangeTest): FloatComparisonMixin is a
411     mix-in, so derive from TestCase as well.
412    
413     2003-07-15 Bernhard Herzog <[email protected]>
414    
415 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
416     draw_func handling a bit to remove one layer of indirection. This
417     makes the renderer about 10% faster in the non-classifying case
418     and the code a bit cleaner
419     (MapRenderer.draw_point_shape): Add the pen and brush parameters
420     and set them in the dc. Now the draw_point_shape method and
421     wxproj's draw_polygon_shape function have basically the same
422     signature so that both can be directly used as draw_func
423    
424     2003-07-15 Bernhard Herzog <[email protected]>
425    
426 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
427     string values (in addition to the labels) as UTF 8
428    
429     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
430     values if the field type is string
431    
432     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
433     saving a session with non-ascii string classification values.
434    
435     * test/test_load.py (TestClassification.file_contents)
436     (TestClassification.test): Check for non-ascii values in string
437     classifications
438    
439 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
440    
441     * test/test_view.py: New. Tests for ViewPort.
442    
443 frank 1409 2003-07-14 Frank Koormann <[email protected]>
444    
445     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
446     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
447    
448 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
449     unicode strings from session file: session title, map title and
450     projection name.
451    
452 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
453    
454 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
455     drag_stop, not drag_move when the mouse is released.
456    
457     2003-07-10 Jonathan Coles <[email protected]>
458    
459 jonathan 1403 The most important part of this is the seperation of view.py into
460     two pieces. viewport.py now has a class called ViewPort which
461     contains all the non-wx parts of view.py and can therefore be
462     tested. view.py contains only the wx-specific parts and is fairly
463     simple.
464    
465     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
466     RTTbug #1992.
467     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
468     RTTbug #1992.
469    
470     * Thuban/Model/classgen.py (generate_singletons,
471     generate_uniform_distribution, generate_quantiles):
472     Added 'fixes' parameter so that property attributes can
473     be held constant over the generated classification groups.
474     (CustomRamp.GetProperties): Remove unused variables.
475    
476     * Thuban/Model/map.py (Map.SetProjection): Send the old
477     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
478     event.
479    
480     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
481     parameter which is a list of records that restricts which
482     records are saved. Fixes RTbug #1997.
483    
484     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
485     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
486    
487     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
488     to allow the user to fix line color/width on generated groups.
489     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
490     functions to optionally fix group properties.
491    
492     * Thuban/UI/main.py (main): Set exception hook to the
493     ShowExceptionDialog. Fixes RTbug #1993.
494    
495     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
496     the table window when it is selectd to be shown.
497    
498     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
499     Export Selection button and move the export buttons underneath
500     the table.
501     (QueryTableFrame.UpdateStatusText): Added event argument so
502     that it can respond to grid selection events. The status text
503     is now updated even when the table is not associated with a
504     layer as was previously assumed.
505     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
506     UpdateStatusText responds to these events.
507     (QueryTableFrame.OnSaveAs): Renamed to doExport.
508     (QueryTableFrame.doExport): Helper function that saves the
509     entire table, or selected rows, to a file.
510     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
511     Respond to export button events and call doExport.
512    
513     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
514     the function doesn't return NULL without first setting a Python
515     Error.
516    
517     * test/runtests.py (main): Only print "Unknown option" for
518     unsupported options.
519    
520     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
521     optional epsilon argument to specify floating point accuracy.
522     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
523     for each item test.
524    
525     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
526     tests for saving selected records.
527    
528     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
529     tests for saving selected records.
530    
531     * test/test_map.py (TestMapWithContents.test_set_projection):
532     MAP_PROJECTION_CHANGED events send the old projection.
533    
534     * test/test_session.py
535     (TestSessionWithContent.test_forward_map_projection):
536     MAP_PROJECTION_CHANGED events send the old projection.
537    
538     * test/test_table.py (TableTest): Update tests to use non-deprecated
539     functions.
540    
541 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
542    
543 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
544     constants in the column objects are the standard ones defined in
545     the table module.
546    
547     * test/test_transientdb.py
548     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
549     exporting transient tables as DBF works. This should catch the bug
550     just fixed in TransientTableBase.Width.
551    
552     2003-07-08 Bernhard Herzog <[email protected]>
553    
554 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
555     interpolated colors correctly.
556    
557     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
558     New. Test case for the fix in classgen.py
559    
560     2003-07-08 Bernhard Herzog <[email protected]>
561    
562 bh 1378 * test/runtests.py (main): Make the default output less verbose
563     and add a verbosity option (-v) to get the old output
564    
565     2003-07-08 Bernhard Herzog <[email protected]>
566    
567 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
568     0.9.
569    
570     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
571     New. Return the join type
572    
573     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
574     DTD
575     (SessionSaver.write_data_containers): Save the join type for
576     joined tables
577    
578     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
579     namespace
580     (SessionLoader.start_jointable): Handle the jointype attribute
581    
582     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
583     as of Thuban 0.8. These are now tests to determine whether Thuban
584     can still read files generated by Thuban 0.8
585    
586     * test/test_load.py (LoadSessionTest.dtd)
587     (TestSingleLayer.file_contents)
588     (TestLayerVisibility.file_contents, TestLabels.file_contents)
589     (TestLayerProjection.file_contents)
590     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
591     (TestJoinedTable.file_contents)
592     (TestLoadError.file_contents): Update for new DTD
593     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
594     for new join type attribute
595    
596     * test/test_save.py (SaveSessionTest.dtd)
597     (SaveSessionTest.testEmptySession)
598     (SaveSessionTest.testSingleLayer)
599     (SaveSessionTest.testLayerProjection)
600     (SaveSessionTest.testRasterLayer)
601     (SaveSessionTest.testClassifiedLayer)
602     (SaveSessionTest.test_dbf_table)
603     (SaveSessionTest.test_joined_table): Update for new DTD
604     (SaveSessionTest.test_joined_table): Add test for new join type
605     attribute
606    
607 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
608    
609     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
610     function for table_to_dbf
611     (table_to_dbf): Deal with names longer than the 10 character limit
612    
613     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
614     doc-string
615     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
616     long column names
617    
618 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
619    
620 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
621    
622     2003-07-03 Bernhard Herzog <[email protected]>
623    
624 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
625     for the Thuban manual and README with some basic information about
626     the manual
627    
628     2003-07-03 Bernhard Herzog <[email protected]>
629    
630 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
631     Update doc-string
632     (TransientJoinedTable.create): Do not modify the column objects of
633     the input tables in place and copy all columns of the input tables
634     into the joined table after all.
635    
636     * test/test_transientdb.py
637     (TestTransientTable.test_transient_joined_table_same_column_name):
638     Update to reflect the new behavior
639     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
640     Update to reflect the new behavior
641     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
642     New test case for a bug which modified the column objects in place
643    
644 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
645 jonathan 1349
646 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
647     generate_uniform_distribution, generate_quantiles,
648 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
649     one, otherwise we could divide by zero.
650    
651     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
652     ClassGenTest.doClassSingleTest): Call doBoundsTest to
653     check the end classification groups against the
654     proper property values.
655     (ClassGenTest.doBoundsTest): New. Checks the first and
656     last classification groups to make sure their properties
657     are the correct upper and lower bounds for a color ramp.
658    
659     2003-07-02 Jonathan Coles <[email protected]>
660    
661     * Thuban/Model/classgen.py (generate_singletons,
662     generate_uniform_distribution, generate_quantiles,
663 jonathan 1360 GenQuantiles0): The denominator was one to high when
664     calculating the index for the ramp causing the index
665     to never to reach one.
666    
667     2003-07-02 Jonathan Coles <[email protected]>
668    
669 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
670     ClassGroupRange.SetRange() so that the min/max values are
671     passed as a tuple. This makes a better calling scheme for
672     when a Range object is passed instead.
673    
674     * Thuban/Model/classgen.py: Fixed parameters to
675     ClassGroupRange constructor.
676    
677     * Thuban/Model/classification.py (ClassGroupRange.__init__):
678     Consolidate the min/max parameters into a single _range which
679     can either be a tuple or a Range object.
680     (ClassGroupRange.SetRange): Consolidate the min/max parameters
681     into a single _range which can either be a tuple or a Range object.
682    
683     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
684     call to ClassGroupRange constructor to use a tuple.
685    
686     * Thuban/Model/layer.py (Layer.SetClassification): Switch
687     the classification instance variable to the new class
688     before calling _set_layer otherwise subscribers to a
689     LAYER_CHANGED event will not see any difference.
690    
691     * test/test_classification.py: Fix tests of ClassGroupRange
692     so that they use the new signature.
693    
694     * test/test_load.py: Fix use of ClassGroupRange so that it
695     uses the new signature.
696    
697     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
698     uses the new signature.
699    
700     * test/test_save.py: Fix use of ClassGroupRange so that it
701     uses the new signature.
702    
703    
704     2003-07-01 Jonathan Coles <[email protected]>
705    
706 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
707     Import used objects/class from color.
708     (generate_singletons): We don't
709     need the numGroups parameter anymore because we are using
710     the new ramps with GetProperties().
711     (generate_uniform_distribution): Use new ramp method
712     GetProperties().
713     (generate_quantiles, GenQuantiles0): Use new ramp method
714     GetProperties().
715     (CustomRamp.SetNumGroups): Removed. The ramps now map
716     a value from 0 to 1 to class properties so the number
717     of groups is not needed ahead of time.
718     (CustomRamp.next): Removed. CustomRamp does not support
719     interation anymore.
720     (CustomRamp.GetProperties): Returns a ClassGroupProperties
721     object based on the index value from 0 to 1 that is
722     passed to it.
723     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
724     Made into instances of Monochromatic class instread of
725     deriving from it.
726     (HotToCold.SetNumGroups): Removed. See CustomRamp.
727     (HotToCold.next): Removed. See CustomRamp.
728    
729     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
730     (Classification.SetField, Classification.SetFieldType):
731     Replaced with SetFieldInfo.
732     (Classification.SetFieldInfo): New. Does a better job of
733     what SetField and SetFieldType used to do by combining
734     their function since they should really always be done
735     at the same time.
736     (Classification.SetLayer): Renamed to _set_layer.
737     (Classification._set_layer): Should only be called from
738     Layer's SetClassification. This does not cause a recursive
739     call as SetLayer did because we know that Layer knows about
740     the classification.
741    
742     * Thuban/Model/color.py: Fixes RTbug #1971.
743     (_Transparent): Renamed from Transparent so it doesn't
744     conflict with the module variable.
745     (Transparent, Black): Renamed from Color.Transparent,
746     Color.Black so they are not class variables.
747    
748     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
749     (Layer.Destroy): We don't need to call SetClassification
750     anymore to clear out the back reference in the classifcation
751     to the layer. It's better to set it to None using _set_layer,
752     and we won't be creating another clas object too.
753     (Layer.SetClassification): Classification._set_layer is not
754     recursive so remove all the locking variables. Also clean
755     up the code so that it remains unchanged if something fails.
756    
757     * Thuban/Model/load.py: Fixes RTbug #1971.
758     (SessionLoader.start_classification): Call
759     Classification.SetFieldInfo().
760    
761     * Thuban/Model/save.py: Removed import of Color which wasn't
762     being used.
763    
764     * Thuban/UI/classgen.py: Fixes RTbug #1972.
765     (ClassGenDialog.__init__): Color ramps are now instances
766     already so we don't need to create any new objects.
767     (ClassGenDialog.OnOK): Check for numGroups is no longer
768     necessary because we never use it.
769    
770     * Thuban/UI/classifier.py: Fixes RTbug #1971.
771     (Classifier.__BuildClassification, Classifier.__SetGridTable):
772     Call Classification.SetFieldInfo() instead of SetFieldType.
773    
774     * Thuban/UI/renderer.py: Fixes RTbug #1971.
775    
776     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
777     (MapCanvas.__init__): Subscribe to the idle time event. Set
778     background color to white.
779     (MapCanvas.OnPaint): Set a flag indicating that we should
780     render the map during idle time. If we already have a bitmap
781     just draw it now.
782     (MapCanvas.OnIdle): New. Render the map only during idle time.
783     This also fixes a problem with the busy cursor under gtk.
784    
785     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
786     Fix calls to generate_singletons because the signature changed.
787    
788     * test/test_classification.py: Fix color references and
789     change calls to Classification.[SetField|SetFieldType] to
790     SetFieldInfo.
791    
792     * test/test_load.py: Fix color references.
793    
794     * test/test_load_0_2.py: Fix color references.
795    
796     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
797     Change calls to Classification.[SetField|SetFieldType] to
798     SetFieldInfo.
799    
800 frank 1334 2003-07-01 Frank Koormann <[email protected]>
801    
802     MERGE from the greater-ms3 branch.
803    
804     * test/test_transientdb.py
805     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
806     New. Test join of two tables with partly equal column names.
807    
808     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
809     If duplicates in left and right tables column names are found,
810     append '_' (underscores) to the name until it is unique.
811     Create always new internal names for the resulting table and reference
812     columns in the join statement with <table>.<column>
813    
814 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
815    
816     * test/test_transientdb.py
817     (TestTransientTable.test_transient_joined_table_same_column_name):
818     New. Test whether joining on columns with the same names in both
819     tables works.
820 frank 1334
821 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
822     sure to use the right internal names even when joining on field
823     with the same names in both tables. Also, detect duplicate names
824     in the joined table correctly.
825    
826 frank 1325 2003-07-01 Frank Koormann <[email protected]>
827    
828     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
829     Reverse List of layers to render in same order as in desktop legend.
830    
831 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
832    
833 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
834     and splits it into a tuple of at most three integers.
835     Used make_tuple() to make tuple versions of the version
836     numbers.
837    
838     * Thuban/UI/about.py: Add Thuban email addresses.
839    
840     2003-06-30 Jonathan Coles <[email protected]>
841    
842 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
843     were too high.
844    
845     2003-06-30 Jonathan Coles <[email protected]>
846    
847 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
848    
849     * MANIFEST.in: Added Projections so that default.proj is
850     included.
851    
852 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
853    
854     New About box with lots more information including library
855     versions and credits. More/better version checking before
856     Thuban starts.
857    
858     * Thuban/UI/about.py: New. New About box that displays
859     library version information and credits.
860    
861     * Thuban/version.py: Added new 'versions' dictionary which
862     contains the verions of various libraries which are checked
863     when the module loads.
864     (verify_versions): Check all version numbers and returns
865     a list of errors.
866    
867     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
868     Reset the status of the buttons as the situation warrants,
869     but in a better more reliable way by not relying on the
870     current status to determine what needs to change.
871    
872     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
873     (verify_versions): Remove most of the code since it is
874     now in Thuban.version.verify_versions.o
875    
876     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
877     About box in Thuban.UI.about.
878    
879     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
880     Returns the version of gdal library being used as a string.
881    
882     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
883     Removed.
884     (get_proj_version): Return the version of PROJ that the file
885     was compiled with.
886     (get_gtk_version): Return th version of GTK that the file
887     was compiled with.
888    
889 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
890    
891     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
892     of the SelectPropertiesDialog should be self so the window
893     appears on top.
894     (ClassGroupPropertiesCtrl.DoEdit): The parent
895     of the SelectPropertiesDialog should be self so the window
896     appears on top.
897    
898     * Thuban/UI/resource.py: Cleaned up how we determine file
899     extensions.
900     (GetImageResource): Return an wxImage from our Resources.
901    
902 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
903    
904     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
905     Check that a layer has a classification before trying
906     to get it. Raster layers don't have classifications.
907    
908 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
909 jonathan 1297
910     * setup.py: Add Resources/XML to resource list.
911    
912     2003-06-23 Jonathan Coles <[email protected]>
913 jonathan 1286
914 jonathan 1297 * setup.cfg: Fix copyright dates
915    
916     2003-06-23 Jonathan Coles <[email protected]>
917    
918 jonathan 1294 * MANIFEST.in: Update with Resources/XML
919    
920     * setup.py: Don't include Locale resources yet as we don't
921     have any and it causes problems building the distribution
922     for Windows. Update version to 0.8.0.
923    
924     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
925    
926     * Thuban/UI/mainwindow.py: Add blank line at the end because
927     file was not being read correctly building the Windows
928     distribution.
929    
930     2003-06-23 Jonathan Coles <[email protected]>
931    
932 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
933    
934     * Thuban/version.py: Temporarily update longversion for
935     the 0.8 release so that it doesn't have the cvs revision.
936    
937     2003-06-23 Jonathan Coles <[email protected]>
938    
939 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
940     to make sure that we don't create reentrant possibilities with
941     wxYield.
942    
943     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
944     directly to avoid the wxSafeYield() call which generates an
945     OnPaint event causing infinite recursion. Don't try to catch
946     exception anymore. This was for before there were limits on map
947     scaling.
948    
949 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
950    
951     Bug fix for RT #1961:
952    
953     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
954     Register DerivedShapestores with the session
955    
956     * Thuban/Model/session.py (Session.Tables): Make sure each table
957     is only listed once.
958    
959     * test/test_load.py (TestJoinedTable.test): Add check_format call.
960     Update file contents to match the one written out.
961    
962 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
963    
964     * test/xmlsupport.py (SaxEventLister.startElementNS)
965     (SaxEventLister.endElementNS): Do not include the qname. Python
966     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
967     is (presumably incorrectly) None, whereas it's a string with the
968     element name in the later versions.
969    
970     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
971     (TestEventList.test_even_list_namespace): Update tests to reflect
972     the new behaviour
973     (TestEventList.test_even_list_id_normalization): Fix doc-string
974    
975 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
976    
977 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
978     by deriving classes to determine if that layer supports shapes.
979     (Layer): Override HasShapes and return true.
980    
981     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
982     instead of a direct call to wx[Begin|End]CusyCursor().
983     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
984     table data.
985    
986     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
987     New. Wrappers around the wxWindows functions that allow us to
988     make additional calls such as wxYield which gives the native
989     system a chance to update the cursor correctly.
990    
991     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
992     instead of a direct call to wx[Begin|End]CusyCursor().
993    
994     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
995     instead of a direct call to wx[Begin|End]CusyCursor().
996     (MapCanvas.find_shape_at): Check if the current search layer
997     support shapes, otherwise go on to the next layer.
998    
999     * test/test_layer.py: Add tests in each type of layer for
1000     HasClassification() and HasShapes()
1001    
1002     2003-06-20 Jonathan Coles <[email protected]>
1003    
1004 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1005     turning on the busy cursor to allow the system to change the
1006     cursor before we begin painting. This fixes a problem that
1007     was occuring only under GTK. Fixes RTbug #1840.
1008    
1009 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
1010    
1011     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1012     version.
1013    
1014     * Thuban/Model/save.py (sort_data_stores): New. Make topological
1015     sort of the data sources so they can be written with sources that
1016     data sources that depend on other data sources come after the
1017     sources they depend on.
1018     (SessionSaver.__init__): Add idmap instance variable to map from
1019     objects to the ids used in the file.
1020     (SessionSaver.get_id, SessionSaver.define_id)
1021     (SessionSaver.has_id): New. Methods to manage the idmap
1022     (SessionSaver.write): Use thuban-0.8.dtd
1023     (SessionSaver.write_session): Add a namespace on the session and
1024     write out the data sources before the maps.
1025     (SessionSaver.write_data_containers): New. Write the data
1026     containers.
1027     (SessionSaver.write_layer): Layer elements now refer to a
1028     shapestore and don't contain filenames anymore.
1029    
1030     * Thuban/Model/load.py (LoadError): Exception class to raise when
1031     errors in the files are discovered
1032     (SessionLoader.__init__): Define dispatchers for elements with a
1033     thuban-0.8 namespace too.
1034     (SessionLoader.check_attrs): New helper method to check and
1035     convert attributes
1036     (AttrDesc): New. Helper class for SessionLoader.check_attrs
1037     (SessionLoader.start_fileshapesource)
1038     (SessionLoader.start_derivedshapesource)
1039     (SessionLoader.start_filetable, SessionLoader.start_jointable):
1040     Handlers for the new elements in the new fileformat
1041     (SessionLoader.start_layer): Handle the shapestore attribute in
1042     addition to filename.
1043     (SessionLoader.start_table, SessionLoader.end_table): Removed.
1044     They were never used in the old formats and aren't needed for the
1045     new.
1046    
1047     * Thuban/Model/session.py (Session.DataContainers): New method to
1048     return all "data containers", i.e. shapestores and tables
1049    
1050     * test/xmlsupport.py (SaxEventLister.__init__)
1051     (SaxEventLister.startElementNS, sax_eventlist): Add support to
1052     normalize IDs.
1053    
1054     * test/test_xmlsupport.py
1055     (TestEventList.test_even_list_id_normalization): New test case for
1056     id normalization
1057    
1058     * test/test_load.py (LoadSessionTest.check_format): Use ID
1059     normalization
1060     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1061     class atrributes used for ID normalization
1062     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1063     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1064     file format
1065     (TestJoinedTable): New test for loading sessions with joined
1066     tables.
1067     (TestLoadError): New. Test whether missing required attributes
1068     cause a LoadError.
1069    
1070     * test/test_save.py (SaveSessionTest.thubanids)
1071     (SaveSessionTest.thubanidrefs): New class attributes for ID
1072     normalization in .thuban files.
1073     (SaveSessionTest.compare_xml): Use id-normalization.
1074     (SaveSessionTest.testEmptySession)
1075     (SaveSessionTest.testLayerProjection)
1076     (SaveSessionTest.testRasterLayer)
1077     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1078     (SaveSessionTest.testLayerProjection): The filename used was the
1079     same as for testSingleLayer. Use a different one.
1080     (SaveSessionTest.test_dbf_table)
1081     (SaveSessionTest.test_joined_table): New test cases for saving the
1082     new data sources structures.
1083     (TestStoreSort, MockDataStore): Classes to test the sorting of the
1084     data stores for writing.
1085    
1086     * test/runtests.py: Add CVS keywords
1087    
1088 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
1089    
1090 jonathan 1267 * test/test_session.py
1091     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1092     Use the cultural_landmark-point.dbf file for the store so that
1093     the table rows and shape count match.
1094    
1095     2003-06-20 Jonathan Coles <[email protected]>
1096    
1097 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1098     an exception if the number of shapes is different from the
1099     number of rows in the table. Address RTbug #1933.
1100    
1101     * test/test_layer.py (TestLayer.test_derived_store): Add
1102     a test for the new exception in DerivedShapeStore.__init__.
1103    
1104     * test/support.py (FloatTestCase): Removed since there is
1105     already FloatComparisonMixin. Fixes RTbug #1954.
1106     (FloatComparisonMixin.assertFloatEqual): Include test for
1107     infinity that was part of FloatTestCase.
1108    
1109     * test/test_range.py (RangeTest): Inherit from
1110     support.FloatComparisonMixin now that we don't have
1111     support.FloatTestCase.
1112    
1113 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
1114    
1115 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1116     the implementation in xmlsupport instead.
1117     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1118    
1119     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1120     of test_save
1121    
1122     2003-06-20 Bernhard Herzog <[email protected]>
1123    
1124 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
1125     method to make sure the test files we load might have been written
1126     by the current thuban version.
1127     (ClassificationTest.TestLayers, TestSingleLayer.test)
1128     (TestLayerVisibility.test, TestClassification.test)
1129     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1130     Add check_format() calls and fix the thuban data to match the data
1131     that would be written by saving the session loaded from it.
1132    
1133     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1134     the same class and function in test_save.
1135    
1136     * test/test_xmlsupport.py (TestEventList): New. test cases for
1137     sax_eventlist
1138    
1139     2003-06-20 Bernhard Herzog <[email protected]>
1140    
1141 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
1142     Thuban are covered by this DTD
1143     (map): Fix content model for layers and raster layers. There can
1144     be any number or layers and raster layers in any order.
1145    
1146 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
1147    
1148 jonathan 1265 This is mainly about fixing RTbug #1949.
1149    
1150 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
1151     import statement since python 2.2 is the earliest supported
1152     version.
1153    
1154     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1155     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1156     depending on the units this projection *forwards* into.
1157    
1158     * Thuban/Model/save.py (SessionSaver.write_classification):
1159     Remove unnecessary use of lambdas and nested functions.
1160    
1161     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1162     adjustment here if the map projection uses degrees.
1163    
1164     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1165     scale adjust code since it is now done before calling
1166     this method. Don't do anything if the map projection
1167     is None.
1168    
1169 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
1170    
1171 bh 1248 Move version specific load tests to their own file.
1172    
1173     * test/test_load.py: Expand the doc-string to explain a bit how to
1174     handle file format changes.
1175     (TestClassification.test): Update the docstring as this test is
1176     not about Thuban 0.2 anymore.
1177    
1178     * test/test_load_0_2.py: New file with the load tests for thuban
1179     files created with Thuban 0.2 and earlier.
1180    
1181     2003-06-19 Bernhard Herzog <[email protected]>
1182    
1183 bh 1246 Add XML validation to some of the tests. Validation will only be
1184     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1185     To make the DTD available to the test cases it's moved into
1186     Resources/XML
1187    
1188     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1189     for versions up to and including 0.2. Two slight changes: added an
1190     encoding specification and fixed the comment which refered to
1191     GRASS, not Thuban
1192    
1193     * test/xmlsupport.py: New support module for tests involving XML.
1194     Currently there's a mix-in class for XML validation.
1195    
1196     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1197    
1198     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1199     so that we can validate the
1200     (SaveSessionTest.testEmptySession)
1201     (SaveSessionTest.testSingleLayer)
1202     (SaveSessionTest.testSingleLayer)
1203     (SaveSessionTest.testLayerProjection)
1204     (SaveSessionTest.testRasterLayer)
1205     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1206    
1207     * test/runtests.py (main): Call print_additional_summary instead
1208     of print_garbage_information
1209    
1210     * test/support.py (resource_dir): New function to return the
1211     "Resource" subdirectory
1212     (print_additional_summary): New function to combine several
1213     summary functions
1214     (run_tests): Use print_additional_summary instead of calling
1215     print_garbage_information directly
1216    
1217     2003-06-19 Bernhard Herzog <[email protected]>
1218    
1219 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
1220     the classification element.
1221     (projection): Add the "name" attribute
1222    
1223 frank 1242 2003-06-19 Frank Koormann <[email protected]>
1224    
1225     MERGE from the greater-ms3 branch.
1226    
1227     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1228     scale if projection is latlong to get better estimate.
1229    
1230     Fix problem of hidden properties dialog under windows after double
1231     click on layer tree:
1232     The tree control always gets an Expanded / Collapsed event after
1233     the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
1234     raises the already displayed window.
1235    
1236     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1237     raiseProperties initialized to prevent endless loops
1238     (LegendTree._OnItemActivated): Depending on self.raiseProperties
1239     simply raise the properties or open the dialog and issue a second
1240     event.
1241    
1242 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
1243    
1244 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
1245    
1246     2003-06-18 Jonathan Coles <[email protected]>
1247    
1248 jonathan 1235 When Thuban loaded the map was redrawn twice because the
1249     legend was being opened after the mainwindow was created
1250     and not during its creation. This meant the map was drawn
1251     initially and then had to be redrawn when the legend
1252     caused the display to change. Now the legend is opened
1253     in the mainwindow constructor which resolves this issue.
1254    
1255     Also, although we were checking for the existence of
1256     gdal and gdalwarp modules, the gdalwarp extension was
1257     still being compiled (which may fail if the system doesn't
1258     have gdal installed). the build_ext command to setup.py
1259     now accepts the flags --with-gdal and --without-gdal.
1260     If --without-gdal is specified setup.py will try to
1261     use the gdal parameters specified by gdal-config. Under
1262     windows, those parameters have to be set in setup.py
1263     as with proj4 an wxWindows.
1264    
1265     * setup.py: Use a list instead of seperate variables for
1266     extension parameters so we can create a generic function
1267     that runs an appropriate *-config script.
1268     (run_cs_script): Renamed from run_wx_script and modified
1269     to accept a second argument which is a list of lists to
1270     be filled in by the values returned from running the command.
1271     (thuban_build_ext): New. Extends the build_ext command and
1272     provides the options --with-gdal/--without-gdal which then
1273     optionally includes the gdalwarp extension.
1274    
1275     * Thuban/Model/resource.py: First check if we can import
1276     the gdalwarp Thuban extension before checking for gdal.
1277     Also added some comments.
1278    
1279     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
1280     the map is None which may be the case if none has been loaded
1281     yet.
1282    
1283     * Thuban/UI/main.py (main): Remove call to ShowLegend.
1284    
1285     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
1286    
1287     * Thuban/UI/renderer.py: Check for gdal support before importing
1288     gdalwarp.
1289     (MapRenderer.render_map): Only try to optimize if we have gdal
1290     support otherwise nothing will get drawn.
1291    
1292 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
1293     during startup before a map has been created. Check if map is None
1294     before using it and do nothing if it is.
1295    
1296 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
1297    
1298     Fix the problem with raster layers under Windows that caused
1299     Thuban to crash. The view should respond to layer projection
1300     changed events to update the display. Changes to a projection
1301     should not cause the map to be set to full extent.
1302    
1303     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1304     current_map_proj to remember the current map projection so that
1305     when the projection changes we know what the previous projection
1306     was.
1307     (MapCanvas.SetMap): Unsubscribe and subscribe to
1308     LAYER_PROJECTION_CHANGED events.
1309     (MapCanvas.projection_changed): Split into two methods that respond
1310     to map and layer projection changes.
1311     (MapCanvas.map_projection_changed): New. Takes the current view and
1312     projects it using the new projection. This does not cause the
1313     map to be redrawn at full extent.
1314     (MapCanvas.layer_projection_changed): New. Cause a redraw which
1315     will draw each layer in its new projection.
1316    
1317     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
1318     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
1319     under Windows.
1320    
1321     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
1322     to twice sizeof(void*) because there are two digits for each
1323     hex byte.
1324    
1325 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
1326    
1327     Update to the layer interface: Direct access to the table,
1328     shapetable, shapefile and filename attributes is now actively
1329     deprecated by issuing deprecation warnings for all places where
1330     this happens.
1331    
1332     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
1333     to the instance variables table, shapetable, shapefile and
1334     filename via __getattr__ so that we can issue a deprecation
1335     warning.
1336     (Layer.SetShapeStore): Don't set the deprecated instance variables
1337     any more
1338     (Layer.SetShapeStore): Don't use deprecated layer instance
1339     variables
1340     (Layer.Destroy): No need to explicitly remove the instance
1341     variables any more
1342     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
1343     instance variables
1344    
1345     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1346     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
1347     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
1348     use deprecated layer instance variables
1349    
1350     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
1351     deprecated layer instance variables
1352    
1353     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1354     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
1355     instance variables
1356    
1357     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
1358     deprecated layer instance variables
1359    
1360     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
1361     deprecated layer instance variables
1362    
1363     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
1364     deprecated layer instance variables
1365    
1366     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
1367     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
1368     variables
1369    
1370     * test/runtests.py (main): Turn Thuban's deprecation warnings into
1371     errors so that they're cought by the tests
1372    
1373     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
1374     layer instance variables
1375    
1376 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
1377    
1378     Fix a problem under Windows whereby if the user double-clicks on a
1379     layer in the legend that tree item will expand or collapse as well
1380     as open the layer properties dialog. The state of the tree item
1381     should not be affected.
1382    
1383     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
1384     preventExpandCollapse and subscribe to expanding and collapsing
1385     events.
1386     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
1387     collapsing events and will veto the event if it has been triggered
1388     by the user double clicking on a layer.
1389     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
1390     that an expanding/collapsing event should be vetoed.
1391    
1392 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
1393    
1394     * Thuban/UI/classifier.py (Classifier.OnClose)
1395     (Classifier.map_layers_removed)
1396     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
1397     in OnClose and not in map_layers_removed or
1398     layer_shapestore_replaced to make sure it always happens when the
1399     dialog is closed
1400    
1401 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
1402    
1403 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
1404     the background of the table view appears correctly.
1405    
1406     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
1407     object that can be used by derived classes to place any
1408     controls (including the grid) onto.
1409     (QueryTableFrame.__init__): Use the panel as the parent window
1410     for all the controls. Reparent the grid so that the panel is
1411     the parent. Call UpdateStatusText() to correctly initialize
1412     the status bar.
1413    
1414     2003-06-13 Jonathan Coles <[email protected]>
1415    
1416 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
1417     from wxFrame (as opposed to wxDialog like the other classes)
1418     but otherwise behaves like the other classes. This is needed
1419     for the TableView which isn't really a dialog and needs to
1420     have a status bar and control buttons.
1421    
1422     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
1423     instance variable to keep track of how many rows are selected.
1424     Subscribe once to the the events we are interested in.
1425     (ThubanGrid.OnRangeSelect): Only handle event if event handling
1426     hasn't been turned off.
1427     (ThubanGrid.OnSelectCell): Only handle event if event handling
1428     hasn't been turned off.
1429     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
1430     as an event listener (which changes the event handler stack)
1431     simply set an instance variable to False. This is checked in
1432     the event handlers.
1433     (ThubanGrid.GetNumberSelected): Return the number of currently
1434     selected rows.
1435     (TableFrame): Inherit from ThubanFrame so we can have a
1436     status bar and control buttons.
1437     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
1438     Explicitly set which items are selected in the operator choice and
1439     action choice so there is always a valid selection. Fixes RTbug #1941.
1440     Subscribe to grid cell selection events so we can update the
1441     status bar.
1442     (QueryTableFrame.UpdateStatusText): Update the status bar with
1443     how many rows are in the grid, how many columns, and how many
1444     rows are selected.
1445     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
1446     Call UpdateStatusText when cells are (de)selected.
1447     (QueryTableFrame.OnQuery): Use the string value in the value
1448     combo if either the selected item index is 0 or if the string
1449     cannot be found in the predefined list (this happens if the
1450     user changes the text). Fixes RTbug #1940.
1451     Only turn off the grid event listeners if there a query comes
1452     back with a none empty list of ids. in the case that the list
1453     is empty this causes a grid.ClearSelection() call to actually
1454     clear the grid selection which causes the selected items in
1455     the map to be deselected. Fixes RTbug #1939.
1456    
1457     * test/test_save.py (XMLWriterTest.Encode): Check return values.
1458     Fixes RTbug #1851.
1459    
1460 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
1461    
1462     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
1463     self.selected_shape with the current selection to make sure the
1464     contents of the dialog are up to date when it's shown for the
1465     first time.
1466     The dialog used to work without this by luck. The recent fix to
1467     the connector module 'broke' a 'feature' the identify view was
1468     relying on, i.e that subscribing to a message in response to
1469     receiving a message of that type would mean that the new
1470     subscriber would also be called for the same message.
1471    
1472 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
1473 jonathan 1175
1474 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
1475     the image is rendered. Fixes RTbug #1937.
1476    
1477     2003-06-12 Jonathan Coles <[email protected]>
1478    
1479 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
1480 jonathan 1193 user directory if it doesn't exist on a posix system.
1481     Fixes RTbug #1815.
1482 jonathan 1191
1483     * Thuban/Model/resource.py (get_user_proj_files): Moved the
1484     called to get_application_dir here, so that the directory
1485     will only be called if this method is invoked.
1486    
1487     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
1488     the projfilepath if no projection is selected.
1489    
1490     2003-06-12 Jonathan Coles <[email protected]>
1491    
1492 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
1493     the scalebar if the current map has no projection set.
1494    
1495     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
1496     projfilepath label to just the basename of the projection file
1497     rather than include the entire path.
1498    
1499     * Thuban/Model/resource.py: Fix missed proj functions that
1500     needed to be renamed.
1501    
1502     2003-06-12 Jonathan Coles <[email protected]>
1503    
1504 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
1505     tested if the variable was an instance of Color.
1506    
1507     * Thuban/Model/color.py (Color): Remove commented code that isn't
1508     used.
1509     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
1510     Fixes RTbug #1835.
1511     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
1512     Needed now that the class doesn't inherit from Color.
1513    
1514     2003-06-12 Jonathan Coles <[email protected]>
1515    
1516 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
1517     check unicode strings.
1518    
1519     * test/test_layer.py: Check for existence of gdal.
1520    
1521     2003-06-12 Jonathan Coles <[email protected]>
1522 jonathan 1172
1523     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
1524     that was in load.py
1525 jonathan 1169
1526 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
1527     that was in save.py
1528    
1529     2003-06-12 Jonathan Coles <[email protected]>
1530    
1531 jonathan 1169 This is largely a collection of bug fixes. We also handle the
1532     case where gdal is not on the system. The XMLReader and XMLWriter
1533     classes were moved into there own files to resolve some circular
1534     import references and because they shouldn't really be in the
1535     file that is dediciated to reading/writing session files since
1536     they are also used elsewhere.
1537    
1538     * Thuban/Model/classgen.py: Renamed functions to follow the
1539     function_names_with_underscores style. Fixes RTbug #1903.
1540     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1541    
1542     * Thuban/Model/layer.py: Import gdal only if it available.
1543     (RasterLayer): Handle the case where the gdal library is unavailable.
1544     Addresses RTbug #1877.
1545    
1546     * Thuban/Model/load.py (XMLReader): Moved into seperate file
1547     xmlreader.py.
1548    
1549 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
1550    
1551     This is largely a collection of bug fixes. We also handle the
1552     case where gdal is not on the system. The XMLReader and XMLWriter
1553     classes were moved into there own files to resolve some circular
1554     import references and because they shouldn't really be in the
1555     file that is dediciated to reading/writing session files since
1556     they are also used elsewhere.
1557    
1558     * Thuban/Model/classgen.py: Renamed functions to follow the
1559     function_names_with_underscores style. Fixes RTbug #1903.
1560     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1561    
1562     * Thuban/Model/layer.py: Import gdal only if it available.
1563     (RasterLayer): Handle the case where the gdal library is unavailable.
1564     Addresses RTbug #1877.
1565    
1566     * Thuban/Model/load.py (XMLReader): Moved into seperate file
1567     xmlreader.py.
1568    
1569 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
1570     file xmlwriter.py.
1571    
1572     * Thuban/Model/resource.py: Renamed functions to following the
1573     function_names_with_underscores style.
1574     (has_gdal_support): New function that returns true if the gdal
1575     library is available. Addresses RTbug #1877.
1576    
1577     * Thuban/UI/application.py (ThubanApplication.OpenSession):
1578     Display a message box if the gdal library is not available, but
1579     only if there are any layers that would use it. Addresses RTbug #1877.
1580    
1581     * Thuban/UI/classgen.py: Use renamed projection resource functions.
1582     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
1583     when using integers versus floats.
1584    
1585     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
1586     determine if the "Add Image Layer" menu option should be
1587     greyed out or not. Addresses RTbug #1877.
1588    
1589     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
1590    
1591     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
1592     optimize if a raster layer is visible. Fixes RTbug #1931.
1593     Only draw the raster layer if the gdal library is available.
1594     Addresses RTbug #1877.
1595    
1596     * test/test_classgen.py: Add tests for generate_singletons,
1597     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
1598     (test_calculate_quantiles): Fix some tests to catch the new
1599     ValueError that is raised.
1600    
1601     * test/test_proj.py: Use renamed projection resource functions.
1602    
1603     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
1604     test for saving classified layers. Fixes RTbug #1902.
1605     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
1606    
1607 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
1608    
1609     Fix for http://intevation.de/rt/webrt?serial_num=1900.
1610    
1611     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
1612    
1613     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
1614     multiplechoicedialog.py rather than from the wxPython library.
1615    
1616 frank 1151 2003-06-11 Frank Koormann <[email protected]>
1617    
1618 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1619     update.
1620    
1621     2003-06-11 Frank Koormann <[email protected]>
1622    
1623 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
1624     determine the absolute .thuban/thuban directory under
1625     "posix" (os.expanduser) and "nt" (read AppData registry key).
1626    
1627     * Thuban/Model/resource.py: Use get_application_dir
1628    
1629     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1630     Use get_application_dir.
1631    
1632 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
1633    
1634 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
1635     the messages MAP_LAYERS_REMOVED messages
1636     (LayerTableFrame.OnClose): Unsubscribe from it.
1637     (LayerTableFrame.map_layers_removed): New. Receiver for
1638     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
1639     dialog is showing is removed.
1640    
1641     2003-06-10 Bernhard Herzog <[email protected]>
1642    
1643 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
1644     of the receivers list so that unsubscribing in a receiver doesn't
1645     modify it while iterating over it.
1646    
1647     * test/test_connector.py
1648     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
1649     unsubscribing in a receiver works correctly. See docstring for
1650     details
1651    
1652     2003-06-10 Bernhard Herzog <[email protected]>
1653    
1654 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
1655     message.
1656    
1657     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1658     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1659     LAYER_CHANGED will still be sent if the classification changes.
1660    
1661     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1662     parameter so we can subscribe to some of its messages
1663     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1664     and the layer's LAYER_SHAPESTORE_REPLACED
1665     (Classifier.unsubscribe_messages): New. Unsubscribe from message
1666     subscribed to in __init__
1667     (Classifier.map_layers_removed)
1668     (Classifier.layer_shapestore_replaced): receivers for the messages
1669     subscribed to in __init__. Unsubscribe and close the dialog
1670    
1671     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1672     the map to the Classifier dialog
1673    
1674     * test/test_layer.py (SetShapeStoreTests): Derive from
1675     SubscriberMixin as well so we can test messages
1676     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
1677     messages
1678     (SetShapeStoreTests.tearDown): Clear the messages again
1679     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
1680     for the modified flag too
1681     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
1682     to check whether SetShapeStore sets the modified flag
1683     (SetShapeStoreTests.test_set_shape_store_different_field_name)
1684     (SetShapeStoreTests.test_set_shape_store_same_field)
1685     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
1686     Add tests for the messages. This checks both the new
1687     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
1688    
1689 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
1690    
1691     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
1692     the menu items.
1693    
1694 frank 1134 2003-06-05 Frank Koormann <[email protected]>
1695    
1696 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
1697     Layout reimplemented without panel. Make life easier to fit the list
1698     in the dialog.
1699    
1700     2003-06-05 Frank Koormann <[email protected]>
1701    
1702 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
1703     once on initialisation (Former implementation resulted in multiple
1704     entries for each projection).
1705     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
1706     if set, select the projection found under the specified name. This
1707     overwrites any other selection estimate.
1708     Removed projchoice filling from this method.
1709     (ProjFrame._OnSave, ProjFrame._OnAddToList):
1710     Updated call of ProjFrame.__FillAvailList
1711     (LCCPanel._DoLayout): Moved parameter controls in more common order.
1712    
1713     * Resources/Projections/defaults.proj: Extended defaults representing
1714     various common European projections.
1715    
1716     2003-06-05 Frank Koormann <[email protected]>
1717    
1718 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
1719     Use ListCtrl instead of GridCtrl
1720    
1721     * Thuban/Model/resource.py:
1722     Guess location of .thuban directory from tempdir parent directory.
1723    
1724     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1725     Guess location of .thuban directory from tempdir parent directory.
1726    
1727 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
1728    
1729     Do not cache the values returned by the tree widget's
1730     GetFirstChild and GetNextChild methods because it led to lots of
1731     segfaults. The new way requires more brute force but is more
1732     reliable.
1733    
1734     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
1735     variable layer2id
1736     (LegendTree.find_layer): New method to do with brute force what
1737     layer2id tried to accomplish
1738     (LegendTree._OnMsgLayerChanged)
1739     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
1740     Use find_layer instead of layer2id
1741     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
1742     update layer2id anymore
1743     (LegendTree._OnMsgMapLayersRemoved)
1744     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
1745    
1746 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
1747    
1748     * Thuban/Model/classgen.py (GenQuantiles0): New function.
1749    
1750 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
1751    
1752 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
1753     New commands.
1754     (main_menu): Add the new commands.
1755     (MainWindow.TableRename): New. Implementation of the table_rename
1756     command.
1757     (MainWindow.RenameLayer): New. Implementation of the layer_rename
1758     command.
1759    
1760     * Thuban/Model/session.py (Session.AddTable): call self.changed to
1761     set the modified flag
1762    
1763     * test/test_session.py (TestSessionSimple.test_add_table): Test
1764     whether the modified flag is set properly
1765    
1766     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
1767     instead of issue so that the modified flags get updated.
1768    
1769     * test/test_base.py (SomeTitledObject): Derive from Modifiable
1770     instead of Publisher to reflect reality better and to accomodate
1771     the fact that SetTitle now calls changed instead of issue
1772    
1773     2003-06-02 Bernhard Herzog <[email protected]>
1774    
1775     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
1776     acquisition has to happen before the try in a try-finally.
1777    
1778     2003-06-02 Bernhard Herzog <[email protected]>
1779    
1780 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
1781     possible that a layer is removed that is not currently selected in
1782     the legend so don't check for this.
1783    
1784 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
1785    
1786 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
1787     variables to None that have direct or indirect references to
1788     shapefiles or dbf files to make sure that they do go away and the
1789     files are closed.
1790    
1791     2003-05-30 Bernhard Herzog <[email protected]>
1792    
1793 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
1794     availImgListIndices when a new image list is created
1795    
1796     2003-05-30 Bernhard Herzog <[email protected]>
1797    
1798 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
1799     changing_selection to indicate whether the LegendTree code itself
1800     is currently changing the selection
1801     (LegendTree.normalize_selection): New method to normalize the
1802     selection by selecting the layer item even if the user clicked on
1803     the classification.
1804     (LegendTree._OnSelChanged): normalize the selection. This works
1805     around a bug in wx which doesn't keep track of the selection
1806     properly when subtrees are deleted.
1807    
1808     2003-05-30 Bernhard Herzog <[email protected]>
1809    
1810 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
1811     maximum and minimum scale factors.
1812    
1813     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
1814     changes in classgen.py
1815    
1816 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
1817    
1818     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
1819     all the methods functions. Fixes RTBug #1903.
1820    
1821     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
1822     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
1823     RTBug #1907.
1824    
1825     * Thuban/UI/classgen.py: Use classgen functions that were part
1826     of the ClassGenerator class. Put try/finally blocks around
1827     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
1828     RTBug #1904.
1829    
1830     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
1831    
1832     * Thuban/UI/legend.py: The legend was cleared and repopulated any
1833     time something changed which caused some state to be lost such
1834     as which children were expanded or collapsed. Fixes RTBug #1901.
1835     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
1836     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
1837     the legend but not in the map.
1838     (LegendTree.__FillTree): Move main functionality out into smaller
1839     methods that can be used by other methods.
1840     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
1841     if they are available.
1842     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
1843     that we override the wxTreeCtrl method. Iterate over children
1844     and call __RemoveLayer.
1845     (LegendTree.__AddLayer): New. Add a new layer to the legend.
1846     (LegendTree.__RemoveLayer): Remove a layer from the legend.
1847     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1848     Should only be called with the id of a layer branch.
1849     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1850     Returns the root item or creates one if necessary.
1851    
1852     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1853     ProjectRasterFile with tuple arguments instead of strings.
1854    
1855     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1856     with try/finally. Fixes RTBug #1904.
1857    
1858     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1859     with try/finally. Fixes RTBug #1904.
1860     (MapCanvas.FitSelectedToWindow): If a single point is selected
1861     simply center it on the display. Fixes RTBug #1849.
1862    
1863     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1864     to be compiled as a standalone app. Now the code can only be
1865     called from Python which simplifies the parameter passing.
1866     (ProjectRasterFile): Handle Python arguments. Remove code that
1867     checks for a destination dataset. Add more clean up code.
1868    
1869     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1870     TestMapWithContents.test_lower_layer_bottom):
1871     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1872     Fixes RTBug #1907.
1873    
1874     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1875     extent to the map when the legend is toggled. Fixes RTBug #1881.
1876    
1877 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
1878    
1879     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1880     unsubscribes all that is subcribed in __init__.
1881    
1882 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
1883    
1884 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1885     (MainWindow.CanDuplicateLayer): New methods to implement the
1886     Layer/Duplicate command.
1887     (layer_duplicate command): New.
1888     (main_menu): Add layer_duplicate to the Layer menu.
1889    
1890     2003-05-28 Bernhard Herzog <[email protected]>
1891    
1892 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
1893     renderer so that NULL/None values get displayed differently (by a
1894     gray rectangle).
1895     (TableGrid.__init__): Override the default renderers
1896    
1897     2003-05-28 Bernhard Herzog <[email protected]>
1898    
1899 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
1900     classification to "None" if the type of the field has changed.
1901    
1902     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
1903     test for the Layer.SetShapeStore method
1904    
1905 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
1906 jan 1085
1907 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
1908     does not necessarily have a filename).
1909    
1910     2003-05-28 Jan-Oliver Wagner <[email protected]>
1911    
1912 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1913     sort the selection list for the dialog.
1914    
1915 frank 1083 2003-05-28 Frank Koormann <[email protected]>
1916    
1917     * extensions/thuban/wxproj.cpp
1918     (project_point): Removed cast to int for projected point coordinates.
1919     (shape_centroid): Return last point if all polygon vertices fall
1920     to one point.
1921    
1922 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
1923    
1924 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
1925     with layers that don't have shapestores, i.e. raster layers.
1926    
1927     2003-05-28 Bernhard Herzog <[email protected]>
1928    
1929 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
1930     when determining the title from the filename.
1931    
1932     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
1933     reflect changes in the way the title is derived from the filename
1934    
1935 frank 1077 2003-05-28 Frank Koormann <[email protected]>
1936    
1937     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
1938     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
1939    
1940 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
1941    
1942 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
1943     delegate SelectedLayer.
1944     (MainWindow.LayerUnjoinTable): Implement.
1945     (_can_unjoin): New. Helper function for the sensitivity of the
1946     layer/unjoin command.
1947    
1948     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
1949     (DerivedShapeStore.OrigShapeStore): New. Return the original
1950     shapestore. Used to figure out how to unjoin.
1951     (DerivedShapeStore.Shapefile): Fix a typo.
1952    
1953     2003-05-27 Bernhard Herzog <[email protected]>
1954    
1955 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
1956     well
1957     (JoinDialog.__init__): Use the layer parameter and only build the
1958     left choice when a layer is given
1959     (JoinDialog.OnJoin): Handle layer joins as well
1960     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1961     that the user selects the "Select..." item. The sensitivitly
1962     updating is now in update_sensitivity
1963     (JoinDialog.y): New method to refactor the sensitivity update of
1964     the join button into its own method.
1965    
1966     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1967    
1968     2003-05-27 Bernhard Herzog <[email protected]>
1969    
1970 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1971     iff there are unreferenced tables in the session
1972    
1973     2003-05-27 Bernhard Herzog <[email protected]>
1974    
1975 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1976    
1977     * Thuban/Model/session.py (Session.UnreferencedTables): New method
1978     to return tables that are not referenced by other tables or shape
1979     stores and can be removed.
1980     (Session.RemoveTable): Issue a TABLE_REMOVED message after
1981     removing the table
1982    
1983     * Thuban/UI/mainwindow.py: Remove unused imports
1984     (MainWindow.TableClose): Implement.
1985    
1986     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1987     messages so that the frame will be automatically closed when a new
1988     session is opened or the table is removed.
1989     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1990     __init__
1991     (TableFrame.close_on_session_replaced)
1992     (TableFrame.close_on_table_removed): New. Subscribers that close
1993     the window
1994    
1995     * test/test_session.py (TestSessionMessages.test_remove_table)
1996     (TestSessionSimple.test_remove_table): Move the test to
1997     TestSessionSimple and add test for the TABLE_REMOVED message
1998     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1999     (TestSessionSimple.test_unreferenced_tables) New. Test for the
2000     UnreferencedTables method.
2001     (UnreferencedTablesTests): New. Class with some more sophisticated
2002     tests for UnreferencedTables.
2003    
2004 frank 1065 2003-05-27 Frank Koormann <[email protected]>
2005    
2006 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2007     display has some unwanted side effects. Removed again.
2008    
2009     2003-05-27 Frank Koormann <[email protected]>
2010    
2011 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2012    
2013     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2014    
2015 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
2016    
2017 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
2018     Menu.RemoveItem().
2019 jan 1062
2020 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2021     the menu.
2022 jan 1062
2023 frank 1059 2003-05-27 Frank Koormann <[email protected]>
2024    
2025     Nonmodal dialogs without parent (i.e. they can fall behind the main
2026     window)
2027    
2028     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2029     all dialogs in the dialogs dictionary and the canvas.
2030    
2031     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2032     parent, i.e. can fall behind other windows.
2033     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2034     dictionary before removing it.
2035    
2036     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2037    
2038     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2039     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2040     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2041    
2042 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
2043    
2044 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2045     tableview dialog
2046     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2047     Also, don't use the table's titles as the dialog names. The titles
2048     aren't guaranteed to be unique.
2049     (MainWindow.TableOpen): Open a table view dialog after opening the
2050     table
2051    
2052     2003-05-27 Bernhard Herzog <[email protected]>
2053    
2054 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2055     effect can be achieved by simply closing the window showing the
2056     table.
2057     (MainWindow.TableHide): Removed.
2058     (main_menu): Removed "table_hide"
2059    
2060 frank 1051 2003-05-27 Frank Koormann <[email protected]>
2061    
2062     Fix legend tree display problems under Win32
2063    
2064     * Thuban/UI/legend.py: BMP_SIZE_W = 15
2065     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2066     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2067    
2068     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2069    
2070 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
2071    
2072     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2073     'after' now allows to insert separators almost anywhere in the menu.
2074    
2075 frank 1046 2003-05-27 Frank Koormann <[email protected]>
2076    
2077     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2078     "S" of selection box label to hint on hot key (Alt-S). Works under
2079     Win32 but is ignored under GTK.
2080    
2081     2003-05-26 Frank Koormann <[email protected]>
2082    
2083     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2084     Center Choices.
2085    
2086 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
2087    
2088 bh 1044 Remove the Precision methods again. They're too DBF specific to be
2089     part of the table interface and they're only used in table_to_dbf
2090     anyway.
2091    
2092     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2093     fixed precision of 12 for doubles.
2094     (TransientTableBase.Precision): Removed
2095     (AutoTransientTable.Width): Delegate to self.table.
2096    
2097     * Thuban/Model/table.py (DBFTable.Precision)
2098     (MemoryTable.Precision): Removed.
2099     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2100     (table_to_dbf): Use a fixed precision of 12 for floats unless the
2101     column object specifies something else.
2102    
2103     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2104     test for table_to_dbf
2105    
2106     2003-05-26 Bernhard Herzog <[email protected]>
2107    
2108     * test/test_transientdb.py
2109     (TestTransientTable.run_iceland_political_tests): Fix a comment.
2110    
2111     2003-05-26 Bernhard Herzog <[email protected]>
2112    
2113 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2114     implementation. Mark parts of the file format strings for
2115     localization.
2116    
2117     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2118     file and add the table to the tables managed by the session
2119    
2120 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
2121     New. test case for OpenTableFile
2122    
2123 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
2124    
2125 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2126     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2127     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2128     Replace the true/false of wxWindows by True/False of Python 2.2.1.
2129    
2130     2003-05-26 Jan-Oliver Wagner <[email protected]>
2131    
2132 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2133     already a selection present, update the grid accordingly.
2134 jan 1033
2135     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2136     resizeable and increase its initial size.
2137    
2138 frank 1030 2003-05-26 Frank Koormann <[email protected]>
2139    
2140     Table export functionality
2141    
2142     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2143     Return width (in characters) for a column.
2144     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2145     (table_to_dbf): Write table to dbf file.
2146     (table_to_csv): Write table to csv file.
2147    
2148     * Thuban/Model/transientdb.py (TransientTableBase.Width,
2149     TransientTableBase.Precision): Return column width and precision.
2150    
2151     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2152     or table_to_csv depending on file selection.
2153    
2154     * test/test_dbf_table.py:
2155     Test table_to_dbf (extension of former part of test).
2156    
2157     * test/test_csv_table.py:
2158     Test table_to_csv.
2159    
2160 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
2161    
2162 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2163     Use QueryTableFrame instead of TableFrame.
2164 jan 1021
2165 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2166     table window with 'Layer Table:' instead of 'Table:'.
2167    
2168     2003-05-23 Jan-Oliver Wagner <[email protected]>
2169    
2170     Give all tables a title via mix-in TitledObject.LayerShowTable
2171    
2172 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2173     only if it exists.
2174    
2175     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2176     and call its init-method with a default title. Remove Title() method.
2177    
2178     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2179     AutoTransientTable): mix-in TitledObject and call its init-method with
2180     a default title. Remove Title() method.
2181    
2182 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
2183    
2184     * Thuban/Model/session.py (Session.AddShapeStore): Define
2185     AddShapeStore analogously to AddTable.
2186    
2187     * test/test_session.py (TestSessionSimple.test_add_shapestore):
2188     New. Test for AddShapeStore
2189    
2190 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
2191    
2192     Introducing QueryTableFrame and a very coarse ShowTable implementation.
2193    
2194     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2195     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2196     The latter implements the selection GUI without dependency on a layer.
2197     LayerTableFrame now is derived from QueryTableFrame and connects
2198     to a layer.
2199    
2200     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2201     implementation that still needs work.
2202    
2203     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2204    
2205 frank 1011 2003-05-22 Frank Koormann <[email protected]>
2206    
2207     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2208     Added "outer_join = False" as optional parameter.
2209     (TransientJoinedTable.create): If outer join is true, perform a
2210     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2211     the left table. Records not matching are filled with 0 / None.
2212    
2213     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2214     (JoinDialog.OnJoin): Consider outer join check box.
2215    
2216 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
2217    
2218 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2219     somewhat safer way. Storing the traceback in a local variable can
2220     lead to memory leaks
2221    
2222     2003-05-22 Bernhard Herzog <[email protected]>
2223    
2224 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2225     the wxMessageDialog's Destroy() method.
2226    
2227 frank 1004 2003-05-22 Frank Koormann <[email protected]>
2228    
2229     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2230     TransientTable.Title()
2231    
2232     2003-05-22 Frank Koormann <[email protected]>
2233    
2234     Join Dialog, initial version.
2235    
2236     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2237    
2238     * Thuban/UI/join.py (JoinDialog): Functional implementation of
2239     former framework. Renamed Table1/Table2 to LeftTable/RightTable
2240     in all occurences.
2241    
2242     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2243     Typo fixed.
2244    
2245 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
2246    
2247 bh 999 Give the tables titles so that the GUI can display more meaningful
2248     names. For now the titles are fixed but depend on e.g. filenames
2249     or the titles of the joined tables.
2250    
2251     * Thuban/Model/transientdb.py (TransientTable.Title)
2252     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2253    
2254     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2255    
2256     * test/test_transientdb.py
2257     (TestTransientTable.test_auto_transient_table_title): New. Test
2258     for the Title method
2259     (TestTransientTable.test_transient_joined_table)
2260     (TestTransientTable.test_transient_table): Add test for the Title
2261     methods
2262    
2263     * test/test_memory_table.py (TestMemoryTable.test_title): New.
2264     Test for the Title method
2265    
2266     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
2267     the Title method
2268    
2269     2003-05-22 Bernhard Herzog <[email protected]>
2270    
2271 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2272     Provide a better way to destroy the layers
2273     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
2274     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2275     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
2276     the new way to destroy the layers.
2277     (TestLayer.test_derived_store): New. Test for using a layer with a
2278     DerivedShapeStore
2279    
2280     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
2281     filename if the shape store actually has one.
2282    
2283     2003-05-22 Bernhard Herzog <[email protected]>
2284    
2285 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
2286     for the filename
2287    
2288     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
2289     for the FileName method
2290     (TestDBFTableWriting.test_write): Fix spelling of filename
2291    
2292 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
2293    
2294     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
2295     from SciParam that now really is immutable.
2296    
2297 frank 992 2003-05-22 Frank Koormann <[email protected]>
2298    
2299     Layer Top/Bottom placement added to legend.
2300    
2301     * Thuban/UI/legend.py
2302     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
2303     bound to tool events.
2304     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
2305     New, methods binding the event methods with the map methods.
2306    
2307     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
2308     layer at top/bottom of layer stack.
2309    
2310     * Resources/Bitmaps/top_layer.xpm: New button icon.
2311    
2312     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
2313    
2314 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
2315    
2316     * Thuban/Model/session.py (Session.RemoveTable): New method to
2317     remove tables
2318    
2319     * test/test_session.py (TestSessionSimple.test_remove_table): New.
2320     Test for RemoveTable
2321    
2322 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
2323    
2324     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
2325     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2326    
2327 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
2328    
2329 bh 985 Implement a way to discover dependencies between tables and
2330     shapestores.
2331    
2332     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
2333     (TransientJoinedTable.Dependencies)
2334     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
2335     interface
2336     (TransientJoinedTable.__init__): Keep tack of the original table
2337     objects in addition to the corresponding transient tables.
2338    
2339     * Thuban/Model/table.py (DBFTable.Dependencies)
2340     (MemoryTable.Dependencies): New. Implement the dependencies
2341     interface
2342    
2343     * Thuban/Model/data.py (ShapeTable): New. Helper class for
2344     ShapefileStore
2345     (ShapefileStore.__init__): Use ShapeTable instead of
2346     AutoTransientTable
2347     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
2348     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
2349     methods for filename and type
2350     (ShapefileStore.Dependencies): New. Implement the dependencies
2351     interface
2352     (DerivedShapeStore): New class to replace SimpleStore. The main
2353     difference to SimpleStore is that it depends not on a shapefile
2354     but another shapestore which expresses the dependencies a bit
2355     better
2356     (SimpleStore.__init__): Add deprecation warning.
2357    
2358     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
2359     Test for the Dependencies method.
2360    
2361     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
2362     New. Test for the Dependencies method.
2363    
2364     * test/test_transientdb.py
2365     (TestTransientTable.test_auto_transient_table_dependencies): New.
2366     Test for the Dependencies method.
2367     (TestTransientTable.test_transient_joined_table): Add test for the
2368     Dependencies method.
2369    
2370     * test/test_session.py (TestSessionSimple.setUp)
2371     (TestSessionSimple.tearDown): New. Implement a better way to
2372     destroy the sessions.
2373     (TestSessionSimple.test_initial_state)
2374     (TestSessionSimple.test_add_table): Bind session to self.session
2375     so that it's destroyed by tearDown
2376     (TestSessionSimple.test_open_shapefile): New. Test for
2377     OpenShapefile and the object it returns
2378    
2379     2003-05-22 Bernhard Herzog <[email protected]>
2380    
2381 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
2382     register tables with the session.
2383     (Session.Tables): Return the tables registered with AddTable too.
2384    
2385     * test/test_session.py (TestSessionSimple.test_add_table): New.
2386     Test case for the AddTable method
2387    
2388 frank 981 2003-05-22 Frank Koormann <[email protected]>
2389    
2390     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
2391     lower right corner, center labels for selections, initialize controls
2392     in reasonable order for keyboard navigation.
2393    
2394     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
2395     (ProjFrame.__DoOnProjAvail): Determine position of current projection
2396     using the wxListBox.FindString() method. Still a problem (#1886)
2397    
2398     * Thuban/UI/classifier.py
2399     (Classifier.__init__, SelectPropertiesDialog.__init__)
2400    
2401     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
2402     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
2403     different classification types from here to __init__.
2404     (GenUniquePanel.__init__): Set the column width of the first field
2405     in the Field ListCtrl to the full width.
2406    
2407     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
2408     Button to 'Export'. Center Buttons in Selection Box, set Focus to
2409     Grid.
2410     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
2411     changes focus to the Selection when pressing "Alt-S".
2412    
2413     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
2414     the text if not visible. The italic font sometimes exceeds the
2415     rendering area.
2416    
2417 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
2418 jonathan 971
2419 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
2420     to OnClose so that Thuban closes correctly.
2421    
2422     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
2423     DockFrame.OnClose, not DockFrame._OnClose.
2424    
2425     2003-05-21 Jonathan Coles <[email protected]>
2426    
2427 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
2428     references to 'inf' and use new Range __init__ to pass floats
2429     directly rather than converting them to strings first.
2430     Fixes RTBug #1876.
2431    
2432     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
2433     Use new Range ___init__ to pass floats.
2434    
2435     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
2436     filename is a valid image file. Throw IOError otherwise.
2437    
2438     * Thuban/Model/range.py: Brought over new Range from SciParam that
2439     is immutable and has an __init__ which can accept floats.
2440    
2441     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
2442     into try block. AddLayer doesn't throw any exceptions anymore.
2443     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
2444     try block.
2445    
2446     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
2447     the first item in choices. Fixes RTBug #1882.
2448    
2449     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
2450     has gone to 0 which is a serious problem. abort.
2451     (MapRenderer.draw_raster_layer): Catch IOError seperately and
2452     print the error from GDAL.
2453    
2454     * Thuban/UI/tableview.py (TableGrid.__init__): Call
2455     ToggleEventListeners to turn on listening.
2456     (TableGrid.ToggleEventListeners): New. Turns event listening on
2457     and off so as to prevent excessive messages.
2458     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
2459     to suppress excessive messages when selecting many rows.
2460     Fixes RTBug #1880.
2461    
2462     * Thuban/UI/view.py: Added checks against if scale == 0. This
2463     is a serious problem that can occur when an image without
2464     geo data is loading and causes the map projection bounds to
2465     go to infinity. Right now, the solution is to simply try
2466     to recover.
2467    
2468     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
2469     to set the MFILEReceiver attributes even if the data is NULL.
2470    
2471     * extensions/thuban/gdalwarp.cpp: Improved the error handling
2472     and passed GDAL messages back up to the Python layer. Also
2473     tried to fix some memory leaks that were present in the original
2474     utility but didn't matter because the program aborted.
2475    
2476     * test/test_range.py: Copied over tests from SciParam. Removed
2477     tests against importing. Fixes RTBug #1867.
2478    
2479 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
2480    
2481     * test/test_load.py: Remove unused imports and restructure the
2482     test code
2483     (LoadSessionTest): Split into one class for each test and turn
2484     LoadSessionTest itself into the base class for all such session
2485     tests.
2486     (ClassificationTest): New base class for load tests that test
2487     classifications
2488     (TestSingleLayer, TestLayerVisibility, TestClassification)
2489     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
2490     for the individual tests
2491    
2492     * test/support.py (FileLoadTestCase.filename): New base class for
2493     file loading tests
2494    
2495 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
2496    
2497     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
2498     Mercator' to 'UTM Zone 32' as a more convenient example.
2499     Added 'Gauss Krueger Zone 6'.
2500    
2501     * Data/iceland_sample_raster.thuban: political polygon now
2502     filled transparent to have the raster image visible at once.
2503    
2504 frank 952 2003-05-21 Frank Koormann <[email protected]>
2505    
2506     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
2507     OnClose() to keep in sync with extensions. Internally Thuban
2508     still uses "underscored" names.
2509    
2510 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
2511    
2512     This puts back Raster layer support. These layers support projections
2513     through the GDAL library. Currently, the CVS version is being used.
2514     There are no Debian packages available although this may change soon.
2515     A GDAL driver was extended to support writing to memory rather to
2516     files.
2517    
2518     There is still some work that needs to be done, such as some error
2519     handling when loading invalid images or when there is a problem
2520     projecting the image. This putback simply checks in the majority
2521     of the work.
2522    
2523     * setup.py: Add gdalwarp library extension.
2524    
2525     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
2526     Defaults to False, but can be overridden by subclasses if they
2527     support classification.
2528     (RasterLayer): New. Defines a new layer that represents an
2529     image.
2530    
2531     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
2532     tag handler.
2533     (SessionLoader.start_layer): Encode the filename.
2534     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
2535     New. Supports reading a rasterlayer tag.
2536    
2537     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
2538    
2539     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
2540     get a string in Latin1. If we get such as string convert it to
2541     unicode first, otherwise leave if alone before encoding.
2542     (SessionSaver.write_layer): Add support for writing both Layers
2543     and RasterLayers.
2544    
2545     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2546     The right argument may not be a string, it could also be a Column.
2547    
2548     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
2549     Make initial window size 600x400. Fixes RTBug #1872.
2550    
2551     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
2552     the dialog is constructed so that we can support layers that
2553     do not have classifications.
2554     (Classifier._OnTry): Only build a classification if the layer
2555     supports one.
2556    
2557     * Thuban/UI/legend.py: Change all checks that a layer is an
2558     instance of Layer into checks against BaseLayer.
2559     (LegendTree.__FillTreeLayer): Only add children to a branch if
2560     the layer supports classification.
2561    
2562     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
2563     MainWindow.OpenSession): Don't proceed with an action if the
2564     user chooses Cancel when they are asked to save changes.
2565     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
2566     user to select an image file. Create a new RasterLayer and add
2567     it to the map.
2568    
2569     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
2570     for rendering RasterLayer layers.
2571     (MapRenderer.draw_raster_layer): Actually method that calls
2572     the GDALWarp python wrapper and constructs an image from the
2573     data returned.
2574    
2575     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
2576     Choices symbols to match those used in the table query method.
2577     Replace deprecated method calls on table with new method names.
2578    
2579     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
2580     how small the scale can get. This still needs more testing.
2581    
2582     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
2583     Provides a driver to output in .bmp format.
2584    
2585     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
2586     New. Provides IO routines which write to memory, rather than a file.
2587    
2588     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
2589     of the gdalwarp utility provided in GDAL. Added function calls
2590     that can be accessed from python.
2591    
2592     * Data/iceland_sample_raster.thuban: New. Sample file that uses
2593     a raster layer.
2594    
2595     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
2596     layer image data.
2597    
2598     * Doc/thuban.dtd: Added rasterlayer attribute definition.
2599    
2600     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
2601     tests associated with the raster layer code.
2602    
2603     * test/test_transientdb.py
2604     (TestTransientTable.test_auto_transient_table_query): Added a test
2605     for using a Column object as the "right" parameter to a query.
2606    
2607 frank 924 2003-05-19 Frank Koormann <[email protected]>
2608    
2609 frank 927 * Thuban/version.py (get_changelog_date):
2610     Catch exceptions if ChangeLog does not exist.
2611    
2612     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
2613    
2614     2003-05-19 Frank Koormann <[email protected]>
2615    
2616 frank 924 Extended version information for Thuban
2617    
2618     * Thuban/version.py: New, version information for Thuban: Last
2619     modification date and last ChangeLog entry date.
2620    
2621     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
2622     information: Display Thuban, wxPython and Python version.
2623    
2624 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
2625    
2626 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
2627     __future__ import for nested_scopes as Thuban relies on Python 2.2
2628     now.
2629     (XMLWriter.encode): Remove the special case for a None argument.
2630     In the saver encode is always called with a string argument.
2631    
2632     2003-05-16 Bernhard Herzog <[email protected]>
2633    
2634 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
2635     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
2636     of the bug was that e.g. float("1.2") would fail. Thuban now
2637     requires 2.4.x.
2638    
2639 frank 917 2003-05-16 Frank Koormann <[email protected]>
2640    
2641     Printing enhancement and WMF export (under Win32)
2642    
2643     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
2644     ScreenRenderer. Renders Map, Legend and Scalebar for export.
2645     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
2646     PrintRender.
2647    
2648     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
2649     to fullfil information needed for PrinterRenderer.
2650     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
2651     (MapCanvas.Print): Adapted to new MapPrintout.
2652     (OutputTransform): General calculations to transform from canvas
2653     coordinates to export/printing devices.
2654    
2655     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
2656     new method_command to call ExportMap, with platform dependency (only
2657     __WXMSW__)
2658    
2659     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2660     of scalebar drawing area as new parameters.
2661    
2662     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2663    
2664     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2665     Update to extended scalebar.DrawScalebar header.
2666    
2667     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2668    
2669     * test/test_scalebar.py: Made test executable as standalone.
2670    
2671 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
2672    
2673     * Thuban/Model/table.py (Table): Remove this compatibility alias
2674     for DBFTable.
2675    
2676     * test/test_table.py: Import DBFTable as Table because that alias
2677     doesn't exist anymore.
2678    
2679     * Thuban/UI/classgen.py: Remove some unused imports
2680    
2681 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
2682    
2683     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
2684     Fix docstring.
2685     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
2686     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
2687     values of the supplied range to determine the beginning and end
2688     bounds of the generated classes.
2689    
2690     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
2691     do not have a leading 0 (.5 is now accepted as well as 0.5).
2692    
2693     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
2694     call to ClassGenerator.GenUniformDistribution.
2695    
2696     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
2697     layout bug with the 'Projection' label.
2698    
2699     * test/support.py (FloatTestCase): New. Needed for the Range tests.
2700    
2701     * test/test_range.py: New. Imported from SciParam.
2702    
2703 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
2704    
2705 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
2706     to table.UniqueValues() with calls that retrieve all the values
2707     from the table. This will need to be replaced by a method on table
2708     which can simply return the list (perhaps more efficiently).
2709    
2710     2003-05-12 Jonathan Coles <[email protected]>
2711    
2712 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
2713     Refer to the documentation for details.
2714    
2715     * test/test_classgen.py: Modified Quantile tests to use the
2716     new return values.
2717    
2718     * Thuban/Model/classgen.py
2719     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
2720     use new return values from CalculateQuantiles to produce the correct
2721     range bounds in the Classification.
2722     (ClassGenerator.CalculateQuantiles): Add more comments describing
2723     the return values and parameters. Make minor adjustments to improve
2724     the legibility of the code. Fix problem with adjusted not being set
2725     in most cases.
2726    
2727 frank 893 2003-05-12 Frank Koormann <[email protected]>
2728    
2729     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
2730     and latin1. Fixes #1851 finally.
2731    
2732 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
2733    
2734 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
2735    
2736     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
2737     Clean up debugging statement, add comments, fix a small bug in the
2738     returned adjusted percentiles.
2739    
2740     2003-05-09 Jonathan Coles <[email protected]>
2741    
2742 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
2743     and such ranges can now be saved and loaded from disk.
2744    
2745     Quantiles are now available in the Classification Generator.
2746    
2747     Initial support for building Queries on a table. Doesn't do anything
2748     but run some tests.
2749    
2750     * Thuban/Model/classification.py: Explicit imports.
2751     (ClassGroupRange): Use the Range class to store the underlying
2752     range information. The interface remains the same, except for
2753     GetRange(), and you can also supply a Range object as the min
2754     parameter to SetRange or __init__.
2755    
2756     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
2757     string appropriately for use in Thuban. Fixes RTbug #1851.
2758     (SessionLoader.end_projection): Handle the context of the
2759     projection tag a bit better by looking at what objects are not
2760     None. There was an assumption that a projection tag for a map
2761     could occur before any layers.
2762     (SessionLoader.start_clrange): Provide backward compatibility for
2763     reading min/max values as well as the new range parameter.
2764    
2765     * Thuban/Model/map.py: Explicit imports.
2766    
2767     * Thuban/Model/resource.py: Import _.
2768     (ProjFileSaver.write): write header using projfile.dtd.
2769    
2770     * Thuban/Model/save.py: Explicit imports.
2771     (XMLWriter.encode): New. Encode the given string from a format
2772     used by Thuban into UTF-8. Fixes RTbug #1851.
2773    
2774     * Thuban/UI/classgen.py: Explicit imports.
2775     (ClassGenDialog.__init__): Clean up the code and add support
2776     for Quantiles.
2777     (ClassGenDialog.OnOK): Add support for Quantiles.
2778     (GenQuantilesPanel): New. Input panel for Quantiles.
2779     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
2780     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
2781    
2782     * Thuban/Model/classgen.py: New. Contains all the classes named above.
2783    
2784     * Thuban/UI/classifier.py: Explicit imports.
2785     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
2786     ClassTable.SetValueAsCustom): Reworked to use new Range class.
2787    
2788     * Thuban/UI/legend.py: Explicit imports.
2789    
2790     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
2791     a Table menu and associated method calls.
2792     (MainWindow.choose_color): Removed. No longer needed.
2793    
2794     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
2795     should be disabled if no projection is selected in the available
2796     list.
2797    
2798     * Thuban/UI/renderer.py: Explicit imports.
2799    
2800     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
2801     with correctly selecting the rows and issuing the right events.
2802     Be sure to call Skip() to allow the grid to do some of its own
2803     handling which allows the rows to actually be selected.
2804     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
2805     selecting multiple shapes.
2806     (LayerTableFrame): Support for building Queries.
2807     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
2808    
2809     * Thuban/UI/tree.py: Explicit imports.
2810    
2811     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
2812     table view can call it.
2813    
2814     * test/test_classification.py: Explicit imports.
2815     (TestClassification.test_ClassGroupRange): Fix test for new
2816     Range class.
2817    
2818     * Doc/thuban.dtd: Add range parameter for clrange.
2819    
2820     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
2821     object in ClassGroupRange, and also uesd for inputting ranges in
2822     the classifer table and elsewhere.
2823    
2824     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
2825     yet.
2826    
2827 frank 872 2003-05-09 Frank Koormann <[email protected]>
2828    
2829     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2830    
2831 frank 860 2003-05-08 Frank Koormann <[email protected]>
2832    
2833 frank 870 Coding style updates
2834    
2835     * test/test_scalebar.py: Replaced tab indentation by spaces.
2836    
2837     * Thuban/UI/scalebar.py: Explicit imports.
2838    
2839     2003-05-08 Frank Koormann <[email protected]>
2840    
2841 frank 867 * Thuban/UI/scalebar.py
2842     (ScaleBar.DrawScalebar): Format string bug fixed.
2843    
2844     2003-05-08 Frank Koormann <[email protected]>
2845    
2846 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
2847    
2848     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2849     (deriveInterval):
2850     Calculate scalebar interval and unit which fits in width for scale.
2851     (roundInterval): Round float.
2852    
2853     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2854    
2855     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2856    
2857     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2858    
2859     2003-05-08 Frank Koormann <[email protected]>
2860    
2861 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2862     Initialize ScaleBar with canvas.map
2863    
2864     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2865     round intervals to display smarter lengths
2866     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2867     layer. If the maps has no projection applied grey the scalebar.
2868    
2869 frank 857 2003-05-07 Frank Koormann <[email protected]>
2870    
2871     Basic Scalebar features added.
2872    
2873     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2874    
2875     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2876     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2877     and the renderer.
2878    
2879     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2880    
2881     * Thuban/UI/messages.py: SCALE_CHANGED added.
2882    
2883 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
2884    
2885 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
2886     variable shapestores to hold a list of all open shapestore objects
2887     (Session.ShapeStores): New. Accessor method for the shapestores
2888     list.
2889     (Session._add_shapestore, Session._clean_weak_store_refs): New.
2890     Internal methods to maintain the shapestores list.
2891     (Session.Tables): New. Return all tables open in the session.
2892     (Session.OpenShapefile): Insert the new ShapeStore into the
2893     shapestores list.
2894    
2895     * test/test_session.py (TestSessionSimple.test_initial_state): Add
2896     tests for ShapeStores and Tables
2897     (TestSessionWithContent.test_shape_stores)
2898     (TestSessionWithContent.test_tables): New. Test cases for
2899     ShapeStores and Tables
2900    
2901     2003-05-07 Bernhard Herzog <[email protected]>
2902    
2903 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
2904     Add comments about the optimizations used.
2905     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
2906     Implement the ReadValue table interface method.
2907    
2908     * test/test_transientdb.py
2909     (TestTransientTable.run_iceland_political_tests)
2910     (TestTransientTable.test_transient_joined_table): Add tests for
2911     ReadValue
2912    
2913 frank 848 2003-05-07 Frank Koormann <[email protected]>
2914    
2915     * Resources/Bitmaps/fulllayerextent.xpm,
2916     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
2917     new icons.
2918    
2919 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
2920    
2921 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2922     New. Simply delegate to the transient table's version.
2923    
2924     * test/test_transientdb.py
2925     (TestTransientTable.test_auto_transient_table_query): New. Test
2926     case for AutoTransientTable's SimpleQuery
2927    
2928     2003-05-06 Bernhard Herzog <[email protected]>
2929    
2930 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
2931     Implement a simple query method for the query dialog
2932     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
2933     the row index or shapeid.
2934     (TransientTable.create): Insert the right value of the row index
2935     (TransientJoinedTable.create): Copy the row index of the left
2936     table to the joined result table
2937    
2938     * test/test_transientdb.py
2939     (TestTransientTable.test_transient_table_read_twice): Fix
2940     doc-string
2941     (TestTransientTable.test_transient_table_query): New. Test for the
2942     SimpleQuery method
2943    
2944     2003-05-06 Bernhard Herzog <[email protected]>
2945    
2946 bh 840 Convert all table users to use the new table interface. This only
2947     covers Thuban itself, not GREAT-ER or other applications built on
2948     Thuban yet, so the compatibility interface stays in place for the
2949     time being but it now issues DeprecationWarnings.
2950    
2951     Finally, the new Table interface has a new method, HasColumn.
2952    
2953     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
2954     issue deprecation warnings when they're. The warnings refer to the
2955     caller of the method.
2956     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
2957     for the deprecation warnings
2958    
2959     * test/test_table.py: Ignore the deprecation warnings for the old
2960     table in the tests in this module. The purpose of the tests is to
2961     test the old interface, after all.
2962    
2963     * test/test_transientdb.py
2964     (TestTransientTable.run_iceland_political_tests): Use the
2965     constants for the types. Add a test for HasColumn
2966     (TestTransientTable.test_transient_joined_table): Adapt to new
2967     table interface. Add a test for HasColumn
2968     (TestTransientTable.test_transient_table_read_twice): Adapt to new
2969     table interface
2970    
2971     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
2972     Adapt to new table interface
2973    
2974     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
2975     new table interface
2976    
2977     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
2978     (RecordTable.SetTable): Adapt to new table interface
2979    
2980     * Thuban/UI/classifier.py (Classifier.__init__)
2981     (Classifier.__init__): Adapt to new table interface
2982    
2983     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2984     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
2985     to new table interface
2986    
2987     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
2988     (AutoTransientTable.HasColumn): Implement the new table interface
2989     method
2990     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
2991     (AutoTransientTable.UniqueValues): Adapt to new table interface
2992    
2993     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
2994     Adapt to new table interface
2995    
2996     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
2997     simplify opening shapefiles a bit easier.
2998     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2999     (TestLayer.test_point_layer): Use the new helper method
3000     (TestLayer.test_get_field_type): New. Test for the GetFieldType
3001     method
3002    
3003     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3004     the new table method
3005    
3006     * test/test_memory_table.py (TestMemoryTable.test_has_column):
3007     Test for the new table method HasColumn
3008    
3009 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
3010    
3011     Addresses the "Selection Extent" wish of RTbug #1787.
3012    
3013     * Resources/Bitmaps/fulllayerextent.xpm,
3014     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3015     extent. These are just place holders for the real bitmaps.
3016    
3017     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3018     calculate the bounding box once (the first time compute_bbox() is
3019     called).
3020     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3021     the bounding box for the shapes in lat/long coordinates.
3022    
3023     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3024     option.
3025     (MainWindow.has_selected_shapes): New. Returns true if there are
3026     any selected shapes.
3027     (MainWindow.FullSelectionExtent): New. Calls
3028     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3029     (_has_selected_shapes): New. Returns true if there are any
3030     selected shapes.
3031    
3032     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3033     true if there are any selected shapes.
3034    
3035     * Thuban/UI/view.py (MapCanvas): Added delegated method
3036     HasSelectedShapes.
3037     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3038     shapes on the canvas using the map projection (if any).
3039    
3040     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3041     for Layer.ShapesBoundingBox().
3042    
3043 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
3044    
3045     * Resources/Projections/defaults.proj: Fix spelling of Mercator
3046    
3047 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
3048    
3049     Addresses the "Full Layer Extent" wish of RTbug #1787.
3050    
3051     * Resources/Projections/defaults.proj: Added UK National Grid.
3052    
3053     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3054     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3055     when the user selects the menu option.
3056    
3057     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3058     scales the given layer on the canvas using the map projection.
3059    
3060 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
3061    
3062     Convert the table implementations to a new table interface. All
3063     tables use a common mixin class to provide backwards compatibility
3064     until all table users have been updated.
3065    
3066     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3067     provide backwards compatibility for table classes implementing the
3068     new interface
3069     (DBFTable, MemoryTable): Implement the new table interface. Use
3070     OldTableInterfaceMixin as base for compatibility
3071     (DBFColumn, MemoryColumn): New. Column description for DBFTable
3072     and MemoryTable resp.
3073    
3074     * test/test_dbf_table.py: New. Test cases for the DBFTable with
3075     the new table interface.
3076    
3077     * test/test_memory_table.py: New. Test cases for the MemoryTable
3078     with the new table interface.
3079    
3080     * test/test_table.py: Document the all tests in this file as only
3081     for backwards compatibility. The equivalent tests for the new
3082     interface are in test_memory_table.py and test_dbf_table.py
3083     (MemoryTableTest.test_read): field_info should be returning tuples
3084     with four items
3085     (MemoryTableTest.test_write): Make doc-string a more precise.
3086    
3087     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3088     table interface. Derive from from OldTableInterfaceMixin for
3089     compatibility.
3090     (TransientTableBase.create): New intance variable column_map to
3091     map from names and indices to column objects
3092     (TransientTable.create): Use the new table interface of the input
3093     table
3094     (AutoTransientTable): Convert to new table interface. Derive from
3095     from OldTableInterfaceMixin for compatibility.
3096     (AutoTransientTable.write_record): Removed. It's not implemented
3097     yet and we still have to decide how to handle writing with the new
3098     table and data framework.
3099    
3100     * test/test_transientdb.py
3101     (TestTransientTable.run_iceland_political_tests)
3102     (TestTransientTable.test_transient_joined_table): Use the new
3103     table interface
3104    
3105 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
3106    
3107     This is namely a collection of UI updates to improve user interactivity.
3108     Tabbing between controls now exists and you can use ESC to close dialog
3109     boxes; ENTER will active the default button.
3110    
3111     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3112     order that the controls are created so that tabbing works correctly.
3113     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3114     wxDialog can handle the default button correctly.
3115     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3116     same reasons as for OnOK.
3117     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3118     when we ask the table for the maximum/minimum values of a field
3119     which could take a very long time.
3120    
3121     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3122     order that the controls are created so that tabbing works correctly.
3123     (SelectPropertiesDialog.__init__): Rearrange the order that the
3124     controls are created so that tabbing works correctly.
3125    
3126     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3127     to derive from a wxDialog but behave like the original implementation
3128     which was derived from a wxFrame. wxDialog provides useful key
3129     handling functionality like ESC calling OnCancel and ENTER calling
3130     OnOK which is lost with wxFrame.
3131    
3132     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3133     new dialogs.
3134    
3135     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3136     order that the controls are created so that tabbing works correctly.
3137     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3138     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3139     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3140     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3141     can provide the "UK National Grid" as a default projection.
3142     (UTMPanel.__init__): Rearrange the order that the controls are
3143     created so that tabbing works correctly.
3144    
3145 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
3146    
3147 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
3148     (project_point): If a map projection but no layer projection is
3149     given, convert degrees to radians before applying the map
3150     projection.
3151    
3152 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3153     (TableGrid.allow_messages): New methods to make it possible to
3154     inhibit message sending.
3155     (TableGrid.issue): Only send the message if not inhibited.
3156     (LayerTableGrid.select_shape): Use the new methods to make sure
3157     that no ROW_SELECTED message is sent while we're updating the
3158     selected rows to match the selected shapes.
3159    
3160 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
3161    
3162     Implementation of MemoryTable.
3163    
3164     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3165     implementation that operates on a list of tuples. All of the data
3166     are kept in the memory.
3167    
3168     * test/test_table.py (MemoryTableTest): New.
3169    
3170     * test/test_transientdb.py (SimpleTable): Removed.
3171     (TestTransientTable.test_transient_joined_table,
3172     (TestTransientTable.test_transient_table_read_twice): Replaced
3173     SimpleTable by MemoryTable.
3174    
3175 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
3176    
3177 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
3178     for each of the layers.
3179    
3180     * Resources/Projections/defaults.proj: Geographic projection
3181     contains unit conversion parameter.
3182    
3183     2003-04-30 Jonathan Coles <[email protected]>
3184    
3185 jonathan 793 The most important part of this putback is the projection changes.
3186     It should now be possible to specify the projection that a layer
3187     is in and then specify a different projection for the map. The
3188     projection dialog has an extra parameter for a geographic projection
3189     which lets the user select if the input is in degrees or radians.
3190    
3191     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3192     to say that the parameter is a tuple of unprojected
3193     points (which is what the callers to this method were assuming).
3194     Also, since the points are unprojected we need to projected them.
3195    
3196     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3197     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3198     groups are selected, move the layer up/down. Fixes RTbug #1833.
3199    
3200     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3201    
3202     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3203     parameter in call to SetClientData.
3204     (GeoPanel): Add support for selecting the units that the
3205     source data is in (Radians or Degrees).
3206    
3207     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3208     the rendering loop by reducing the number of if's, removing the
3209     unnecessary try/except block, and checking if the old group
3210     is the same as the new one (which happens a lot if there is
3211     no classification, or lots of shapes are in the same group).
3212    
3213     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3214     around the redraw routine to try to catch problems that the user
3215     may create by selecting invalid projections for the data set and
3216     map. Clears the display if there are any problems and prints the
3217     error.
3218     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3219     rectangle.
3220    
3221     * extensions/thuban/wxproj.cpp (project_point): First invert the
3222     supplied point (which should be in projected coordinates) using
3223     the layer's projection and then project the point using the
3224     map's projection.
3225     (project_points): Use project_point() to project each point.
3226    
3227 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
3228    
3229     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3230     don't set the Classification to None if the classfication field
3231     is None (ie only a DEFAULT).
3232    
3233 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
3234    
3235 bh 790 * Thuban/UI/view.py: Fix some typos.
3236    
3237 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3238     not pop up the dialog if the selection becomes empty (this could
3239     happen if e.g. a new selection is opened while the identify tool
3240     is active and dialog had been closed)
3241    
3242     2003-04-30 Bernhard Herzog <[email protected]>
3243    
3244 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3245     instance variable read_record_last_result
3246     (TransientTableBase.read_record): Make sure reading the same
3247     record twice works. The implementation uses the new instance
3248     variable read_record_last_result
3249    
3250     * test/test_transientdb.py
3251     (TestTransientTable.test_transient_table_read_twice): New test
3252     case for the above bug-fix.
3253    
3254 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
3255    
3256     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3257    
3258     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3259    
3260     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3261     (ClassTable.SetValueAsCustom): Rename keyword argument in
3262     ClassGroup* constructors to match argument name.
3263    
3264 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
3265    
3266     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3267     transient DB if it exists to make sure it doesn't leave a journal
3268     file in the temp directory.
3269    
3270     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3271     self.conn to None after closing the connection to make sure it's
3272     not closed twice
3273    
3274 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3275    
3276 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
3277     "true". If anything other than "false" is specified we also assume
3278 jonathan 776 "true". Addresses RTbug #1025.
3279 jonathan 769
3280     * Doc/thuban.dtd: Add visible parameter to a layer.
3281    
3282     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3283     of visible from 1 to True.
3284     (Layer.__init__): Change default value of visible from 1 to True.
3285    
3286     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3287     parameter.
3288    
3289     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3290     parameter.
3291    
3292     * test/test_load.py: Add new test data contents_test_visible.
3293     (LoadSessionTest.setUp): save test data.
3294     (LoadSessionTest.testLayerVisibility): Test if the visible flag
3295     is loaded correctly.
3296    
3297     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3298     for saving an invisible layer.
3299    
3300     2003-04-29 Jonathan Coles <[email protected]>
3301    
3302 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3303     legend dialog box and tell it to change its map to the one
3304     supplied to SetMap(). Fixes RTbug #1770.
3305    
3306 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
3307    
3308 bh 766 Next step of table implementation. Introduce a transient database
3309     using SQLite that some of the data is copied to on demand. This
3310     allows us to do joins and other operations that require an index
3311     for good performance with reasonable efficiency. Thuban now needs
3312     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3313     haven't tested that.
3314    
3315     * Thuban/Model/transientdb.py: New. Transient database
3316     implementation.
3317    
3318     * test/test_transientdb.py: New. Tests for the transient DB
3319     classes.
3320    
3321     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3322     classes to help automatically remove temporary files and
3323     directories.
3324     (Session.__init__): New instance variables temp_dir for the
3325     temporary directory and transient_db for the SQLite database
3326     (Session.temp_directory): New. Create a temporary directory if not
3327     yet done and return its name. Use AutoRemoveDir to have it
3328     automatically deleted
3329     (Session.TransientDB): Instantiate the transient database if not
3330     done yet and return it.
3331    
3332     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3333     AutoTransientTable so that data is copied to the transient DB on
3334     demand.
3335     (SimpleStore): New class that simply combines a table and a
3336     shapefile
3337    
3338     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3339     DBFTable and update its doc-string to reflect the fact that this
3340     is only the table interface to a DBF file. Table is now an alias
3341     for DBFTable for temporary backwards compatibility.
3342    
3343     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3344     the last reference to the session goes away so that the temporary
3345     files are removed properly.
3346    
3347     * test/test_load.py (LoadSessionTest.tearDown): Remove the
3348     reference to the session to make sure the temporary files are
3349     removed.
3350    
3351     2003-04-29 Bernhard Herzog <[email protected]>
3352    
3353 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3354     the __parser instance variable into a normal local variable in
3355     read. It's only used there and read will never be called more than
3356     once. Plus it introduces a reference cycle that keeps can keep the
3357     session object alive for a long time.
3358    
3359 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3360 jonathan 735
3361 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3362     Projection an immutable item. Fixes RTbug #1825.
3363     (Projection.__init__): Initialize instance variables here.
3364     (ProjFile.Replace): New. Replace the given projection object with
3365     the new projection object. This solves the problem of needing the
3366     mutator Projection.SetProjection() in the ProjFrame class and
3367     allows a projection to change parameters without changing its
3368     location in the file.
3369    
3370     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3371     be of type wxSAVE and should verify overwriting a file.
3372    
3373     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3374     ProjFile.Replace() method instead of the mutator
3375     Projection.SetProjection(). Also requires that we reassign the
3376     client data to the new projection.
3377    
3378     * test/test_proj.py (TestProjection.test): Test GetName() and
3379     GetAllParameters()
3380     (TestProjFile.test): Remove tests for Set*() methods. Add tests
3381     for Replace().
3382    
3383     2003-04-25 Jonathan Coles <[email protected]>
3384    
3385 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3386     to save the name of the projection.
3387    
3388     * test/test_save.py (SaveSessionTest.testLayerProjection): New
3389     test to verify layer projections are saved correctly.
3390    
3391     2003-04-25 Jonathan Coles <[email protected]>
3392    
3393 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
3394     to "Unknown" if name is None.
3395     (Projection.SetAllParameters): New. Set the projection's
3396     parameter list to the one supplied.
3397     (Projection.SetProjection): New. Set the projection's
3398     properties to those of the supplied Projection.
3399    
3400     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3401     the dialog title to include the map's title.
3402     (MainWindow.LayerProjection): Set the dialog title to include
3403     the layer's title.
3404    
3405     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3406     error dialogs into a single method call.
3407     (ProjFrame.__VerifyButtons): Add more states to check.
3408     (ProjFrame.__GetProjection): Return the current state of an
3409     edited projection or None.
3410     (ProjFrame.__FillAvailList): Remove checks for states that
3411     shouldn't exist.
3412     (ProjFrame._OnNew): Clear all selected items and supply
3413     a projection panel if necessary.
3414    
3415     * test/test_proj.py (TestProjFile.test): Add tests for
3416     ProjFile.SetAllParameters, ProjFile.SetProjection,
3417     ProjFile.SetName.
3418    
3419     2003-04-25 Jonathan Coles <[email protected]>
3420    
3421 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
3422     takes an optional argument to select the current projection.
3423     This does not guarantee that the item is visible due to
3424     limited wxWindows functionality. Fixes RTBug #1821.
3425    
3426     2003-04-25 Jonathan Coles <[email protected]>
3427    
3428 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
3429     the projection name and use it when constructing the Projection
3430     object.
3431    
3432     * Thuban/Model/proj.py (Projection.__init__): Change the default
3433     value for 'name' to None and then test if name is equal to None
3434     in the body of the constructor. This way the caller doesn't have to
3435     know what the default value should be. Namely, useful in load.py
3436     where we have to pick a default value if the 'name' parameter
3437     doesn't exist in the XML file.
3438    
3439     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
3440     Tests a file where a layer has a projection.
3441    
3442     2003-04-25 Jonathan Coles <[email protected]>
3443    
3444 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
3445     tree for projection information.
3446    
3447     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
3448     XMLReader.GetFileName.
3449     (SessionLoader): Added support for loading projection tags that
3450     appear inside a layer.
3451    
3452     * Thuban/Model/proj.py (ProjFile): Document the class. Move
3453     back to using a list because the order of the projections in
3454     the file is important to maintain. Fixes RTbug #1817.
3455    
3456     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
3457     to ProjFile.GetFilename.
3458    
3459     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
3460     information.
3461    
3462     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
3463     ProjFrame._OnSaveAs. Removed old dead code from previous
3464     implementation.
3465     (ProjFrame._OnExport): Add support for exporting more than one
3466     projection to a single file.
3467     (ProjFrame.__FillAvailList): use string formatting (% operator)
3468     to build strings that are (partly) translated. Fixes RTbug #1818.
3469    
3470     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
3471     class.
3472    
3473 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
3474    
3475     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
3476    
3477     * po/fr.po: New. French translation by Daniel Calvelo Aros
3478    
3479     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
3480     empty strings.
3481    
3482 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
3483 jonathan 724
3484     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
3485     implement the interface that the ProjFrame dialog expects.
3486    
3487     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
3488     name of the projection to be changed.
3489     (ProjFile): Use a dictionary instead of a list so that removing
3490     projections is easier and we are sure about uniqueness.
3491     (ProjFile.Remove): Remove the given projection object.
3492    
3493     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
3494     Return a list with only one projection file instead of searching for
3495     any projection file. This simplifies many things if the user can
3496     only have one system file and one user file.
3497    
3498     * Thuban/UI/classgen.py: Change all references to
3499     genCombo to genChoice.
3500    
3501     * Thuban/UI/mainwindow.py: Add a Projection option under the
3502     layer menu.
3503     (MainWindow.LayerProjection): New. Open up a projection window
3504     for a layer.
3505    
3506     * Thuban/UI/projdialog.py: Large changes to how the dialog is
3507     laid out. Use three panels instead of one. One for the list of
3508     projections, one for the edit controls, and one for the buttons.
3509     Fixed resizing problems so that the dialog resizes correctly
3510     when the projection panel changes. Added import/export, save, and
3511     new buttons/functionality.
3512    
3513 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
3514    
3515     First step towards table management. Introduce a simple data
3516     abstraction so that we replace the data a layer uses more easily
3517     in the next step.
3518    
3519     * Thuban/Model/data.py: New file with a simple data abstraction
3520     that bundles shapefile and dbffile into one object.
3521    
3522     * Thuban/Model/session.py (Session.OpenShapefile): New method to
3523     open shapefiles and return a shape store object
3524    
3525     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
3526     object instead of a shapefile filename. This introduces a new
3527     instance variable store holding the datastore. For intermediate
3528     backwards compatibility keep the old instance variables.
3529     (open_shapefile): Removed. No longer needed with the shape store.
3530     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
3531     get the shape store used by a layer.
3532     (Layer.Destroy): No need to explicitly destroy the shapefile or
3533     table anymore.
3534    
3535     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
3536     (MainWindow.AddLayer): Use the session's OpenShapefile method to
3537     open shapefiles
3538    
3539     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
3540     session's OpenShapefile method to open shapefiles
3541    
3542     * test/test_classification.py
3543     (TestClassification.test_classification): Use the session's
3544     OpenShapefile method to open shapefiles and build the filename in
3545     a more platform independed way
3546    
3547     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3548     Implement to have a session to use in the tests
3549     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3550     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
3551     session's OpenShapefile method to open shapefiles
3552     (TestLayerLegend.setUp): Instantiate a session so that we can use
3553     it to open shapefiles.
3554     (TestLayerLegend.tearDown): Make sure that all references to
3555     layers and session are removed otherwise we may get a resource
3556     leak
3557    
3558     * test/test_map.py (TestMapAddLayer.test_add_layer)
3559     (TestMapWithContents.setUp): Instantiate a session so that we can
3560     use it to open shapefiles.
3561     (TestMapWithContents.tearDown): Make sure that all references to
3562     layers, maps and sessions are removed otherwise we may get a
3563     resource leak
3564     ("__main__"): use support.run_tests() so that more info about
3565     uncollected garbage is printed
3566    
3567     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
3568     session's OpenShapefile method to open shapefiles
3569     ("__main__"): use support.run_tests() so that more info about
3570     uncollected garbage is printed
3571    
3572     * test/test_selection.py (TestSelection.tearDown): Make sure that
3573     all references to the session and the selection are removed
3574     otherwise we may get a resource leak
3575     (TestSelection.get_layer): Instantiate a session so that we can
3576     use it to open shapefiles.
3577     ("__main__"): use support.run_tests() so that more info about
3578     uncollected garbage is printed
3579    
3580     * test/test_session.py (TestSessionBase.tearDown)
3581     (TestSessionWithContent.tearDown): Make sure that all references
3582     to the session and layers are removed otherwise we may get a
3583     resource leak
3584     (TestSessionWithContent.setUp): Use the session's OpenShapefile
3585     method to open shapefiles
3586    
3587 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
3588    
3589     * Thuban/Model/load.py (XMLReader.read): Should have been checking
3590     if the file_or_filename object had the 'read' attribute.
3591    
3592 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
3593    
3594 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
3595     (ReadProjFile): Add documentation about which exceptions are raised.
3596     Always pass the exceptions up to the caller.
3597     (GetProjFiles): If the directory can't be read return an empty list.
3598     If any of the proj files can't be read skip that file and go
3599     on to the next one.
3600    
3601     * test/test_proj.py: Added test cases to handle nonexistent files,
3602     unreadable files, and files that don't parse correctly.
3603    
3604     2003-04-23 Jonathan Coles <[email protected]>
3605    
3606 jonathan 716 Projection dialog. Allows the user to select from a list
3607     of projection templates and optionally edit them and save new ones.
3608    
3609     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
3610     (ProjPanel): Base class for projection specific panels.
3611     (TMPanel): Projection panel for Transverse Mercartor.
3612     (UTMPanel): Projection panel for Universal Transverse Mercartor.
3613     (LCCPanel): Projection panel for Lambert Conic Conformal.
3614     (GeoPanel): Projetion panel for Geographic Projection.
3615    
3616     2003-04-23 Jonathan Coles <[email protected]>
3617    
3618 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
3619     promote symmetry. There now exists XMLReader and XMLWriter.
3620     (XMLReader.read): New. Call to read the given file descriptor or
3621     filename.
3622     (XMLReader.close): New. Make sure the file is closed.
3623     (XMLReader.GetFileName): New. Return just the file name that is being
3624     read from.
3625     (XMLReader.GetDirectory): New. Return just the directory of the file
3626     that is being read.
3627     (XMLReader.AddDispatchers): New. Take a dictionary which contains
3628     the names of functions to call as the XML tree is parsed.
3629     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
3630     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
3631     (SessionLoader): Removed class variables start_dispatcher and
3632     end_dispatcher since this functionality is now part of a class
3633     instance. Fixes RTbug #1808.
3634     (SessionLoader.__init__): Add dispatcher functions.
3635     (load_xmlfile): Code was moved into the XMLReader.read().
3636     (load_session): Use modified SessionLoader.
3637    
3638     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
3639     map's projection.
3640    
3641     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
3642     GetAllParameters.
3643     (Projection.GetParameter): Returns the value for the given parameter.
3644    
3645     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
3646     (GetProjFiles): Renamed from GetProjections. Now returns a list
3647     of ProjFile objects.
3648     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
3649     a list of ProjFile objects whose files are not user defined.
3650     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
3651     list of ProjFile objects whose files are user defined.
3652     (ProjFileReader): Extend new XMLReader.
3653    
3654     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
3655     promote symmetry.
3656    
3657     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
3658     control instead of a wxComboBox. wxChoice controls do not generate
3659     events as the uses highlights possible choices which fixes problems
3660     with resizing the dialog when the use selects an option.
3661    
3662     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
3663     control instead of a wxComboBox.
3664    
3665     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
3666     dialog.
3667    
3668     * test/test_proj.py (TestProjection.test): New tests for GetParameter
3669     method.
3670    
3671 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
3672    
3673 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
3674     constants
3675    
3676 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3677     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
3678    
3679 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
3680    
3681 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
3682     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
3683     anymore.
3684     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
3685     (Layer.ShapeType, Layer.Shape): No need to call
3686     self.open_shapefile since it's always called in __init__
3687    
3688 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
3689     In wxPython 2.4 there's no need to extend MainLoop anymore since
3690     wxPython itself makes sure OnExit is called.
3691    
3692 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
3693    
3694 jonathan 693 Initial putback of projection management code. Includes new
3695     classes to read and write projection files. The current load
3696     and save classes were abstracted a bit so they could be reused.
3697     The Projection class was extended to provide new methods and
3698     have a name.
3699    
3700     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
3701     general XML reading methods that were part of ProcessSession.
3702    
3703     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
3704     name.
3705     (ProjFile): New. Represents a file that contains projection
3706     information.
3707    
3708     * Thuban/Model/resource.py: New. Contains general utilities
3709     for read and writing projection files.
3710    
3711     * Thuban/Model/save.py (XMLSaver): New. Contains all the
3712     general XML writing methods that were part of SessionSaver.
3713     (SessionSaver): Renamed from Saver.
3714    
3715     * test/test_proj.py: New test cases for the projection
3716     file read and write functions.
3717    
3718     2003-04-16 Jonathan Coles <[email protected]>
3719    
3720 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
3721     in the ClassGroup*.__repr__() methods so it is clearer when
3722     a value is a string and when it is a number.
3723    
3724     * test/test_load.py: Rework the classification test to test
3725     that we can load old files.
3726     (testLabels): Test a file where the groups have labels.
3727    
3728 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
3729    
3730     Safer implementation of the performance enhancements of the
3731     low-level renderer:
3732    
3733     * extensions/thuban/wxproj.cpp (extract_projection)
3734     (extract_pointer): Rename extract_projection to extract_pointer
3735     and redefine its purpose to return the pointer stored in a CObject
3736     returned by the object's cobject method. Update all callers.
3737     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
3738     handling of these low-level parameters so that each s_draw_info
3739     instance is handled as a CObject at python level that also
3740     contains real references to the actual python objects which
3741     contain the values in the struct. Add free_draw_info as the
3742     destructor.
3743     (draw_polygon_shape): Add the py_draw_info parameter which must a
3744     cobject containing an s_draw_info pointer.
3745    
3746     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
3747     method to instantiat the low-level render parameter
3748     (MapRenderer.draw_shape_layer): Use the new method. Remove some
3749     commented out code.
3750     (MapRenderer.draw_polygon_shape): Make the first parameter not the
3751     layer but the low-level render parameter
3752     (ScreenRenderer.draw_shape_layer): Use the low-level render
3753     parameter.
3754    
3755 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
3756    
3757 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
3758     the ClassGroup* classes to make debugging a bit easier.
3759     (ClassGroup.SetLabel): Check that the string is an instance
3760     of StringTypes not StringType. Accounts for Unicode strings.
3761    
3762     * Thuban/Model/color.py: Implemented __repr__ to make
3763     debugging a bit easier.
3764    
3765     * Thuban/Model/save.py (Saver.write_classification): Need to
3766     save the group label.
3767    
3768     * test/test_load.py (testClassification): New. Loads the
3769     iceland_sample_test.thuban file and checks if it was loaded
3770     correctly.
3771    
3772     2003-04-15 Jonathan Coles <[email protected]>
3773    
3774 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
3775     to improve rendering performance by initializing the variables
3776     that are not change each time draw_polygon_shape() is called.
3777     The values are stored in a global struct draw_info.
3778     (draw_polygon_shape): Removed initialization code that is
3779     now in draw_polygon_init().
3780    
3781     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
3782 jonathan 674 drawing initialization call to draw_polygon_init()
3783     (MapRenderer.draw_polygon_shape): Use new signature of
3784     draw_polygon_shape.
3785 jonathan 673
3786 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
3787     weirdness by setting the range to (1, maxint).
3788 jonathan 673
3789 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
3790     instance variables private and optimize comparison operator
3791     by first checking if the color references are the same.
3792     (ClassGroupSingleton): Make instance variables private.
3793     (ClassGroupRange): Make instance variables private.
3794 jonathan 673
3795 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
3796    
3797 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
3798    
3799     First stab at internationalized messages:
3800    
3801     * Thuban/__init__.py (_): Implement the translation function for
3802     real using the python gettext module.
3803    
3804     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
3805     translate empty strings.
3806    
3807     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3808     Add a missing space to a warning message
3809    
3810     * po/README: New. Notes about the management of the translation
3811     files.
3812    
3813     * po/Makefile: New. Makefile to help manage the translation files.
3814    
3815     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
3816    
3817     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
3818     translations and support files in po/
3819    
3820     * setup.py (data_files): Add the *.mo files to the data_files too
3821    
3822     * README: Add note about the translations when building from CVS
3823    
3824 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
3825    
3826     * Thuban/UI/dock.py: Fixes some window resizing problems most
3827     noticable under windows. Always assume the button bitmaps will
3828     be there. Code clean up.
3829     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
3830     images for the dock/undock button to the same images.
3831     Work around for RTbug #1801.
3832    
3833     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
3834     be allowed to grow within the sizer. Fixes a bug under Windows
3835     where the toolbar wasn't being drawn.
3836    
3837 frank 664 2003-04-14 Frank Koormann <[email protected]>
3838    
3839     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
3840     Updated design to try to make the button functionality more
3841     transparent.
3842    
3843 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
3844    
3845     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
3846     finalize the intialization of the panel.
3847    
3848     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
3849     creation of the panel. Should be the last thing called in the
3850     initializer of a subclass.
3851    
3852     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
3853     set the current selections in the combo boxes. This is needed
3854     under Windows.
3855    
3856     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
3857     level panel to the dialog so that the background colors are
3858     consistent under Windows.
3859    
3860 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
3861    
3862 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
3863     not black.
3864    
3865     * Thuban/UI/legend.py: Enable/disable the legend buttons when
3866     the legend changes. Fixes RTbug #1793.
3867    
3868     * test/test_classification.py: Added test for copying of
3869     classifications.
3870    
3871     2003-04-11 Jonathan Coles <[email protected]>
3872    
3873 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
3874     such as bitmaps.
3875    
3876     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
3877     added images to the move buttons, added 'reverse' button.
3878     (CustomRampPanel.__init__): Added images to the move buttons.
3879     (GreyRamp): New. Generates a ramp from white to black.
3880     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
3881    
3882     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
3883     ID_PROPERTY_*.
3884     (Classifier.__init__): Minor changes to the layout.
3885     (Classifier._OnTitleChanged): Listen for when the user edits the
3886     title and update the dialog's title and the layer's title.
3887    
3888     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
3889    
3890     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
3891     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
3892     if the layer's title changes.
3893    
3894     * Thuban/UI/mainwindow.py: Added new menu item and associated code
3895     to open a dialog to rename the map.
3896     (MainWindow): Use new resource class to import bitmaps.
3897    
3898     2003-04-11 Jonathan Coles <[email protected]>
3899    
3900 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
3901 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
3902     Resources/Bitmaps/group_use_none.xpm,
3903     Resources/Bitmaps/group_use_not.xpm,
3904     Resources/Bitmaps/hide_layer.xpm,
3905     Resources/Bitmaps/layer_properties.xpm,
3906     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
3907     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
3908     New.
3909 jonathan 646
3910 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
3911    
3912 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
3913     Should pass group to ClassGroup constructor.
3914    
3915     2003-04-10 Jonathan Coles <[email protected]>
3916    
3917 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
3918     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
3919     here. Implement SetVisible(), IsVisible().
3920     (ClassGroup.__init__): Add group parameter which acts as a copy
3921     constructor.
3922    
3923     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
3924     "Visible" check boxes.
3925     (Classifier): Rename the buttons and refactor the code to match
3926     the new labels.
3927    
3928     * Thuban/UI/legend.py: Classify button is now called "Properties".
3929     Refactored the code to change variable names.
3930     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
3931    
3932     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
3933     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
3934     renamed to MainWindow.LayerEditProperties.
3935     (MainWindow.ToggleLegend): Don't include map name in legend title.
3936     (MainWindow.SetMap): Added the map name to the window title.
3937     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
3938     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
3939     Functionality is found in the layer properties dialog.
3940    
3941     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3942     draw visible groups.
3943    
3944 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
3945    
3946 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
3947     addition and selection of new color schemes.
3948     (MonochromaticRamp): New. Generates a ramp between two colors.
3949     (RedRamp): New. Generates a ramp of all red.
3950     (GreenRamp): New. Generates a ramp of all green.
3951     (BlueRamp): New. Generates a ramp of all blue.
3952    
3953     2003-04-09 Jonathan Coles <[email protected]>
3954    
3955 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
3956     Need to copy over field and fieldType attributes.
3957    
3958     * Thuban/Model/table.py (Table.field_range): New. Retrive the
3959     maximum and minimum values over the entire table for a given
3960     field.
3961     (Table.GetUniqueValues): New. Retrieve all the unique values
3962     in the table for a given field.
3963    
3964     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
3965     (GenUniquePanel): New. Controls to allow the user to select
3966     which unique field values they would like in the classification.
3967     (CustomRampPanel): Code that was in ClassGenDialog that allows
3968     the user to select the properties for a custom ramp.
3969     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
3970    
3971     * Thuban/UI/classifier.py: Removed a lot of debugging code.
3972     (Classifier._SetClassification): Callback method so that the
3973     class generator can set the classification in the grid.
3974     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
3975     editing of a group properties class into a wxWindows control.
3976    
3977     * Thuban/UI/dock.py: It was decided that if the user closes
3978     a dockable window the window should simply hide itself. That
3979     way if the user wants to show the dock again it appears in the
3980     same place as it was when it was closed.
3981     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
3982     (DockableWindow._OnButtonClose): Hide the window instead of
3983     destroying it.
3984     (DockableWindow._OnClose): Hide the window instead of
3985     destroying it.
3986    
3987     * Thuban/UI/legend.py (LegendTree): Use a private method to
3988     consistently set the font and style of the text. Fixes RTbug #1786.
3989    
3990     * Thuban/UI/mainwindow.py: Import just the Classifier class.
3991    
3992 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
3993    
3994 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
3995     to the map module
3996    
3997     2003-04-07 Bernhard Herzog <[email protected]>
3998    
3999 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4000     favor of ToggleSessionTree
4001     (MainWindow.ToggleSessionTree): New method to toggle visibility of
4002     the session tree.
4003     (MainWindow.SessionTreeShown): New method to return whether the
4004     session tree is currently shown.
4005     (MainWindow.ToggleLegend): New method to toggle visibility of the
4006     legend
4007     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4008     LegendShown
4009     (MainWindow.LegendShown): New method to return whether the legend
4010     is currently shown.
4011     (_method_command): Add checked parameter so we can define check
4012     menu items
4013     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4014     mainwindow methods.
4015     (show_session_tree, show_legend commands): Removed.
4016     (toggle_session_tree, toggle_legend commands): New commands to
4017     toggle the visibility of the dialogs
4018    
4019 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
4020    
4021 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
4022    
4023     * Thuban/UI/dock.py: Fix Windows problem.
4024    
4025     * Thuban/UI/mainwindow.py: Use False instead of false.
4026     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4027    
4028     2003-04-07 Jonathan Coles <[email protected]>
4029    
4030 jonathan 612 Since we now say that the order of the groups in a classification
4031     matters, it makes sense to be able to manipulate that order. Most
4032     of the changes to Thuban/Model/classification.py are to that end.
4033    
4034     * Thuban/Model/classification.py (Classification.AppendGroup,
4035     Classification.InsertGroup, Classification.ReplaceGroup,
4036     Classification.RemoveGroup, Classification.GetGroup): Do as the
4037     names imply.
4038     (Classification.FindGroup): This was called GetGroup, but GetGroup
4039     takes an index, while FindGroup takes a value.
4040     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4041     REFERENCE. Currently there is a cyclic reference between the layer
4042     and its classification. If the classification doesn't need to know
4043     its owning layer we can change this, since it may make sense to be
4044     able to use the same classification with different layers.
4045    
4046     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4047    
4048     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4049     not AddGroup()
4050    
4051     * Thuban/UI/classifier.py: Now that we can depend on the order in
4052     a Classification and have methods to manipulate that order we don't
4053     need to use our own data structures in the grid. We can simply make
4054     the grid/table access the information they need from a copy of
4055     the classification object.
4056     (Classifier._OnCloseBtn): Event handler for when the user clicks
4057     'Close'. This is needed so if the user applies changes and then
4058     continues to change the table the user has the option of discarding
4059     the most recent changes and keeping what they applied.
4060    
4061     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4062     into the same group.
4063    
4064     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4065     with a really old version of proj, PJ_VERSION won't even be defined.
4066     If it isn't defined then just compile so that the function always
4067     returns Py_False.
4068    
4069     * test/test_classification.py: Fix tests to use the renamed methods.
4070     Still need to write tests for the new methods.
4071    
4072 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
4073 jonathan 608
4074 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4075     call to SetSelection out of the method and before the call
4076     to __SelectField in __init__. This prevents a recursion of events
4077     when _OnFieldSelect is triggered by the user.
4078    
4079     2003-04-04 Jonathan Coles <[email protected]>
4080    
4081 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
4082     Color.Transparent.
4083     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4084     Don't bother copying the color, since Colors are immutable.
4085    
4086     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4087     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4088     Thuban/UI/renderer.py, Thuban/UI/view.py:
4089     Rename Color.None to Color.Transparent.
4090    
4091     * test/test_classification.py, test/test_load.py: Rename Color.None
4092     to Color.Transparent.
4093    
4094     2003-04-04 Jonathan Coles <[email protected]>
4095 jonathan 603
4096     * Thuban/Model/classification.py: Fix assert calls.
4097     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4098     Copy the color parameter rather than hold onto a reference.
4099 jonathan 601
4100 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4101     the color object.
4102     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4103     are sure there exists only one refernce to Color.None in the system.
4104     This allows us to use 'is' rather than the comparision functions.
4105    
4106     * Thuban/Model/save.py: Fix assert calls.
4107    
4108     * Thuban/UI/classifier.py: Fix assert calls.
4109     (ClassGrid._OnCellDClick): Call up to the classifier to open the
4110     dialog to edit the groups properties.
4111     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4112     correctly if a cell is resized.
4113     (ClassTable.SetClassification): New. Changes the classification
4114     that is in the table.
4115     (ClassTable.__SetRow): Allow groups to be prepended.
4116     (Classifier): New code for opening the EditProperties and
4117     GenerateRanges dialogs.
4118     (SelectPropertiesDialog.__GetColor): Only set the color in the
4119     color dialog if the current color is not None.
4120    
4121     * Thuban/UI/dock.py: Fix assert calls.
4122    
4123     * Thuban/UI/legend.py: Fix assert calls.
4124    
4125     * Thuban/UI/renderer.py: Fix assert calls.
4126    
4127     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4128     classifications.
4129     (GenRangePanel): Panel specific to range generation.
4130     (GenSingletonPanel): Panel specific to singleton generation.
4131     (ClassGenerator): Class responsible for actually generating
4132     the classification from the data gathered in the dialog box.
4133     (PropertyRamp): Generates properties whose values range from
4134     a starting property to an ending property.
4135 jonathan 601
4136 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
4137    
4138     * test/support.py (print_garbage_information): New function that
4139     prints information about still connected messages and memory
4140     leaks.
4141     (run_suite): Removed.
4142     (run_tests): New function for use as a replacement of
4143     unittest.main in the test_* files. This one calls
4144     print_garbage_information at the end.
4145    
4146     * test/runtests.py (main): Use support.print_garbage_information
4147    
4148     * test/test_layer.py: Use support.run_tests instead of
4149     unittest.main so we get memory leak information
4150     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4151     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4152     (TestLayerLegend.test_visibility): Call the layer's Destroy method
4153     to fix a memory leak.
4154    
4155     * test/test_classification.py: Use support.run_tests instead of
4156     unittest.main so we get memory leak information
4157     (TestClassification.test_classification): Call the layer's Destroy
4158     method to fix a memory leak.
4159    
4160 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
4161    
4162 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4163     Handle the reference counts of the return value and errors in
4164     PyArg_ParseTuple correctly.
4165    
4166 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4167     sure the filename is absolute to avoid problems when saving the
4168     session again
4169    
4170 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4171    
4172 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
4173    
4174 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4175 jonathan 587 that there actually are points in the returned list of points
4176     before trying to index into the list. The list may be empty if
4177     the shape is a Null Shape.
4178    
4179 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
4180    
4181     * test/test_map.py: Don't use from <module> import *
4182    
4183 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
4184    
4185     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4186     LAYER_LEGEND_CHANGED
4187    
4188     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4189     self.Destroy() to close the window after yesterday's changes.
4190    
4191     * test/test_map.py, test/test_session.py: Fix messages that
4192     are sent from maps and layers.
4193    
4194 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
4195    
4196     * Thuban/UI/classifier.py: Commented out some debugging statements.
4197     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4198     RTbug #1769.
4199    
4200     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4201     position (although position doesn't work yet under GTK).
4202     (DockableWindow.Destroy): New. Called when the window must be
4203     closed. Namely needed when the DockFrame closes and must close
4204     its children.
4205     (DockFrame): Listen for EVT_CLOSE and destroy all children.
4206    
4207     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4208     when then window is told to close.
4209     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4210     comment in source for more info.
4211    
4212     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4213    
4214     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4215     symmetry with other such methods.
4216     (MainWindow.ShowLegend): Show the legend docked by default.
4217    
4218 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
4219    
4220     * Thuban/UI/classifier.py: Support for highlighting a specific
4221     group within the grid when the classification dialog is opened.
4222     Also contains a lot of debugging printouts which will later
4223     be removed.
4224    
4225     * Thuban/UI/dock.py: Complete rework on the dock code so that
4226     that it is fairly removed from the rest of the Thuban application.
4227     It is easy to add new docks which the rest of the program having
4228     to be aware of them.
4229    
4230     * Thuban/UI/legend.py: Modifications to support selecting a
4231     specific group in the classification dialog. Changed how layers
4232     are drawn when the layer is visible/invisible.
4233    
4234     * Thuban/UI/mainwindow.py: Removed legend specific code and
4235     replaced it with calls to the new dock code.
4236    
4237     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4238     to check if scale > 0. Trying to track down a divide by zero.
4239    
4240 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
4241    
4242 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4243     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4244     now part of DockableWindow.
4245     (LegendPanel.DoOnSelChanged): Select the current layer in the
4246     map.
4247     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4248     with the selected layer and/or group.
4249    
4250     2003-03-26 Jonathan Coles <[email protected]>
4251    
4252 jonathan 557 This putback contains the code for dockable windows. There is
4253     no support in wxWindows as of this date for windows that can
4254     attach themselves to other windows.
4255    
4256     The current model contains a DockableWindow which has a parent
4257     window for when it is detached and a dock window that it puts
4258     its contents in when it is docked. The contents of a DockableWindow
4259     must be a DockPanel. DockPanel itself derives from wxPanel.
4260    
4261     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4262     message, not a LAYER_LEGEND_CHANGED message.
4263    
4264     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
4265    
4266     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
4267     as one of the style properties for the fieldTypeText item to
4268     be sure that its size is correct when the text changes.
4269    
4270     * Thuban/UI/dock.py: New. Classes for the DockPanel and
4271     DockableWindow.
4272    
4273     * Thuban/UI/legend.py: Added some more buttons and made the
4274     LegendPanel a DockPanel.
4275    
4276     * Thuban/UI/mainwindow.py: Added sash windows to the main window
4277     and supporting functions for manipulating the sashes.
4278     (MainWindow.ShowLegend): Create a DockableWindow with the
4279     LegendPanel as the contents.
4280    
4281     * Thuban/UI/messages.py: Added DOCKABLE_* messages
4282    
4283     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
4284     not LAYER_LEGEND_CHANGED, messages.
4285    
4286 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
4287    
4288     * setup.py: Added custom script bdist_rpm_build_script so that
4289     when the rpm is built the path to wx-config is correct.
4290    
4291     * setup.cfg: Added line saying to use the custom build script
4292    
4293 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
4294    
4295     Initial implementation of the Legend.
4296    
4297     * Thuban/UI/legend.py: New. Creates a window that shows the map's
4298     Legend information and allows the user to add/modify classifications
4299     and how the layers are drawn on the map.
4300    
4301     * setup.py: New command 'build_docs' which currently uses
4302     happydoc to generate html documentation for Thuban.
4303    
4304     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
4305     Returns a string which is appropriately describes the group.
4306    
4307     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
4308     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
4309    
4310     * Thuban/Model/map.py (Map): Rename messages and use new, more
4311     specific, messages.
4312    
4313     * Thuban/Model/messages.py: New message to indicate that a layer's
4314     data has changed (LAYER_CHANGED). New map messages to indicate
4315     when layers have been added/removed/changed or if the stacking order
4316     of the layers has changed.
4317    
4318     * Thuban/Model/session.py: Rename and use new messages.
4319    
4320     * Thuban/UI/classifier.py: Remember if any changes have actually
4321     been applied so that if the dialog is cancelled without an application
4322     of changes we don't have to set a new classification.
4323     (ClassDataPreviewer): Pulled out the window specific code and put it
4324     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
4325     symbols on any DC.
4326    
4327     * Thuban/UI/mainwindow.py: New code to open the legend.
4328    
4329     * Thuban/UI/view.py: Use new message names.
4330    
4331 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
4332    
4333     * Thuban/UI/main.py (verify_versions): New. Checks the versions
4334     of Python, wxPython, and some other libraries.
4335    
4336     * extensions/thuban/wxproj.cpp (check_version): Checks the given
4337     version against what wxproj was compiled with.
4338     (check_version_gtk): If wxproj was compiled with gtk then check
4339     the given version against the version of the gtk library
4340     currently being used.
4341    
4342 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
4343    
4344     * test/test_command.py: Run the tests when the module is run as a
4345     script
4346    
4347     2003-03-14 Bernhard Herzog <[email protected]>
4348    
4349     Implement selection of multiple selected shapes in the same layer:
4350    
4351     - Introduce a new class to hold the selection. This basically
4352     replaces the interactor which was nothing more than the
4353     selection anyway. A major difference is of course that the new
4354     selection class supports multiple selected shapes in one layer
4355    
4356     - Move the object that represents the selection from the
4357     application to the canvas. The canvas is a better place than the
4358     application because the selection represents which shapes and
4359     layer of the map displayed by the canvas are selected and
4360     affects how the map is drawn.
4361    
4362     - Make the selection and its messages publicly available through
4363     the mainwindow.
4364    
4365     - The non-modal dialogs do not get a reference to the interactor
4366     anymore as they can simply refer to their parent, the
4367     mainwindow, for the what the interactor had to offer.
4368    
4369     * Thuban/UI/selection.py: New module with a class to represent the
4370     selection.
4371    
4372     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
4373     these unused messages
4374    
4375     * Thuban/UI/application.py (ThubanApplication.OnInit)
4376     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
4377     interactor is gone now.
4378     (ThubanApplication.CreateMainWindow): There is no interactor
4379     anymore so we pass None as the interactor argument for now for
4380     compatibility.
4381    
4382     * Thuban/UI/view.py (MapCanvas.delegated_messages)
4383     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
4384     Unsubscribe, delegate messages according to the delegated_messages
4385     class variable.
4386     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
4387     attributes from instance variables as described with the
4388     delegated_methods class variable.
4389     (MapCanvas.__init__): New instance variable selection holding the
4390     current selection
4391     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
4392     pass them on to the renderer
4393     (MapCanvas.SetMap): Clear the selection when a different map is
4394     selected.
4395     (MapCanvas.shape_selected): Simple force a complete redraw. The
4396     selection class now takes care of only issueing SHAPES_SELECTED
4397     messages when the set of selected shapes actually does change.
4398     (MapCanvas.SelectShapeAt): The selection is now managed in
4399     self.selection
4400    
4401     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
4402     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
4403     Unsubscribe, delegate messages according to the delegated_messages
4404     class variable.
4405     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
4406     attributes from instance variables as described with the
4407     delegated_methods class variable.
4408     (MainWindow.__init__): The interactor as ivar is gone. The
4409     parameter is still there for compatibility. The selection messages
4410     now come from the canvas.
4411     (MainWindow.current_layer, MainWindow.has_selected_layer):
4412     Delegate to the the canvas.
4413     (MainWindow.LayerShowTable, MainWindow.Classify)
4414     (MainWindow.identify_view_on_demand): The dialogs don't need the
4415     interactor parameter anymore.
4416    
4417     * Thuban/UI/tableview.py (TableFrame.__init__)
4418     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
4419     (LayerTableFrame.row_selected): The interactor is gone. It's job
4420     from the dialog's point of view is now done by the mainwindow,
4421     i.e. the parent. Subscribe to SHAPES_SELECTED instead
4422     of SELECTED_SHAPE
4423    
4424     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
4425     is gone. It's job from the dialog's point of view is now done by
4426     the mainwindow, i.e. the parent.
4427    
4428     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
4429     gone. It's job from the dialog's point of view is now done by the
4430     mainwindow, i.e. the parent.
4431    
4432     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
4433     gone. It's job from the dialog's point of view is now done by the
4434     mainwindow, i.e. the parent.
4435     (SessionTreeCtrl.__init__): New parameter mainwindow which is
4436     stored as self.mainwindow. The mainwindow is need so that the tree
4437     can still subscribe to the selection messages.
4438     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
4439     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
4440     selection is now accessible through the mainwindow. Subscribe to
4441     SHAPES_SELECTED instead of SELECTED_SHAPE
4442    
4443     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
4444     SHAPES_SELECTED message now.
4445     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
4446     so deal with multiple shapes
4447     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
4448     gone. It's job from the dialog's point of view is now done by the
4449     mainwindow, i.e. the parent.
4450    
4451     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
4452     parameter is now a list of shape ids.
4453     (RecordTable.SetTable): The second parameter is now a list of
4454     indices.
4455    
4456     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
4457     selected_shape parameter and ivar to selected_shapes. It's now a
4458     list of shape ids.
4459     (MapRenderer.draw_label_layer): Deal with multiple selected
4460     shapes. Rearrange the code a bit so that the setup and shape type
4461     distinctions are only executed once.
4462    
4463     * test/test_selection.py: Test cases for the selection class
4464    
4465 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
4466    
4467     * Thuban/Model/load.py: Temporary fix so that the xml reader
4468     doesn't cause Thuban to crash.
4469    
4470     * Thuban/Model/layer.py: Handle the cyclic references between
4471     a layer and its classification better, and be sure to disconnect
4472     the classification from the layer when the layer is destroyed
4473     so that we don't maintain a cyclic reference that may not be
4474     garbage collected.
4475    
4476     * Thuban/Model/classification.py: See comment for layer.py.
4477    
4478 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
4479    
4480     * HOWTO-Release: New. Information on the steps for releasing
4481     a new version of Thuban.
4482    
4483 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
4484    
4485     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
4486     Use True instead of true.
4487     (Classifier): Should have a single panel in which all the controls lie.
4488    
4489     * Thuban/UI/proj4dialog.py: Add normal border.
4490    
4491     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
4492    
4493     * Thuban/UI/mainwindow.py: Use True instead of true.
4494    
4495     * setup.py: Update some definitions to use wxWindows2.4 files
4496    
4497     * Data/iceland_sample_class.thuban: Fixed file so that the
4498     field_type information is present.
4499    
4500 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
4501    
4502 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
4503     field type label grow so that when the text changes the
4504     size is updated correctly. This may be a wxWindows bug.
4505    
4506     2003-03-10 Jonathan Coles <[email protected]>
4507    
4508 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
4509     SESSION_REPLACED.
4510    
4511     * Thuban/UI/classifier.py: Wrap text with _().
4512     (ClassGrid.CreateTable): Set dimensions and size hints here,
4513     instead of in Reset, so we only set the size once.
4514    
4515     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
4516    
4517     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4518     Call Close() instead of Shutdown().
4519    
4520     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4521    
4522     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4523     Go back to using OnClose() instead of Shutdown().
4524    
4525     2003-03-10 Jonathan Coles <[email protected]>
4526    
4527 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
4528     to know the old field index as well as the new one.
4529    
4530     2003-03-10 Jonathan Coles <[email protected]>
4531    
4532 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
4533     to correctly set the table information and call this from
4534     __init__ and from _OnFieldSelect so that all the information
4535     is up to date when the dialog opens and when a field is changed.
4536    
4537     2003-03-10 Jonathan Coles <[email protected]>
4538    
4539 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
4540     layer's message function directly, use the ClassChanged() method
4541     when then classification changes. SetField/SetFieldType/SetLayer
4542     must keep the information about field name and field type in
4543     sync when an owning layer is set or removed.
4544    
4545     * Thuban/Model/layer.py: Added ClassChanged() so that the
4546     classification can tell the layer when its data has changed.
4547     (Layer.SetClassification): Accepts None as an arguement to
4548     remove the current classification and correctly handles
4549     adding a new classification.
4550    
4551     * Thuban/Model/load.py: Comment out print statement
4552    
4553     * test/test_classification.py, test/test_save.py: New and
4554     improved tests.
4555    
4556 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
4557    
4558     * Thuban/Model/classification.py: Implemented __copy__ and
4559     __deepcopy__ for ClassGroup* and ClassGroupProperites so
4560     they can easily be copied by the classifier dialog.
4561     (ClassGroupProperites.__init__): The default line color should
4562     have been Color.Black.
4563    
4564     * Thuban/UI/classifier.py: Setting and Getting table values now
4565     uses a consistent set of functions.
4566     (Classifier): Now non-modal. Has field type label which changes
4567     as the field changes. Keep track of buttons in a list so that
4568     we can enable/disable the buttons when the None field is selected.
4569     (SelectPropertiesDialog): Add buttons to make the colors transparent.
4570    
4571     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
4572     does what OnClose did, but can be called by the application to
4573     close a window. Needed when a session changes, and we have to
4574     close the classifier windows.
4575    
4576     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4577     Shuts down open dialogs. Used when a new session is created
4578     or a session is opened.
4579     (MainWindow.SaveSession): Should only call application.SaveSession()
4580     if we don't call SaveSessionAs first.
4581     (MainWindow.Classify): Allow different classifier dialogs for
4582     different layers.
4583    
4584     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
4585     the parent class handle it. Add Shutdown() to unsubscibe from
4586     event notification and call the parent Shutdown(). This was
4587     necessary so the application can close the tree window.
4588    
4589 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
4590    
4591     * Thuban/Model/classification.py: Minor documentation changes,
4592     Addition of __eq__ and __ne__ methods.
4593     (Classification.SetLayer): prevent recursion between this method
4594     and Layer.SetClassification().
4595    
4596     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
4597    
4598     * Thuban/Model/layer.py (SetClassification): prevent recursion
4599     between this method and Classification.SetLayer().
4600    
4601     * test/test_classification.py, test/test_load.py,
4602     test/test_session.py: Fixed and added tests for the classification
4603     classes.
4604    
4605 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
4606    
4607     * Thuban/UI/classifier.py (ClassGrid.__init__)
4608     (ClassGrid.CreateTable): Move the SetSelectionMode call to
4609     CreateTable because otherwise it triggers an assertion in
4610     wxPython/wxGTK 2.4.
4611    
4612 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
4613    
4614 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
4615 jonathan 471
4616 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
4617 jonathan 471
4618 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
4619 jonathan 471
4620 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
4621 jonathan 471
4622     2003-03-05 Jonathan Coles <[email protected]>
4623    
4624 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
4625     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
4626     Store just the groups in the table and generate the other
4627     column information when it is requested. Add "None" field
4628     to pull-down to select no classification.
4629    
4630     * Thuban/common.py: Moved FIELDTYPE constants from table.py
4631     (Str2Num): Only catch ValueError exceptions.
4632    
4633     * Thuban/Model/classification.py: Class documentation. Renaming
4634     of methods with Stroke to Line. Groups are stored in a single
4635     list with the default as the first element. Groups are searched
4636     in the order they appear in the list.
4637    
4638     * Thuban/Model/color.py: Documentation.
4639    
4640     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
4641     the kind of data represented by a field.
4642    
4643     * Thuban/Model/load.py (ProcessSession): Use proper string
4644     conversion function; fixes RTbug #1713.
4645    
4646     * Thuban/Model/save.py (Saver): Store field type information.
4647    
4648     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
4649     (Table): Add field_info_by_name() to retrieve field information
4650     by specifying the field name, not the number.
4651    
4652     * Thuban/UI/mainwindow.py: Function name changes.
4653    
4654     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4655     get the layer classification once. Don't try to classify
4656     values when the field is None: just use the default properties.
4657    
4658     * Thuban/UI/view.py: Function name changes.
4659    
4660     * Doc/thuban.dtd: Add field_type attribute to a classification.
4661    
4662 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
4663    
4664 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
4665     the fill and stroke layer attributes optional with suitable
4666     default values. Add the stroke_width layer attribute. Use correct
4667     syntax for empty elements. Make the attribute list for labels
4668     refer to the label element.
4669    
4670     2003-03-04 Bernhard Herzog <[email protected]>
4671    
4672 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
4673     Python 2.3 containing some of the functionality we implement in
4674     setup.py ourselves.
4675    
4676     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
4677     before the selection mode. Doing it the other way round triggers
4678     an assertion in wxWindows.
4679    
4680     * Thuban/Model/save.py (escape): Fix typo in doc-string
4681    
4682     * Thuban/Model/classification.py: Remove unnecessary wxPython
4683     import
4684    
4685 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
4686    
4687     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
4688     Parameter 'value' should default to None.
4689    
4690     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
4691     the class attribute __classification is now private.
4692    
4693     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
4694     Classifier to ClassGrid. Added support for removing selected rows,
4695     which including code for keeping track of when cells are selected,
4696     and deselected.
4697     (ClassTable): Support for added/removing rows. Fixed a problem
4698     with __ParseInput whereby it would not allow strings (only numbers)
4699     to be entered.
4700     (Classifier): Added button and supporting code for removing
4701     selected rows.
4702    
4703 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
4704 jonathan 434
4705     * Thuban/common.py: Moved color conversion functions into
4706     Thuban/UI/common.py.
4707     (Str2Num): Now converts the float (not the string) to a long/int
4708     so that an exception isn't thrown.
4709    
4710     * Thuban/UI/common.py: Common functions used in several UI modules
4711    
4712     * Thuban/Model/classification.py: Changed the class hierarchy
4713     so that a Classification consists of Groups which return
4714     Properties when a value matches a Group.
4715    
4716     * Thuban/Model/layer.py: Fixed name resolution problem.
4717    
4718     * Thuban/Model/load.py: Use new Classification and Group functions.
4719    
4720     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
4721     failure.
4722     (Saver.write_classification): Use new Classification and Group
4723     functions.
4724    
4725     * Thuban/UI/classifier.py: Changes to use new Classification and Group
4726 jonathan 445 functions. Fix to create a tuple with a single value instead of
4727     simply returning the value.
4728 jonathan 434
4729     * Thuban/UI/renderer.py: Use new Classification and Group functions.
4730     Use common.py functions.
4731    
4732 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
4733 jonathan 447
4734     * test/test_classification.py: Use new Classification and Group
4735     classes.
4736 jonathan 434
4737 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
4738    
4739     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
4740     functions from Thuban color objects to wxWindow colour objects.
4741    
4742     * Thuban/Model/classification.py (Classification): Renamed
4743     GetProperties() to GetClassData(). Used the new iterator
4744     in TreeInfo().
4745     (ClassIterator): Iterator implementation to iterate over the
4746     ClassData objects in a classification object.
4747    
4748     * Thuban/Model/save.py (Saver.write_classificaton): Uses
4749     the new iterator to save the classification information.
4750    
4751     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
4752     for changing the stroke and fill colors and previewing the
4753     changes.
4754    
4755     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
4756     MainWindow.SaveSessionAs): Text string changes so the dialogs
4757     have more meaningful titles.
4758    
4759     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
4760     Classification method name from GetProperties to GetClassData.
4761    
4762     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
4763     instead of accessing now non-existent class variables.
4764    
4765 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
4766    
4767     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
4768     unneeded Shape() call. Rendering is substantially faster without
4769     it and it avoids some problems with broken shape files.
4770    
4771 frank 423 2003-02-20 Frank Koormann <[email protected]>
4772    
4773     Force minimal size of identify and label dialogs. The autosizing
4774     looked too ugly.
4775    
4776     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
4777     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
4778     Set size of listctrl.
4779     * Thuban/UI/identifyview.py (IdentifyView.__init__):
4780     Set size of dialog.
4781    
4782 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
4783    
4784     * test/test_classification.py, test/test_layer.py,
4785     test/test_load.py, test/test_map.py, test/test_session.py:
4786     Updated the tests to use the new functions that are in the
4787     respective classes.
4788    
4789     * Thuban/Model/classification.py (Classification):
4790     Uses the new ClassData* classes. Modification messages are
4791     passed up to the parent layer (if it exists).
4792     (ClassData): New class to encapsulate the common data in each
4793     classification property.
4794     (ClassDataDefault): Represents the Default class. data.
4795     (ClassDataPoint): Represents a single class. data point
4796     (ClassDataRange): Represents a class. range
4797     (ClassDataMap): Represents a class. map (unused).
4798    
4799     * Thuban/Model/color.py: Added Color.None to represent something
4800     with no color. Color.Black represents the color black.
4801     (NoColor): Helper class derived from Color to represent something
4802     with no color.
4803    
4804     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
4805     stroke_width attributes. Made the 'classification' attribute private.
4806     New methods for setting/getting the classification.
4807    
4808     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
4809     to get the classifcation and use the new ClassData* classes to
4810     hold the classification data. Use Str2Num to convert numbers
4811     properly.
4812    
4813     * Thuban/Model/save.py (Saver): Use new Color and Classification
4814     methods
4815    
4816     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
4817     custom grid.
4818     (ClassTable): Support for editing Values and Labels and for
4819     changing what type (point or range) of data is stored in each
4820     property based on how the user enters the data.
4821     (Classifier): Support for saving the new classifications and
4822     launching the dialog to edit a property.
4823     (SelectPropertiesDialog): New class for editing the visual
4824     properties of a classification (stroke color, width, and fill color)
4825     (ClassPreviewer): Took the Draw method from ClassRenderer and
4826     made most of it into this new class. Intend to use this class in
4827     the SelectPropertiesDialog for previewing changes.
4828    
4829     * Thuban/UI/renderer.py: Use new Color and Classification methods.
4830    
4831     * Thuban/UI/tree.py: Formatting changes.
4832    
4833     * Doc/thuban.dtd: Add 'label' element
4834    
4835     * Thuban/common.py: New. Contains common routines used throughout
4836     the code.
4837     (Str2Num): Takes a string and converts it to the "best" type of
4838     number.
4839    
4840 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
4841    
4842     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
4843     dragging flag is always set to 0 even when the tool implementation
4844     raises an exception
4845    
4846 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
4847    
4848     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
4849     method to create a splash screen.
4850     (ThubanApplication.ShowMainWindow): New. Show the main window.
4851     Needed so the splash screen can display the mainwindow
4852     (ThubanApplication.OnInit): Call the
4853     new splash_screen method to determine whether the application
4854     should display a splash screen. If it displays a splash screen do
4855     not immediately show the main window.
4856    
4857 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
4858    
4859     * Thuban/Model/classification.py: Added import line to fix
4860     feature conflicts between running on python2.2 and python2.1.
4861    
4862     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
4863     onto the clinfo parameter, so removed the deepcopy().
4864    
4865 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
4866    
4867 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4868 jonathan 396 Added element_open variable to track opening and closing of tags
4869     so that tags that don't span more than one line are closed with
4870     /> instead of </tag_name>. Use the GetDefault*() methods of
4871     the Classification class.
4872    
4873     * Thuban/Model/classification.py (Classificaton): Added set and
4874     get methods for the default data. The class also takes a layer
4875     reference so that modification messages can be sent. Fixed the
4876     methods to use the new ClassData class.
4877     (ClassData): New class to encapsulate the classification data
4878    
4879     * Thuban/Model/layer.py (Layer): Remove the
4880 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4881 jonathan 396 SetDefault*() methods on the layer's classification object.
4882 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
4883 jonathan 396 Classification class.
4884    
4885     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4886     object instead of a dictionary.
4887    
4888 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
4889 jonathan 396 draw the classifications in the dialog box's table.
4890     (Classifier): Modified to use the ClassRenderer class.
4891    
4892 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
4893     methods of the Classification class.
4894 jonathan 396
4895     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
4896     of the ClassData class.
4897    
4898     * test/test_classification.py, test/test_layer.py,
4899     test/test_map.py, test/test_session.py: Fix the tests to work
4900     with the above code changes.
4901    
4902 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
4903    
4904     * Thuban/Model/classification.py (Classification): Added getNull()
4905     to return the NullData reference
4906    
4907     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
4908     Layer.SetStrokeWidth): Modified these functions to change the
4909     null data in the classification rather than keep these values
4910     directly in the Layer class. Menu options to change these values
4911     work again.
4912    
4913 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
4914    
4915 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
4916 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
4917 jonathan 380 classification data.
4918    
4919 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
4920     Colors in the tree view.
4921    
4922     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
4923     the tree info for classifications. Commented out unnecessary lines.
4924    
4925     * Thuban/Model/classification.py (Classification.TreeInfo): New
4926     function to add information about the classification into the
4927     tree view.
4928    
4929 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
4930 jan 375
4931 tkoester 403 * Thuban/__init__.py (_): New.
4932 jan 375
4933     * Thuban/Model/classification.py, Thuban/Model/extension.py,
4934     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
4935 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
4936     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
4937     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
4938     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
4939     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
4940     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
4941 jan 375
4942 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
4943    
4944 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
4945 jonathan 370
4946 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
4947     a layer classification. Supports specific data points and
4948     ranges.
4949 jonathan 370
4950 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
4951     information.
4952 jonathan 370
4953 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
4954     information.
4955 jonathan 370
4956 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
4957     specifying classification information.
4958 jonathan 370
4959 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
4960     dialog.
4961 jonathan 370
4962 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
4963     classification information.
4964 jonathan 370
4965 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
4966     classification data.
4967 jonathan 370
4968 tkoester 403 * test/test_classification: Tests for the Classification class.
4969 jonathan 370
4970 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
4971    
4972 bh 361 * test/test_command.py: New. Tests for the command classes.
4973    
4974 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
4975     (Command.IsTool): New method to distinguish between command
4976     switching tools and other commands.
4977    
4978     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
4979     the tool to avoid direct assignments to instance variables
4980     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
4981     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
4982     change the tool
4983    
4984     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
4985     active tool's command turns insensitive, disable the tool.
4986     (_tool_command): Use the new ToolCommand class
4987    
4988     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
4989     SelectTool method to change the tool
4990     (iconfile): Use the ToolCommand class
4991    
4992 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
4993    
4994     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
4995     the case of selected items that are not children of Layers or Maps
4996     properly. Previously this bug would trigger an assertion in
4997     wxWindows.
4998    
4999 frank 352 2002-11-06 Frank Koormann <[email protected]>
5000    
5001 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
5002     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
5003     Full Extent).
5004 tkoester 403
5005 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
5006    
5007     * setup.py (setup call): version now 0.1.3
5008    
5009     * MANIFEST.in: Add the files in test/
5010    
5011     * test/README: Add note about tests requiring the iceland data
5012    
5013     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
5014     copyright notice.
5015    
5016 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
5017    
5018     * test/test_map.py
5019     (TestMapWithContents.test_projected_bounding_box): Use an explicit
5020     epsilon.
5021    
5022     * test/support.py (FloatComparisonMixin.assertFloatEqual)
5023     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
5024     message if the assertion fails and don't return the return value
5025     of self.assert_. In assertFloatSeqEqual the return meant that not
5026     all items of the sequence were compared.
5027    
5028 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
5029    
5030 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
5031    
5032     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
5033    
5034 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
5035     the string with the bounding box on the fly because of platform
5036     differences in the way %g is handled.
5037    
5038     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
5039     DBFfile too because Thuban layers can't yet cope missing DBF
5040     files.
5041    
5042     2002-09-20 Bernhard Herzog <[email protected]>
5043    
5044 bh 326 * test/test_menu.py: Use initthuban instead of
5045     add_thuban_dir_to_path to initialize Thuban.
5046    
5047     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
5048     Mixin class for float comparisons
5049     (SubscriberMixin): New. Mixin class to test messages sent through
5050     the Connector class
5051    
5052     * test/README: Fix a typo and add the -v flag to the command for
5053     individual tests
5054    
5055 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
5056    
5057     * test/test_proj.py: New. Test cases for Thuban.Model.proj
5058    
5059     * test/test_map.py: New. Test cases for Thuban.Model.map
5060    
5061     * test/test_layer.py: New. Test cases for Thuban.Model.layer
5062    
5063     * test/test_label.py: New. Test cases for Thuban.Model.label
5064    
5065     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5066    
5067     * test/test_color.py: New. Test cases for Thuban.Model.color
5068    
5069     * test/test_base.py: New. Test cases for Thuban.Model.base
5070    
5071 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
5072    
5073     * Thuban/Model/session.py (Session.forwarded_channels): Forward
5074     the CHANGED channel too.
5075    
5076     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5077     CHANGED channel too.
5078     (Map.__init__): Call the Modifiable constructor as well.
5079    
5080     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5081     event if the modified flag changes.
5082     (Modifiable.changed): Tweak the doc-string.
5083    
5084     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5085     (MainWindow.set_position_text): Put the code that puts the text
5086     with the mouse position into the status bar into the new method
5087     set_position_text so that it can overwritten in derived classes.
5088    
5089 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
5090    
5091     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5092     message box on the main window.
5093    
5094 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
5095    
5096     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5097     the 'E' because it's less likely to interfere with other menu
5098     entries.
5099 bh 315 (MainWindow.build_menu): remove an incorrect comment.
5100 bh 313
5101 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
5102    
5103     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5104     (_tool_command): Add sensitive parameter
5105     (_has_visible_map): Sensitivity callback to tools and other
5106     commands that require a visible map. Use it in map_zoom_in_tool,
5107     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5108     and map_full_extent
5109    
5110 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
5111    
5112     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5113     VIEW_POSITION
5114    
5115 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
5116 frank 306
5117     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5118    
5119 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
5120    
5121 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5122     wxWindows already and our implementation doesn't work correctly
5123     with wxGTK 2.3:
5124     (MapCanvas.__init__): Remove the instance variable
5125     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5126     be drawin
5127     (MapCanvas.OnIdle): Removed.
5128    
5129 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5130     a parameter to determine the size of the rectangle.
5131     (MapCanvas.find_shape_at): Create the box around the point on a
5132     layer by layer basis and make the size depend on the shape type.
5133     This solves a problem with the selection of point shapes at the
5134     border of the layer's bounding box
5135    
5136 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
5137    
5138 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5139     for the sensitivity of remove layer.
5140     (_can_remove_layer): New. Sensitivity callback for remove layer
5141     (Command layer_remove): Use _can_remove_layer
5142    
5143     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5144     determine whether a given layer can be deleted.
5145    
5146 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5147     (MapCanvas.do_redraw): Get rid of the unused update_region
5148     instance variable
5149    
5150 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
5151    
5152 bh 292 * test/: new subdirectory with a bunch of unit tests.
5153    
5154     * test/README, test/test_table.py, test/test_save.py,
5155     test/test_menu.py, test/test_load.py: Initial set of tests and
5156     brief instructions on how to run them
5157    
5158 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
5159    
5160 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5161     arcs with multiple parts.
5162    
5163 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5164     Handle degenrate rectangles.
5165    
5166 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
5167     (Table.__init__): Keep track of whether the DBF is open for
5168     writing
5169     (Table.write_record): Open the DBF file for writing when necessary
5170    
5171 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
5172    
5173     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5174     dbf files only for reading by default. Use a new writable dbf
5175     object for writing.
5176    
5177 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
5178    
5179 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
5180     (MainWindow.Context): New method to return a context
5181     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5182     new method
5183    
5184 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5185     layer table specific code from TableGrid into LayerTableGrid
5186     (TableFrame, LayerTableFrame): Split the layer table specific code
5187     from TableFrame into LayerTableFrame
5188 bh 280 (LayerTableGrid.select_shape): Remove a debug print
5189 bh 278
5190     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5191     LayerTableFrame
5192    
5193 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
5194    
5195     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5196     absolute filename.
5197    
5198 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
5199    
5200 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
5201     records.
5202 tkoester 403 (Table.__init__): Open the DBF file for writing too.
5203 bh 275
5204     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5205     into the underlying table.
5206    
5207     * extensions/shapelib/shapefil.h (DBFCommit),
5208     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5209     commit any changes made to the DBF file.
5210    
5211 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
5212     (_tool_command): Put the code that generates the "checked"
5213     callback into a separate function so that we can reuse it
5214     elsewhere
5215    
5216 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
5217     session into an XML file. The main reason to introduce a class is
5218     that applications built on Thuban can derive from it so that they
5219     can save additional information in a session file.
5220     (save_session): Delegate almost all the work to the Saver class.
5221     Rename the filename argument to file because it may be a file like
5222     object now.
5223    
5224     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5225     code. Remove the little test code which would be executed when the
5226     module is run as a script which didn't work anymore since it can't
5227     import the other Thuban modules.
5228     (ProcessSession, load_session): Refactor the ProcessSession to
5229     have one method for each element start and end tag so that derived
5230     classes can easily override the processing of individual tags.
5231     Also, always parse with namespaces enabled because applications
5232     built on top of Thuban will likely use namespaces if they extend
5233     the session file format.
5234    
5235 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
5236    
5237     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5238     because thubaninit_contents will do it for us.
5239    
5240 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
5241 jan 265
5242     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5243     tree window already open
5244    
5245 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
5246    
5247 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5248     with self.
5249    
5250     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5251     when we have actually captured it.
5252    
5253 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5254     shapefile and destroy the table.
5255    
5256     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5257    
5258 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
5259    
5260 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5261     instance variable columns
5262     (RecordTable.GetTypeName): row and col may be negative in some
5263     cases.
5264    
5265 bh 254 * setup.py (InstallLocal.initialize_options)
5266     (InstallLocal.finalize_options, InstallLocal.user_options): New
5267     option create-init-file to build a thubaninit.py when running
5268     install_local
5269     (InstallLocal.run): Create the thubaninit.py module when requested
5270     (thubaninit_contents): Split the template into several parts and
5271     create a new function thubaninit_contents that creates the
5272     contents of a thubaninit module.
5273     (ThubanInstall.run): Use the new function to create the thubaninit
5274     module.
5275    
5276 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
5277    
5278     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
5279     cleanup.
5280     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
5281    
5282     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
5283     direct base class' Destroy method.
5284    
5285     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
5286     layers.
5287     (Map.Destroy): Destroy the label_layer as well and call the
5288     inherited Desatroymethod first so that no more messages are
5289     issued.
5290     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
5291     message if the stacking order actually has changed. Add
5292     doc-strings.
5293     (Map.BoundingBox): Correct the doc-string.
5294     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
5295     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
5296    
5297     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
5298     all labels.
5299    
5300 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
5301    
5302     * Thuban/Model/map.py (Map.subscribe_layer_channels)
5303     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
5304     to a layer's channels into separate methods.
5305     (Map.RemoveLayer, Map.AddLayer): Call the new methods
5306     (Map.Destroy): Unsubscribe from a layer's channels before
5307     destroying it.
5308    
5309     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
5310     selected_layer parameter to searched_layer which is the layer to
5311     search in.
5312     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
5313     search to that layer. Return the selected layer and shape.
5314    
5315     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
5316     typo
5317    
5318 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
5319    
5320 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
5321     Extend the doc string.
5322     (ThubanApplication.subscribe_session)
5323     (ThubanApplication.unsubscribe_session): New methods to
5324     subscribe/unsubscribe to/from session channels.
5325     (ThubanApplication.SetSession): Call the new methods here.
5326     (ThubanApplication.maps_changed, ThubanApplication.set_map):
5327     Renamed set_map to maps_changed. Its now a subscriber for
5328     MAPS_CHANGED.
5329    
5330     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
5331     x-coordinate in case of simple clicks
5332    
5333     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
5334     don't pass it as a parameter
5335    
5336     * Thuban/Model/session.py (Session.RemoveMap): New
5337    
5338 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5339     window size into a parameter.
5340    
5341 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
5342    
5343 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5344     just commands.
5345    
5346 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
5347     parameter list a bit to allow setting the window title and the
5348     initial message in the status bar. Update the callers.
5349    
5350     * Thuban/UI/application.py (ThubanApplication.OnInit)
5351     (ThubanApplication.CreateMainWindow): Put the mainwindow
5352     instantiation into a separate method so that it can be overridden
5353     by a subclass.
5354    
5355 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
5356    
5357 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
5358     another changed message is issued to make it easier to get
5359     notified of changes.
5360     (Session): Update the doc string
5361     (Session.forward): Issue changed-events as CHANGED as well.
5362     (Session.changed): Overwrite the inherited version to issue
5363     CHANGED events as well.
5364    
5365     * Thuban/UI/tree.py: We can now simply subscribe to the session's
5366     CHANGED channel to be informed of changes.
5367     (SessionTreeCtrl.session_channels): Not needed any longer.
5368 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5369 bh 234 Only have to (un)subscribe CHANGED
5370    
5371     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5372    
5373 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
5374     for the wxPython locale bug to __init__.py so that it's
5375     automatically executed by anybody using UI code from Thuban.
5376    
5377 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
5378    
5379 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
5380    
5381     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
5382     as parameter and store it in an instance variable
5383     (MainWindow.invoke_command, MainWindow.update_command_ui)
5384     (MainWindow.save_modified_session, MainWindow.NewSession)
5385     (MainWindow.OpenSession, MainWindow.SaveSession)
5386     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
5387     application object.
5388    
5389     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
5390     the main window with self.
5391    
5392 bh 225 * Thuban/UI/context.py: New module with the context class
5393    
5394     * Thuban/UI/command.py (Command): Update doc string.
5395    
5396     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
5397     MainWindow.update_command_ui): Pass an instance of the context
5398     class to the command's methods
5399     (check_current_tool, call_method): Handle the new context
5400     implementation
5401    
5402     * Examples/simple_extensions/simple_tool.py (simple_tool,
5403     check_simple_tool): Handle the new context implementation
5404    
5405     * Examples/simple_extensions/simple_command.py (simple_command):
5406     Handle the new context implementation. Update the comments about
5407     the context.
5408    
5409     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
5410     doc-string
5411     (ThubanApplication.Session): New method to return the session
5412     object
5413    
5414     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
5415     interactor's selected_layer may not be a layer of the current
5416     session when the tree is updated while a new session is being set.
5417    
5418 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
5419    
5420     * Thuban/UI/tree.py (color_string): Removed. No longer used.
5421     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
5422     update_tree into update_tree and add_items. The tree now uses a
5423     more generic way to display the contents of the tree.
5424     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
5425    
5426     * Thuban/Model/layer.py (Layer.TreeInfo),
5427     Thuban/Model/extension.py (Extension.TreeInfo),
5428     Thuban/Model/map.py (Map.TreeInfo),
5429 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
5430 bh 217 Add TreeInfo methods to implement the new tree view update scheme
5431    
5432 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
5433    
5434     * Thuban/UI/application.py: Don't use "import from" for the
5435     MainWindow. It can't always be resolved.
5436     (ThubanApplication.OnInit): change reference to MainWindow
5437     accordingly.
5438    
5439     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
5440     completely
5441    
5442 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
5443    
5444     * setup.py (create_init_module): New configurable variable whose
5445     default depends on the platform we're running on.
5446     (ThubanInstall.initialize_options): Initialize
5447     self.create_init_module from the global create_init_module
5448     (ThubanInstall.user_options): indictate that the options
5449     create-init-module and init-module-dir have arguments.
5450    
5451     * setup.py: In the setup call change the version number to include
5452     cvs.
5453    
5454     * MANIFEST.in: Add the files in Examples
5455    
5456 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
5457    
5458 bh 210 * setup.py: In the setup call, use the thuban homepage as the
5459     value of the url parameter.
5460    
5461 bh 208 * Examples: New subdirectory for examples.
5462    
5463     * Examples/simple_extensions/simple_tool.xpm,
5464     Examples/simple_extensions/simple_tool.py,
5465     Examples/simple_extensions/simple_command.py,
5466     Examples/simple_extensions/README: Simple examples showing how to
5467     add new commands and tools.
5468    
5469 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
5470     bdist_rpm that we also have an install script.
5471     (bdist_inno): Add 2002 to the copyright notice.
5472    
5473 bh 205 * setup.py: Create a file in python's site-packages directory to
5474     make installation of Thuban as a library easier.
5475     (ThubanInstall.user_options): Add two new options,
5476     create-init-module and init-module-dir
5477     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
5478     filenames for installation in the default directories.
5479     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
5480     the inherited methods to capture some filenames before they're
5481     transformed too much by distutils.
5482     (ThubanInstall.run): Create the init module if requested.
5483     (ThubanInstall.thuban_init_filename): New method to return the
5484     full name of the init module.
5485     (ThubanInstall.get_outputs): Append the filename of the init
5486     module.
5487    
5488 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
5489    
5490 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
5491     handle the prefix properly which means that the default for the
5492     installation prefix should be /usr for RPMs and /usr/local when
5493     doing a normal source install.
5494     (bdist_rpm_install_script): Script to override the default install
5495     commands in the specfile generated by the bdist_rpm command.
5496     (thuban_bdist_rpm.user_options): Add a prefix option
5497     (thuban_bdist_rpm.initialize_options): Init the prefix option.
5498     Create the script files for the spec files as empty files here
5499     (thuban_bdist_rpm._make_spec_file): Override the inherited method
5500     to fill the script files with content.
5501    
5502 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
5503     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
5504     argument. save_session now automatically uses this version,
5505     solving a problem when saving to a relative filename.
5506    
5507     * setup.py: In the setup call, make sure that the library
5508     directories are under $prefix/lib not directly under $prefix.
5509    
5510 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
5511 jan 199
5512     * Thuban/Model/extension.py: new module to handle extension objects.
5513     * Thuban/Model/messages.py: new messages for extensions.
5514     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
5515     Session.AddExtension): new for handling extensions.
5516     Also some other minor changes to round up extension handling.
5517     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
5518     of Extension titles and title and names of its objects.
5519    
5520 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
5521    
5522     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
5523 bh 202 the events for a command.
5524 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
5525     Call bind_command_events to bind the events. add_toolbar_command
5526     can now bind events too so that it's possible to have commands
5527     that are only available through the toolbar.
5528     (MainWindow.init_ids): New instance variable events_bound to keep
5529     track of for which commands events have been bound.
5530    
5531 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
5532    
5533     * Thuban/UI/menu.py: New module to build and manage menus.
5534    
5535     * Thuban/UI/mainwindow.py: Remove some unused imports.
5536     (MainWindow.__init__, main_menu): move the definition of the main
5537     menu from __init__ to the Menu instance main_menu.
5538     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
5539     build the menu bar and sub-menus from a menu description.
5540    
5541     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
5542     startup file
5543     (ThubanApplication.read_startup_files): New method to run
5544     ~/.thuban/thubanstart.py
5545    
5546 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
5547     Move the toolbar definition to the Menu instance main_toolbar.
5548     (MainWindow.build_toolbar): New method to build the toolbar
5549     similar to the build_menu methods
5550    
5551 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
5552    
5553 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
5554     layer_outline_color. Fix it in the definition of the command too.
5555    
5556 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
5557    
5558 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
5559    
5560     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
5561     in the docstring
5562    
5563 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
5564    
5565 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
5566     when the shapefile is empty.
5567     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
5568     now return None for empty shapefiles. Update doc-strings.
5569    
5570     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
5571     the layer's bbox being None.
5572    
5573     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
5574     layer's bbox being None.
5575    
5576 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
5577     necessary.
5578     (MapCanvas.__init__): New instance variables, last_selected_layer
5579     and last_selected_shape to determine how the selection has
5580     changed.
5581    
5582     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
5583     AutoSizeColumns because it will cause a traversal of the entire
5584     table which for large .dbf files will take a very long time.
5585    
5586 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
5587    
5588     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
5589     maximum depth for the tree than shapelib does by default.
5590    
5591 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
5592    
5593     * setup.py (py_modules): The shptree modules doesn't have a
5594     wrapper, so don't include it in the py_modules
5595    
5596 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
5597    
5598     * extensions/shapelib/shptree.c (compare_ints): Make arguments
5599     const void * as in the qsort prototype
5600     (SHPTreeFindLikelyShapes): Remove some unused variables.
5601    
5602     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
5603     maintains to redraw the window during a drag.
5604     (MapCanvas.unprojected_rect_around_point): New method to determine
5605     a small region around a point for hit-testing.
5606     (MapCanvas.find_shape_at): Only test the shapes in a small region
5607     around the point.
5608    
5609     * setup.py: Increment the version to 0.1.2
5610    
5611     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
5612     debug print and set session to None after unsubscribing
5613    
5614 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
5615    
5616 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
5617     the file to have a .thuban extension.
5618    
5619 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
5620     all the session channels to subscribe to to update the tree
5621     (SessionTreeCtrl.session_changed): Remember the session so that we
5622     can unsubscribe properly. Use the new class constant to
5623     unsubscribe from the old session and subscribe to the new one.
5624     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
5625     subscriptions of the SessionTreeCtrl.
5626     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
5627    
5628     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
5629     Session Tree" command to the file menu.
5630    
5631     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
5632     as update_region to the renderer.
5633    
5634     * Thuban/UI/renderer.py
5635     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
5636     update box is now directly a tuple, not a wxRect anymore.
5637    
5638     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
5639     prints.
5640    
5641     2002-05-07 Bernhard Herzog <[email protected]>
5642    
5643 bh 146 * setup.py: Add the shptree extension module. See
5644     extensions/pyshapelib/ChangeLog for more details.
5645    
5646     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
5647     extensions/shapelib/dbfopen.c: Really update to the versions of
5648     shapelib 1.2.9. For some reason it wasn't really done on
5649     2002-04-11.
5650    
5651     * extensions/shapelib/shptree.c: Modified version of shptree.c of
5652     shapelib 1.2.9. The only real difference is the use of qsort
5653     instead of a bubble sort implementation
5654    
5655     * Thuban/Model/layer.py (Layer.__init__): New instance variable
5656     shapetree to hold the shapelib quadtree for the shapefile
5657     (Layer.open_shapefile): Create the quad tree.
5658     (Layer.ShapesInRegion): New method to return the ids of shapes in
5659     a given region using the quad tree.
5660    
5661     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
5662     comment
5663     (draw_polygon_shape): Accept both arcs and polygons.
5664     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
5665     the api.
5666    
5667     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
5668     return the shape ids to be rendered in a given layer.
5669     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
5670     ids. Use draw_polygon_shape to draw arc shapes as well.
5671     (ScreenRenderer.RenderMap): New parameter for the rectangle that
5672     has to be updated
5673     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
5674     calling it's ShapesInRegion method.
5675    
5676     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5677     update_region for the update region.
5678     (MapCanvas.OnPaint): Maintain the update region
5679     (MapCanvas.do_redraw): Pass the bounding box of the update_region
5680     to the renderer when drawing the bitmap. Reset the update_region.
5681    
5682 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
5683    
5684 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
5685     MainWindow.OpenSession): Change the file extension of the session
5686     files to .thuban
5687    
5688 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
5689     Move the map channels to be forwarded by the session into the
5690 bh 146 class constant with forwarded_channels. Also add
5691     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
5692     forwarded_channels
5693 bh 129
5694     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
5695     typo and some rewording).
5696    
5697 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
5698    
5699     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
5700     around to speed up most redraws:
5701     (MapCanvas.__init__): New instance variable bitmap which holds the
5702     bitmap
5703     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
5704     self.bitmap to draw.
5705     (MapCanvas.full_redraw): New method to force a full redraw
5706     including the bitmap
5707     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
5708     make sure the bitmap is redrawn.
5709     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
5710     MapCanvas.shape_selected): Call full_redraw instead of readraw to
5711     make sure the bitmap is redrawn.
5712     (MapCanvas.OnSize): New method to handle size events so that the
5713     bitmap can be redrawn.
5714    
5715 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
5716    
5717     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
5718     canvas' VIEW_POSITION event
5719     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
5720     Update the text in the status-bar accordingly.
5721    
5722     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
5723     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
5724     called.
5725     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
5726     current_position
5727     (MapCanvas.set_current_position): New method to set
5728     current_position. Issue a VIEW_POSITION event
5729     (MapCanvas.CurrentPosition): New public method to return the value
5730     of current_position. Should be called when the VIEW_POSITION event
5731     is processed.
5732     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
5733     Update the position.
5734     (MapCanvas.OnLeaveWindow): Set the position to None.
5735    
5736     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
5737     position in the statusbar
5738    
5739 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
5740 frank 120
5741     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
5742    
5743 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
5744    
5745 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
5746    
5747     * Resources/Bitmaps/fullextent.xpm: new
5748 jan 116
5749 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
5750 jan 116
5751 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
5752     box
5753 jan 114
5754 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
5755    
5756 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
5757    
5758     * Thuban/UI/tree.py (update_tree): added added map extent
5759    
5760     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
5761 tkoester 403 icon; added map_full_extend as tool
5762 jan 114
5763 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
5764 jan 107
5765     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
5766     saving _new_ sessions
5767    
5768     * Thuban/Model/session.py (create_empty_session): new session
5769     don't have a filename (set to None)
5770    
5771     * Thuban/UI/tree.py (update_tree): added filename and modified flag
5772    
5773     * Thuban/Model/load.py (ProcessSession): convert projection
5774     parameters from unicode to regular string
5775    
5776     * Data/iceland_sample.session: Added UTM Zone 26 projection.
5777    
5778 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
5779    
5780     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
5781     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
5782     1.2.9
5783    
5784     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
5785     the pyshapelib directoy into the list of include dirs, so that
5786     pyshapelib_api.h can be found.
5787    
5788     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
5789     holds the pyshapelib C-API
5790     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
5791     pyshapelib_api to access the shapelib functions.
5792     (initwxproj): Import the c_api from the shapelib module and
5793     initialize pyshapelib_api.
5794    
5795 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
5796    
5797 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
5798     initialize_options to create the scripts for the rpm.
5799    
5800 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
5801    
5802 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
5803    
5804 bh 87 * setup.py: Increment version to 0.1.1
5805    
5806 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
5807     Layer" and "Remove Layer" commands from the layer menu to the map
5808     menu
5809    
5810 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
5811    
5812     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
5813     argument (python <= 1.5.2 erroneously accepted multiuple
5814     arguments)
5815    
5816 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
5817    
5818     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
5819     RecordGrid in the identifyview.
5820     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
5821     IdentifyListCtrl. The grid allows editing of the values.
5822    
5823     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
5824     implementing a grid for a single row of a thuban table.
5825    
5826     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
5827     layers by default. Easier to use than the previous default of only
5828     searching through the select layer which meant that if no layer
5829     was selected, you couldn't select a shape.
5830    
5831     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
5832    
5833     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
5834     stroke_width attribute
5835    
5836     * Thuban/Model/save.py (save_session): Write the new stroke_width
5837     attribute
5838    
5839     * Thuban/Model/load.py (ProcessSession.startElement): Read the
5840     stroke_width attribute
5841    
5842     * Thuban/Model/layer.py (Layer.__init__): New parameter and
5843     instance variable stroke_width
5844     (Layer.SetStrokeWidth): Set the stroke_width.
5845    
5846 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
5847    
5848     * extensions/thuban/wxproj.cpp (project_points): Fix two
5849     off-by-one errors in the last loop that joins the various parts
5850     together.
5851    
5852 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
5853    
5854     * setup.py (data_dist.make_distribution): Fix some typos
5855    
5856 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
5857    
5858     * README: Slight tweaking in preparation for the 0.1 release
5859    
5860     * setup.cfg: Add section for sdist to create both tgz and zip
5861     archives
5862    
5863     * setup.py: increase version number to 0.1
5864     (data_dist): New command class for data distribution
5865    
5866 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
5867    
5868 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5869     Handle the case of no layer (i.e. layer is None) properly.
5870    
5871 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5872 bh 70 Set the initial selection of the combo boxes to reflect the
5873     projection we're starting with in a way that works on windows,
5874     too.
5875    
5876 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
5877     puiblisher's ids in hex to make it easier to compare them to the
5878     standard repr of python methods
5879    
5880     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
5881     messages
5882    
5883 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
5884    
5885 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
5886     deselect the layer if no layer is selected
5887    
5888 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
5889     idle time when there actually is something to draw. If there's
5890     nothing to draw simply clear the window
5891     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
5892     (MapCanvas.SetMap): force a redraw in all cases because
5893     FitMapToWindow doesn't always do it.
5894     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
5895     specify the point to move into the center of the window
5896     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
5897     dragged, zoon in/out by a factor of 2
5898 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
5899     index, i.e. reversed drawing order) so that objects appearing to
5900     be in from of others are selected first. This is probably mostly
5901     relevant for point shapes where the symbols used may overlap
5902 bh 59
5903     * Thuban/Model/session.py (create_empty_session): Unset the
5904     modified bit before returning it
5905    
5906     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
5907     create_empty_session session to create the new, empty session.
5908    
5909     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
5910     the tool bitmaps.
5911     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
5912     the code that asks whether the session should be saved into the
5913     new method save_modified_session.
5914     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
5915     method to save modified session here too.
5916    
5917 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
5918    
5919     * setup.py (InnoIconItem): fix typo
5920    
5921     (thuban_bdist_inno.run):
5922     (bdist_inno.run): Move the decision not to create symlinks on
5923     non-nt platforms to thuban_bdist_inno and do it unconditinally
5924     since we never want to create the symlinks here
5925    
5926 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
5927    
5928 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
5929     identify view immediately
5930    
5931     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
5932     and SelectableRecordListCtrl that implement the code shared by the
5933     identify view and the label dialog
5934    
5935     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
5936     new class RecordListCtrl
5937    
5938     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
5939     return value of GetValue is None instead of using it as a boolean
5940     directly so that Zero numbers are handled properly.
5941     (LabelListCtrl): Derive from the new class
5942     SelectableRecordListCtrl
5943    
5944 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
5945     (Proj4Dialog.dialogLayout): Make the window resizable and set the
5946     size of the text control explicitly to make the sizers work on
5947     both Windows and X.
5948    
5949 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
5950    
5951     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
5952     that can limit the search to the currently selected layer.
5953     (MapCanvas.SelectShapeAt): Make sure that the currently selected
5954     layer stays selected even when no shape is found
5955 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
5956     height do nothing (avoids zero division errors)
5957 bh 44
5958 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
5959    
5960 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
5961     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
5962     convenient :-)
5963     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
5964     a new instvar layer_to_item to map layers to tree items
5965     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
5966     to match the current selection in the interactor
5967    
5968 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
5969     (Interactor.HasSelectedLayer): New methods to query the current
5970     selection
5971    
5972     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
5973     (MainWindow.has_selected_layer): Simply call the appropriate
5974     interactor method
5975    
5976     * Thuban/UI/mainwindow.py (MainWindow.__init__):
5977     (MainWindow.LayerShowTable):
5978     (MainWindow.identify_view_on_demand): Store the interactor in an
5979     instvar and use that reference instead of going through main.app
5980    
5981 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5982     * Thuban/UI/application.py (ThubanApplication.OnInit):
5983 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
5984     with the new mainwindow method ShowSessionTree and not directly
5985     the application's OnInit method
5986    
5987     * Thuban/UI/tree.py (myTreeCtrlPanel):
5988     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
5989     TreeCtrl isntead of a panel. This affects most method since we now
5990     refer to self instead of self.tree
5991     (SessionTreeView): New class implementing a non-modal dialog
5992     showing the session tree.
5993    
5994 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
5995     layer to the tableview dialog.
5996    
5997     * Thuban/UI/tableview.py: Add some doc-strings
5998 tkoester 403 (TableGrid):
5999 bh 35 (TableGrid.OnRangeSelect):
6000     (TableGrid.OnSelectCell):
6001     (TableFrame.__init__):
6002     (TableFrame.row_selected):
6003     Selecting rows in the grid view now updates the selected shapes
6004     through the TableFrame. To achieve this we derive TableGrid from
6005     Publisher and introduce the message type ROW_SELECTED which the
6006     TableFrame subscribes to and which is issued by OnRangeSelect and
6007     OnSelectCell
6008    
6009     (DataTable.SelectRow): Removed because it's no longer needed in
6010     the row/shape selection scheme
6011    
6012 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
6013     dialogs
6014    
6015     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
6016     the SELECTED_SHAPE message anymore. This is now handled by the
6017     parent.
6018     (TableGrid.select_shape): Only update the selection if the shape
6019     is not None.
6020     (TableFrame): Inherit from the new NonModalDialog class.
6021     (TableFrame.__init__, TableFrame.select_shape): Handle the
6022     SELECT_SHAPE message.
6023     (TableFrame.OnClose): Extend the inherited method to unsubscribe
6024     SELECT_SHAPE
6025    
6026     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
6027     (MainWindow.add_dialog):
6028     (MainWindow.dialog_open):
6029     (MainWindow.remove_dialog):
6030     (MainWindow.get_open_dialog): New methods to maintain a dictionary
6031     of opened non-modal dialogs.
6032    
6033     (MainWindow.__init__): Initialize the new non-modal dictionary
6034     management code
6035     (MainWindow.LayerShowTable): maintain separate dialogs for each
6036     table using the non-modal dialog management code to only open a
6037     view once for each table.
6038    
6039     (MainWindow.IdentifyTool):
6040     (MainWindow.__init__):
6041     (MainWindow.identify_view_on_demand): Don't open the identify view
6042     in IdentifyTool anymore. This will be done automatically by the
6043     new method identify_view_on_demand which handles the
6044     SELECTED_SHAPE message so that the identify view will be opened on
6045     demand
6046    
6047     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
6048     the interactor argument. The SELECTED_SHAPE message is now handled
6049     by the parent.
6050     (IdentifyView.__init__): Add the interactor argument so that we
6051     can handle the SELECTED_SHAPE message here
6052     (IdentifyView.selected_shape): New method to handle the
6053     SELECTED_SHAPE messages
6054    
6055     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
6056     NonModalDialog class
6057     (IdentifyView.OnClose): Extend the inherited version to
6058     unsubscribe SELECT_SHAPE
6059    
6060     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
6061    
6062 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
6063    
6064     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6065 tkoester 403
6066 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6067     interactor to pass through to the MapCanvas
6068 tkoester 403
6069 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6070     argument to the MainWindow constructor to get rid of the ugly hack
6071     that made main.app available early just so that the mapcanvas
6072     could access the interactor object.
6073    
6074 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
6075    
6076 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
6077     that runs a modal message box
6078     (MainWindow.OnClose): Use the new method
6079     (MainWindow.RemoveLayer): Just do nothing in case no layer is
6080     selected. The command should be grayed out anyway, so there's no
6081     need to pop up a message box.
6082     (MainWindow.AddLayer): Pop up a message box with an error message
6083     if the shape file can't be opened
6084    
6085     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
6086     immediately. This will cause an exception in case the file can't
6087     be opened and we can display an appropriate message.
6088    
6089 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
6090    
6091     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
6092     specific bdist_rpm command.
6093    
6094     * Thuban/UI/main.py: Catch ImportError exceptions when importing
6095     the locale module because it may not be available on some
6096     installations.
6097    
6098     * extensions/pyprojection/LICENSE: Copy of the license text in
6099     Projection.i. Having it in a separate file makes it easier to
6100     refer to license text in e.g. RPMs
6101    
6102 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
6103    
6104 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
6105     more generic
6106    
6107     * setup.py (ThubanInstall.get_outputs): Add the symlink in
6108     <prefix>/bin to the outputs
6109     (ThubanInstall.link_file): New method to link files. We need this
6110     because the standard copy_files refuses to link non-existing
6111     files.
6112     (ThubanInstall.run): Remove the leading install root from the
6113     script filename if an install root was specified and use the new
6114     link_file method
6115 tkoester 403
6116 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6117     the window when the first layer is added to the map.
6118    
6119     * setup.py (ThubanInstall.run): Honor the build root (self.root)
6120     when linking thuban.py to <prefix>/bin
6121    
6122 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
6123    
6124     * setup.py: In the setup call, the install parameters shouldn't
6125     have trailing slashes because distutils on non-posix platforms
6126     doesn't like that. The same applies to other directories like
6127     "Resources/Bitmaps"
6128    
6129     In the configuration section for nt, move the wxWindows directory
6130     optins into the part clearly marked as editable.
6131    
6132     (InstallLocal.initialize_options):
6133     (InstallLocal.user_options): remove the currently unused debug
6134     flag
6135     (thuban_build_py.find_all_modules): Add this method so that it
6136     works for our case of having packages and modules in one
6137     distribution as well.
6138     (ThubanInstall.initialize_options):
6139     (ThubanInstall.finalize_options):
6140     (ThubanInstall.user_options):
6141     (ThubanInstall.boolean_options): Add new options, do-symlink and
6142     extra files. Since these are the first ThubanInstall specific
6143     options, override user_options and boolean_options
6144     (ThubanInstall.run): Honor the new do-symlink and extra-files
6145     options.
6146     (ThubanInstall.get_outputs): Add to override the base-class's
6147     version and add the extra-files to the outputs
6148     (bdist_inno): New class for windows distributions with Inno Setup
6149     (InnoIconItem): Helper class for bdist_inno
6150     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6151     this together with the appropriate parameters, to the setup call.
6152 tkoester 403
6153 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
6154     installer
6155    
6156     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
6157     changing_selection to avoid recursive selection events when
6158     modifying the selection in response to a selection event.
6159     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
6160     changing the tree's selection.
6161     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
6162     we're not being called indirectly from normalize_selection.
6163    
6164     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
6165     event.Check only if the command is actuall checkable.
6166     (MainWindow.__init__): Call the toolbar's Realize method to make
6167     sure that the items are actually shown
6168    
6169 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
6170    
6171 bh 9 * setup.py: Fix some doc strings
6172    
6173 bh 7 * ChangeLog: started
6174    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26