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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1372 - (hide annotations)
Fri Jul 4 18:19:33 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 215285 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26