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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1370 - (hide annotations)
Thu Jul 3 16:27:31 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 214914 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26