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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1349 - (hide annotations)
Tue Jul 1 16:12:38 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 211646 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26