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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1365 - (hide annotations)
Thu Jul 3 13:10:09 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 214603 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26