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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1453 - (hide annotations)
Fri Jul 18 12:58:11 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 229294 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26