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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2713 - (hide annotations)
Thu Oct 26 16:37:42 2006 UTC (18 years, 4 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 475516 byte(s)
Moved ogr Extension to Extension menu.
Adding encoding information and made sure Autor's names
with an umlaut are actually written with an umlaut.

1 bernhard 2713 2006-10-25 Bernhard Reiter <[email protected]>
2    
3     Moved ogr Extension to Extension menu.
4    
5     * Extensions/ogr/
6     __init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
7     test/test_OGRShapestore.py, test/__init__.py:
8     adding encoding information and made sure Autor's names
9     with an umlaut are actually written with an umlaut.
10    
11     * Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
12     having a "(testing)" string before the submenu to prepare for 1.2.0
13     release. Bumped copyright year to 2006.
14    
15 bernhard 2712 2006-10-15 Bernhard Reiter <[email protected]>
16    
17     * Thuban/UI/renderer.py: Added module variable verbose and
18     added verbose output before doing a raster projection.
19     Minor: Added (c) year 2006.
20    
21     * test/test_baserenderer.py: Added new function
22     test_projected_raster_decimalcommalocale()
23     Added new author Bernhard Reiter and new copyright year 2006.
24    
25     * libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
26     switching to LC_NUMERIC "C" and back before calling GDAL functions -
27     only #if python >=2.4 .
28    
29 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
30 dpinte 2711
31     Win32 build updates
32    
33     * setup.py :
34     - update to the latest libs for win32 setup tasks
35     - added gdal and Lib content to the inno setup build task
36     - added stable and experimental extensions to setup packages
37    
38     * thuban.py :
39     - gdal support for win32 inno installation
40    
41     2006-10-10 Didrik Pinte <[email protected]>
42    
43 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
44     extracted from Thuban/UI/viewport.py
45     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
46    
47 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
48    
49     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
50    
51     * Thuban/UI/view.py: removed non needed declaration
52    
53     * Thuban/UI/selection.py : typo correction
54    
55 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
56    
57 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
58     Making the test more robust for observed python 2.3 problems
59     with setlocale().
60    
61 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
62 bernhard 2712 to run all tests with an LC_NUMERIC that uses comma as decimal_point.
63 bernhard 2705 Minor: Added (c) year 2006. Fixed typo in a docstring.
64    
65     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
66     a docstring.
67    
68 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
69    
70     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
71     and added it to TestOGRTable.setUp() so that all tests get skipped
72     if ogr cannot be imported. Added (c) year 2006.
73    
74 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
75    
76     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
77    
78 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
79    
80 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
81    
82 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
83    
84     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
85     Bernhard Reiter and new copyright year 2006.
86    
87 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
88     and Projection.assuregoodlocale(), Projection.assureinitlocale().
89     Added author Bernhard Reiter and (c) 2006.
90    
91 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
92 bernhard 2692
93     * README: added RXP and pyRXP as optional for tests.
94 bernhard 2697
95 bernhard 2694 * test/localessupport.py: New. Contains a helper function
96     to find a locale with comma used as decimal_point.
97 bernhard 2692
98 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
99 bernhard 2691
100 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
101 bernhard 2697
102 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
103     copyright range to include 2006.
104 bernhard 2690
105 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
106    
107     * Thuban/UI/main.py: circular import fix.
108    
109 frank 2688 2006-06-27 Frank Koormann <[email protected]>
110    
111     New Classification "Pattern": Classify text attributes by regexp.
112    
113     * Thuban/Model/classification.py (class ClassGroupPattern):
114     New, group is associated with a regular expression.
115     (Classification._compile_classification): Store compiled regexp and
116     original group for pattern.
117     (Classification.FindGroup): Added pattern.
118    
119     * Thuban/UI/classifier.py
120     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
121     New, add popup to select singleton/pattern.
122     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
123     ClassTable.SetValueAsCustom): Added pattern.
124     (ClassTable.__ParseInput): Autodetect singleton/pattern.
125    
126     * Thuban/Model/save.py (SessionSaver.write_classification):
127     Added pattern.
128    
129     * Thuban/Model/load.py (SessionLoader.start_clpattern,
130     SessionLoader.end_clpattern): New, process pattern elements.
131    
132     * test/test_classification.py (class TestClassGroupPattern): New.
133     (TestClassification.test_add_pattern,
134     TestClassification.test_multiple_groups_textual,
135     TestClassification.test_deepcopy_textual): New.
136     (TestClassification.test_multiple_groups_numerical):
137     Renamed test_multiple_groups.
138     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
139    
140     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
141     Added pattern.
142    
143     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
144     Added pattern.
145    
146     * test/test_layer.py
147     (TestLayerModification.test_set_classification_textual): New
148     (TestLayerModification.test_set_classification_numerical):
149     Renamed test_set_classification.
150    
151     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
152     description.
153    
154     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
155    
156 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
157    
158     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
159    
160 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
161    
162 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
163     extensions
164    
165     2006-06-28 Didrik Pinte <[email protected]>
166    
167 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
168     systems (support pysqlite1 and pysqlite2)
169    
170 frank 2684 2006-06-27 Frank Koormann <[email protected]>
171    
172     * Thuban/version.py: Bugfix determination of SQLite on old systems.
173    
174 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
175     * Extensions/ogr/__init__.py : updated test for win32 and correct
176     imports
177    
178 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
179 dpinte 2682 Ashamed ... still some tabs in the files
180    
181     * Thuban/version.py : tabs removed
182     * Thuban/Model/transientdb.py : tabs removed
183    
184     2006-05-15 Didrik Pinte <[email protected]>
185    
186 dpinte 2681 * Thuban/version.py : coding style correction
187 dpinte 2682 * Thuban/Model/transientdb.py : coding style correction
188 dpinte 2681
189     2006-05-15 Didrik Pinte <[email protected]>
190 dpinte 2682
191 dpinte 2680 * Thuban/version.py : Updated imports to support pysqlite2
192 dpinte 2682
193     * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
194 dpinte 2680 Patched the querying system to support the param style of pysqlite2
195    
196 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
197 bernhard 2690 * Extensions/svgexport/__init__.py: The extension now works on win32
198 dpinte 2679 architecture. Bug #87 corrected.
199    
200 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
201     * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
202     Removed emacs specific hint and replaced it with a general hint
203     that editors might support writing changelogs.
204    
205 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
206 bernhard 2678
207 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
208     instead of "cvs".
209    
210 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
211    
212     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
213     projects.h now. According the Frank Warmerdam and man pj_init
214     this is the public interface to proj. Thus I have changed PJ to projPJ.
215     And I could remove the hack to avoid clashes with typedef PVALUE
216     and #define LP in projects.h clashing with symbols when trying to
217     build on windows. The file is cleaner and nicer now.
218    
219 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
220 bernhard 2678
221 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
222     trying to build with mingw.
223    
224 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
225    
226 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
227     Added display of internal encoding to the about dialog text.
228    
229     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
230    
231     2005-10-18 Bernhard Reiter <[email protected]>
232    
233 bernhard 2673 Startup improved: We fail right away if the internal encoding could
234     not be determined.
235    
236     * Thuban/__init__.py (get_internal_encoding): new.
237    
238     * test/test_stringrepresentation.py (class TestInternalEncoding):
239     Preserve the internal encoding for the tests in this class.
240    
241 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
242    
243 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
244     that set_internal_coding() is throwing an exception for bad exceptions.
245    
246     * Thuban/__init__.py (set_internal_encoding): added a forwards
247     and backward translation, so that we fail early if the
248     internal_encoding is bad.
249    
250     2005-10-17 Bernhard Reiter <[email protected]>
251    
252 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
253     You could actually get polylines with filling in between,
254     when the classification for the lines had a fill color.
255     E.g. this happens when you generate a classification from a ramp.
256    
257     * Extensions/svgexport/test/test_svgmapwriter.py:
258     New test_export_arc_no_fill(). Extend copyright notice to 2005.
259    
260     * Extensions/svgexport/svgmapwriter.py
261     (SVGRenderer.draw_shape_layer_incrementally()):
262     Setting TRANSPARENT_BRUSH for shaptype ARC.
263     Extend copyright notice to 2005.
264    
265     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
266    
267 frank 2670 2005-09-08 Frank Koormann <[email protected]>
268    
269     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
270     by Erik (sigra.at.home.se)
271    
272 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
273    
274     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
275     Call the right method for the default size.
276    
277 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
278    
279     * Extensions/export_shapefile: New.
280    
281     * Extensions/export_shapefile/__init__.py: New. Initialize
282     the export_shapefile extension.
283    
284     * Extensions/export_shapefile/export_shapefile.py: New.
285     Exports a layer as a Shapefile.
286    
287 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
288    
289     * po/de.po: String fixes. This fixes Debian bug #313843.
290    
291 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
292    
293     Remove the attributes from the layer element in
294     .thuban files for the save routine.
295     This also solves RT bug #3149,
296     https://intevation.de/rt/webrt?serial_num=3149
297    
298     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
299     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
300     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
301     attributes from layer element to classification clnull element.
302    
303     * test/test_save.py (SaveSessionTest.testSingleLayer,
304     SaveSessionTest.testLayerProjection,
305     SaveSessionTest.testClassifiedLayer,
306     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
307     Removed attributes from layer element to classification clnull element.
308     (test_save_postgis.NonConnectionStore._fetch_table_information):
309     added pretending to have a shape_type.
310    
311     * Resources/XML/thuban-1.1.dtd: Make the attributes field
312     and field_type of classification optional.
313    
314     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
315     Added output of size.
316    
317     * Thuban/Model/load.py (SessionLoader.start_classification):
318     Change attribute 'field' and 'field_type' from obligatory to
319     optional to allow empty classes (ie. only with a default=clnull).
320    
321     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
322     any attributes anymore for the layer element.
323     (SessionSaver.write_classification): Even if there is no
324     classification field, still write the classification because
325     the clnull (default) symbol will not be defined anymore as
326     part of the layer element.
327    
328 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
329    
330 bh 2652 * setup.py (setup call): Version 1.1.0
331    
332     * NEWS: Update for 1.1.0
333    
334     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
335     technores won't be included
336    
337     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
338     2005
339    
340     * po/de.po: Updated.
341    
342     2005-07-05 Bernhard Herzog <[email protected]>
343    
344 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
345    
346     2005-07-05 Bernhard Herzog <[email protected]>
347    
348 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
349     masktype attributes.
350    
351     2005-07-05 Bernhard Herzog <[email protected]>
352    
353 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
354     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
355     __mangle_bounding_box. See the comments in the code and RT #2845
356    
357     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
358     Remove the explicit test of ClipBoundingBox. The method isn't
359     public anymore and the direct call in the test wasn't necessary in
360     the first place. If ClipBoundingBox (now __mangle_bounding_box)
361     isn't called, the return value of ShapesInRegion will be
362     different.
363    
364     2005-07-05 Bernhard Herzog <[email protected]>
365    
366 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
367     ZeroDivisionError exceptions. I don't know when they happen
368     exactly. It probably happens when the projections aren't set
369     properly.
370    
371 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
372    
373     First step towards unicode. With this roughly we're at step 1
374     string_representation.txt
375    
376     * Doc/technotes/string_representation.txt: New. Document how
377     strings are represented in Thuban and how to get to a Unicode
378     Thuban.
379    
380     * Thuban/__init__.py (set_internal_encoding)
381     (unicode_from_internal, internal_from_unicode): New. The first few
382     functions for the internal string representation
383    
384     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
385     internal_from_unicode instead.
386    
387     * Thuban/UI/__init__.py (install_wx_translation): Determine the
388     encoding to use for the internal string representation. Also,
389     change the translation function to return strings in internal
390     representation even on unicode builds of wxPython
391    
392     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
393     filenames too.
394     (SessionLoader.start_clrange): Use check_attrs to decode and check
395     the attributes.
396    
397     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
398     internal_from_unicode to convert unicode strings.
399    
400     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
401     unicode_from_internal when applicable
402    
403     * test/runtests.py (main): New command line option:
404     internal-encoding to specify the internal string encoding to use
405     in the tests.
406    
407     * test/support.py (initthuban): Set the internal encoding to
408     latin-1
409    
410     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
411     (TestLabelLayer.test): Use the internal string representation when
412     dealing with non-ascii characters
413    
414     * test/test_load_1_0.py (TestSingleLayer.test)
415     (TestClassification.test, TestLabelLayer.test): Use the internal
416     string representation when dealing with non-ascii characters
417    
418     * test/test_load_0_9.py (TestSingleLayer.test)
419     (TestClassification.test): Use the internal string representation
420     when dealing with non-ascii characters
421    
422     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
423     internal string representation when dealing with non-ascii
424     characters
425    
426     * test/test_save.py (XMLWriterTest.testEncode)
427     (SaveSessionTest.testClassifiedLayer): Use the internal string
428     representation when dealing with non-ascii characters where
429     applicable
430    
431 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
432    
433 bh 2641 * test/runtests.py: Untabify.
434    
435     2005-06-30 Bernhard Herzog <[email protected]>
436    
437 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
438     untabify.
439    
440     2005-06-30 Bernhard Herzog <[email protected]>
441    
442 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
443    
444 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
445    
446 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
447     Use the default size for rendering selected items of default type.
448     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
449    
450     2005-06-28 Jan-Oliver Wagner <[email protected]>
451    
452 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
453     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
454     Thanks to Frank Koormann who identified this problem.
455    
456     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
457     another symbol identified.
458    
459 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
460    
461     * Doc/manual/thuban-manual-de.xml: More translations.
462    
463 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
464    
465     * Thuban/UI/projdialog.py: Add missing import, which led to an
466     exception when opening a layer's projection.
467    
468 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
469    
470 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
471    
472     2005-05-09 Bernhard Herzog <[email protected]>
473    
474 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
475     connection to autoconnect. Fixes RT#3148.
476    
477     * test/test_postgis_db.py
478     (TestPostGISSpecialCases.test_simple_error_handling): New test
479     that attempts to reproduce RT#3148.
480    
481 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
482    
483     Add support for saving and loading the opacity and mask type
484     properties of RasterLayers. Also add support for proper use
485     of alpha information while drawing images not in 'RAW' format.
486     If transparency in an image format (e.g, PNG) is supported by
487     wxWidgets then the image would previously have been draw with
488     transparent regions, but the opaque regions would have been
489     unaffected by a change in the layer's opacity. This patch
490     corrects the problem.
491    
492     * Thuban/Model/layer.py (RasterLayer): Added opacity and
493     masktype parameters to the constructor, and set the
494     appropriate variables to those values.
495    
496     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
497     code to read the opacity and mask type of the layer and construct
498     a new layer with the additional parameters.
499    
500     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
501     to save the opacity and mask type of a layer.
502    
503     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
504     the opacity of the layer to draw_raster_data rather than the layer.
505     (BaseRenderer.draw_raster_data): Remove the layer parameter because
506     the function doesn't need to know about the layer. Add the optional
507     opacity parameter whose default is 1.0. Add 'PNG' as a supported
508     graphics format.
509    
510     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
511     signature to match that in BaseRenderer. Use the new opacity argument
512     in place of calling layer.Opacity(). In the case where the
513     format is not 'RAW', alpha_data is None and the loaded image has
514     alpha information, use the file's alpha information. This is
515     still subject to the layer's opacity setting.
516    
517     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
518     Fixed signature to match that in BaseRenderer.
519    
520     * test/test_load.py (TestRasterLayer): Change file_contents to
521     include opacity and masktype variables.
522     (TestRasterLayer.test): Include tests for opacity and masktype
523     changes.
524    
525     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
526     test to cover a variety of combinations of masktype and opacity
527     settings.
528    
529 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
530    
531     * debian/rules: add --use-wx-python-swig-hack
532     to the build command.
533     Thanks to Moritz Lennert for pointing this out.
534    
535 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
536    
537     Introduce OGRFileShapeStore in ogr extension.
538     This allows at least that loaded shapefile shape stores
539     can be saved correctly in the thuban session file
540     and reloaded again (reload is via core shapefile
541     routine, not OGR). For other types, .thuban files
542     can not be reloaded for the time being.
543    
544     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
545     class ist to be used for any file-based shape stores
546     accessed through OGR.
547    
548     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
549     forgotten _ for i18n. Adapted call OpenFileShapestore
550     regarding new parameter.
551     (OpenFileShapestore): Use OGRFileShapeStore instead of
552     OGRShapeStore. Fix return value (None instead of null).
553     Add new parameter "mainwindow" to avoid accessing global
554     context.
555    
556 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
557    
558     Introduce FileShapeStore as generalization for
559     file-based shape stores. In a first instance
560     this allows additional modules to handle shapefile
561     format as well, namely the OGR extension.
562    
563     * Thuban/Model/data.py: Various small fixes in doc-strings.
564     (FileShapeStore): New class.
565     (ShapefileStore): Derive from FileShapeStore.
566     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
567     rename self.table to self._table, initialize self._bbox
568     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
569     and self.FileName() instead of self.filename.
570     (ShapefileStore.Table): Use self._table instead of self.table.
571     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
572     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
573    
574     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
575     (SessionSaver.write_data_containers): Only use methods of the
576     base class FileShapeStore.
577    
578 joey 2604 2005-04-26 Martin Schulze <[email protected]>
579    
580     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
581     function to the modified render engine
582    
583     2005-04-25 Martin Schulze <[email protected]>
584    
585     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
586     Added a description according to the CVS log message
587    
588     2005-04-23 Martin Schulze <[email protected]>
589    
590     * Thuban/UI/renderer.py: Added a missing import
591    
592 russell 2600 2005-04-23 Russell Nelson <[email protected]>
593    
594 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
595     way the previous tool is remembered, so that middle-button
596     panning works even if you haven't selected a tool.
597 russell 2600
598 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
599    
600     * libraries/thuban/wxproj.cpp: Move the compatibility code that
601     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
602     branch that includes wxPython.h because it's only needed when
603     wxPython.h is used. Also, it won't compile when
604     USE_WX_PYTHON_SWIG_HACK is set otherwise.
605    
606 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
607    
608     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
609     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
610     ClassGrid.__init__ and it's value is outside of the valid
611     range (must be < 32768). wxPython 2.5 complains about it with an
612     exception.
613    
614 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
615    
616     * Doc/manual/thuban-manual-de.xml: More translations.
617    
618 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
619    
620 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
621     wxPython 2.4 as well. Also, remove a now obsolete comment.
622    
623     2005-04-05 Bernhard Herzog <[email protected]>
624    
625 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
626     available.
627    
628     * setup.py (wxproj_extension): New variable. Assign the Extension
629     instance for Lib.wxproj to this variable instead of putting it
630     directly into the listso that it can be accessed by other code
631     later.
632     (thuban_build_ext.user_options): Added boolean option
633     --use-wx-python-swig-hack.
634     (thuban_build_ext.initialize_options): Initialize the new option
635     to False.
636     (thuban_build_ext.finalize_options): If the new option was given,
637     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
638     (thuban_build_ext): Update the doc-string
639    
640     * libraries/thuban/wxproj.cpp: Normally we use
641     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
642     defined, use swigPtrConvertHack.h instead.
643    
644     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
645     copied over from wxPython.h.
646     (decode_pointer_new): New. Equivalent of decode_pointer for
647     wxPython 2.5.
648     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
649    
650     * README: Add section on potential build problems which explains
651     how the work-around for a missing wxPython.h is activated.
652    
653 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
654    
655 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
656     potential location for (lw)postgis.sql because the file has moved
657     again in postgis 1.0.0 rc4.
658    
659     2005-03-29 Bernhard Herzog <[email protected]>
660    
661 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
662     match the site of the legend_icon_layer icon. Otherwise wxpython
663     2.5 complains when the legend is created with the error:
664    
665     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
666     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
667     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
668     in wxImageList: this might work on this platform but definitely
669     won't under Windows.
670    
671 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
672    
673     These changes add support for adjusting the opacity of a raster layer.
674    
675     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
676     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
677     a LAYER_CHANGED event if the opacity actually changes.
678    
679     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
680     layer parameter needed in the implementation of this method in
681     renderer.py.
682    
683     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
684     typo 00 -> 0.
685    
686     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
687     control to adjust opacity.
688    
689     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
690     alpha data based on the opacity level of the layer.
691    
692     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
693     accepts a layer parameter.
694    
695     * test/test_layer.py (TestLayerModification.test_raster_layer):
696     Rename opacity method calls and add test for LAYER_CHANGED.
697    
698 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
699    
700     * test/test_connector.py (DeletionTestMixin.check_deletions)
701     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
702     update the callers.
703    
704 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
705    
706     * Doc/manual/thuban-manual-de.xml: More translations.
707    
708 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
709    
710     Introducing initialization callbacks for extensions.
711    
712     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
713     optional parameter init_callback.
714     (ExtensionDesc.init_ext): New. Executes the callback and sets
715     a status.
716    
717     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
718     initialization of the extensions.
719     (ThubanApplication.init_extensions): Init all extensions.
720    
721     * Thuban/UI/about.py (About.__init__): Added status of the extensions
722     to the about text.
723    
724     * Extensions/gns2shp/__init__.py: Added init method for Extension
725     description.
726     (init): New. Contains the initialization of the module.
727    
728 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
729    
730     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
731     OGRConnection to open a datasource. Removed dialog to display all
732     available drivers. Added some doc strings.
733    
734     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
735     OGRDatasource with a string. Added two opening methods which return an
736     OGRDatasource (either data from file or from DB).
737    
738     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
739     represents a geometry reference of an OGRFeature. OGRShape now has a
740     list of referenced geometry objects (important for geometry
741     collections).
742     For OGRShapeStores loaded from a DB an ID column can be specified now.
743    
744 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
745    
746     * test/test_map.py (TestMapWithContents.test_tree_info):
747     Added label layer for comparison.
748    
749 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
750    
751     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
752     which builds a mask. Handle the majority of an image in a loop,
753     creating 8 bits at a time. Later, handle the edge case where less
754     than 8 bits are packed.
755    
756 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
757    
758     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
759     doc-string
760    
761 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
762    
763 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
764    
765     2005-02-18 Jonathan Coles <[email protected]>
766    
767 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
768     dependencies on wxPython. Added a new method projected_raster_layer()
769     that returns a raster layer image in projected space. This must be
770     implemented in classes derived from BaseRenderer. This also eliminates
771     the dependency on gdal in baserenderer.py.
772    
773     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
774     new projected_raster_layer() to get projected raster image instead
775     of directly calling ProjectRasterFile().
776     (BaseRenderer.projected_raster_layer): New. This must be implemented
777     by derived classes. It takes almost the same arguments as ProjectRasterFile
778     did and returns a projected image with mask and alpha data (if requested).
779     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
780     that check will be done in MapRenderer.projected_raster_layer(). This
781     also allows other implementations to use different projection code.
782    
783     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
784     Implementation of BaseRenderer.projected_raster_layer. Checks for
785     gdal support and wxPython version. Also handles exceptions from
786     ProjectRasterFile.
787    
788     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
789     and added a variable which can be set through the options argument
790     of ProjectRasterFile.
791    
792     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
793     Calls ProjectRasterFile and returns the result.
794     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
795     of calling projected_raster_layer() with different options.
796     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
797     wxPython version and all tests of masks and alpha channels. These are
798     now in test_projected_raster_layer().
799    
800 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
801    
802 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
803     doc-strings to comply with coding_guidelines.
804    
805     2005-02-17 Jan-Oliver Wagner <[email protected]>
806    
807 jan 2565 Docstring improvements and minor fixes for labellayer.
808    
809     * Thuban/Model/map.py:
810     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
811     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
812     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
813     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
814     doc string.
815     (Map.BoundingBox): Removed superfluous test for label_layer
816     and improved doc string.
817     (Map.TreeInfo): Added label_layer and improved sdo string.
818    
819     * Thuban/Model/label.py: Added import of _.
820     (Label, Label.__init__): Improved/added doc string.
821     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
822     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
823     Improved/added doc string.
824     (LabelLayer.AddLabel): Use already defined names for
825     align strings and improved doc string.
826     (LabelLayer.TreeInfo): New. Return the object data for
827     the tree view.
828    
829 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
830    
831     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
832     so that that wxproj doesn't crash. Added GUI support for selecting
833     alpha channel (opacity can't be selected yet).
834    
835     NOTE: If wxPython.h is including in future distribution packages
836     then it will not be necessary to have the files swigPtrConvertHack.h
837     and wxPython_int.h included with Thuban. This is hopefully
838     a temporary workaround.
839    
840     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
841     access to the macro wxCHECK_VERSION so that it will properly
842     generate a bit mask. There was a problem between wx2.4 and wx2.5
843     that this works around.
844    
845     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
846     of RasterLayer.MaskType.
847     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
848     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
849     specify none, a bitmap, or an alpha channel.
850     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
851    
852     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
853     Set the raster warping options for the mask based on the value
854     of RasterLayer.MaskType.
855    
856     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
857     deprecated calls to SetItemSelectedImage in favor of SetItemImage
858     with wxTreeItemIcon_Selected.
859    
860     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
861     an alpha channel for the mask.
862    
863     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
864     data if it is available and an alpha channel is supported under
865     the current version of wxPython.
866    
867     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
868     to select whether 1's or 0's select the desired portion of an image
869     in the bit mask. wx2.4 has a bug where the documentation is the opposite
870     from behavior.
871     (ProjectRasterFile): Only generate an alpha channel if the version
872     of wxPython is >= 2.5.3.
873    
874     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
875     When wxPython >= 2.5.3 use the special swig functions to decode an
876     object's address.
877    
878     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
879     based on the version of wxPython. If >= 2.5.3 use the special swig
880     functions from wxPython to decode wxPython objects, otherwise use
881     the old method of retrieving the address from the object __repr__ string.
882    
883     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
884     Unnecessary code was removed to make it smaller.
885    
886     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
887     Add tests for returning an alpha channel.
888    
889     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
890     tests that used removed functions UseMask and SetUseMask
891    
892    
893 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
894    
895 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
896     Daniel Calvelo Aros.
897    
898     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
899     (QueryTableFrame.__init__): Pass the size of a spacer as a single
900     item.
901    
902     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
903     (ProjFrame.build_dialog): Pass the size of a spacer as a single
904     item.
905    
906     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
907     size of a spacer as a single item.
908    
909     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
910     size of a spacer as a single item.
911    
912     2005-02-08 Bernhard Herzog <[email protected]>
913    
914 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
915     better with 2.5 while still keeping compatibility with 2.4. There
916     are still problems with 2.5, though.
917    
918     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
919     of a spacer as a single item.
920    
921     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
922     from wxControl
923    
924     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
925     2.5, add an implementation of the GetFirstChild method that does
926     not require the second parameter.
927     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
928     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
929     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
930     pass the second parameter to GetFirstChild
931    
932 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
933    
934     * Extensions/ogr/ogrshapes.py: Removed some print commands.
935    
936     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
937     additional menu but appears as a possibility in the menu Map.
938    
939 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
940     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
941     and PYTHON_ERRF since they were no longer necessary.
942    
943 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
944     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
945     Enable translation for message string.
946    
947 joey 2555 2005-02-06 Martin Schulze <[email protected]>
948    
949     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
950     the arguments of the contstructor to fit the global scheme
951    
952 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
953    
954     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
955     some dialogs needed to start ogr.
956    
957     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
958     warnings.
959    
960     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
961     encoding warnings.
962    
963 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
964    
965 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
966     mask is packed into a bit array. It's now slightly faster.
967    
968     2005-01-28 Jonathan Coles <[email protected]>
969    
970 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
971     default to true.
972    
973     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
974     code that loads the state of the layer's use_mask flag. Its
975     usefulness is still being debated.
976    
977     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
978     code that saves the state of the layer's use_mask flag. Its
979     usefulness is still being debated.
980    
981     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
982     options to ProjectRasterFile based on the state of layer.UseMask().
983     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
984     quit is there is a problem projecting.
985     (BaseRenderer.draw_raster_data): Change the documentation to
986     describe the new format (XBM) that the mask data will be in.
987    
988     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
989     data is in XBM format when format='RAW' which means it doesn't
990     need to be converted to a wxImage before being used as a mask
991     for a wxBitmap. Assume that if format != 'RAW' that the image
992     data and mask data are in the same format.
993    
994     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
995     and a mask is requested, convert the alpha band to a bit array in
996     XBM format. if an alpha channel is requested, simply return the
997     data in the alpha band. Provide better error handling by returning
998     python error messages (also fixes RT #2947).
999     (ProjectRasterFile): Support multiple mask options, rather than simply
1000     a flag indicating that a mask should or should not be used. Provide
1001     better error handling by returning python error messages.
1002    
1003     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1004     Add mask data to test.
1005    
1006     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
1007     should use the mask by default.
1008     (TestLayerModificaton.test_raster_layer): Test that a layer should use
1009     the mask by default.
1010    
1011     * test/test_load.py (TestRasterLayer.test): Remove testing for
1012     use_mask flag in file.
1013    
1014     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
1015     for use_mask in file.
1016    
1017     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
1018    
1019 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
1020    
1021     Add a new dialog box for raster layers. The dialog box allows
1022     the user to toggle a mask that is generated by ProjectRasterFile
1023     and is used to only draw the real parts of the projected image.
1024    
1025     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1026     Instruct the warping code to generate a mask if the raster layer
1027     requests one.
1028     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1029    
1030     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1031     obsolete optional mask argument.
1032    
1033     * Thuban/UI/classifier.py (Classifier): Change the parent class
1034     to LayerProperties and rework the code to support layout calls
1035     from the parent.
1036     (Classifier.dialog_layout): New. Layout the dialog box.
1037     (Classifier.map_layers_removed): Removed. Moved to parent class.
1038     (Classifier.map_replaced): Removed. Moved to parent class.
1039     (Classifier._OnTry): Renamed to OnTry to support parent class.
1040     (Classifier.OnClose): Removed. Supplied in parent class.
1041     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1042     (Classifier._OnOK): Renamed to OnOK to support parent class.
1043     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1044    
1045     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1046     dialog boxes.
1047    
1048     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1049     raster layer properties.
1050    
1051     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1052     with the non-simple version supplied with gdal. This allows added
1053     features such as creating an alpha band.
1054     (GetImageData): Generate a mask array from the alpha band that is
1055     generated by gdal if the user has selected it. Try to support images
1056     that have more than three bands, such as images with RGB plus an
1057     alpha band.
1058     (ProjectRasterFile): Convert python argument for mask and tell
1059     gdal to enable or disable an alpha band.
1060    
1061     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1062     describing what kind of layer the class is. Defaults to "Unknown",
1063     but should be overridden by subclasses.
1064     (Layer.Type): New. Override base class method.
1065     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1066     data from gdal for display in the properties dialog.
1067     (RasterLayer.Type): New. Override base class method.
1068     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1069     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1070     (RasterLayer.ImageInfo): New. Return extra information about the image.
1071    
1072     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1073     the mask information.
1074    
1075     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1076    
1077     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1078     Classifier classes as dialogs to use with the proper layer types.
1079    
1080     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1081     Fix test.
1082    
1083     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1084     (TestLayerModification.build_path): New. Support function.
1085     (TestLayerModification.test_raster_layer): New. Test new methods.
1086    
1087     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1088    
1089     * test/test_load.py (TestRasterLayer): Add tests for mask.
1090    
1091     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1092    
1093     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1094     obsolete optional mask argument.
1095    
1096 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1097    
1098     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1099     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1100     RowOrdinalToId() and ReadRowAsDict().
1101    
1102     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1103     layers for existing database connections.
1104    
1105     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1106    
1107    
1108 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1109    
1110     * Doc/manual/thuban-manual-de.xml: More translations.
1111    
1112 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1113    
1114     Rework the status bar updates a bit to make sure the message about
1115     the projections is produced at the right times.
1116    
1117     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1118     New class variable with messages that may require a status bar
1119     update.
1120     (MainWindow.view_position_changed)
1121     (MainWindow.update_status_bar): Rename from view_position_changed
1122     to update_status_bar. It's meaning has changed now that it may
1123     also generate messages about problems with projection settings.
1124     (MainWindow.__init__): Use the new update_status_bar_messages
1125     class variable to subscribe update_status_bar
1126     (MainWindow.set_position_text): Update doc-string. This method
1127     has to be renamed at some point. See doc-string and comments.
1128     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1129     messages in update_status_bar_messages
1130    
1131     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1132     class attribute. map messages to be forwarded by the viewport.
1133     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1134     the messages in forwarded_map_messages
1135    
1136 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1137    
1138     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1139     doc-string
1140     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1141     different name for the initialization SQL file.
1142    
1143 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1144 jan 2542
1145     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1146     a projection and returns a formatted string representing the
1147     parameters to feed to gdalwarp. This function eliminates
1148     redundancy in draw_raster_layer().
1149     (BaseRenderer.render_map_incrementally): Removed the optimization which
1150     drew the top most raster layer first and then only those vector-
1151     based layers that are above it. With the support for transparency
1152     this optimization breaks correct behaviour.
1153     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1154     future enhancements to raster layer bounding box. The old behaviour has
1155     not changed. Also, change calling parameters to draw_raster_data()
1156     to specify new RAW data format and mask.
1157     (BaseRenderer.draw_raster_data): Change signature to include an optional
1158     parameter for mask information. Change documentation to mention
1159     support for new parameter and added option for RAW data format.
1160     The data argument is now a list of [width, height, data].
1161    
1162     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1163     mask parameter. Add new condition for RAW format, which
1164     significantly reduces rendering time. Add condition for
1165     mask parameter.
1166    
1167     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1168 jonathan 2537 data array of RGB values from the projected image returned from
1169     the gdal warping functions. In the case of palette based images, it
1170 jan 2542 converts the NO_DATA index to the mask color.
1171     (ProjectRasterFile): Removed all custom memory driver references
1172     and replaced it with the standard in-memory dataset provided
1173     by gdal. The return data is no longer a BMP file, but an array
1174     of RGB values, one set triple per pixel.
1175 jonathan 2537
1176     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1177     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1178     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1179    
1180 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1181     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1182     files. These are obsolete with the new version of gdalwarp.cpp
1183    
1184     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1185     Updated signature.
1186     (TestBaseRenderer.test_raster_no_projection): Changed the test
1187     data to be data in the uncompressed RAW format returned from
1188     ProjectRasterFile.
1189    
1190 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1191    
1192 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1193     string available for i18n.
1194 jan 2535
1195 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1196    
1197     * Resources/Projections/defaults.proj: Ruin the speling of the
1198 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1199     It's the wrong thing to do in the long run, but it's necessary for
1200     those users until that bug is fixed. Otherwise the projection
1201     dialog segfaults. Better to annoy some Lambert-93 users with a
1202     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1203 russell 2532
1204 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1205    
1206 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1207     docstring and comment that the warning code here is a hack.
1208 bernhard 2531
1209 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1210    
1211 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1212     user about misprojected layers when their lat/lon bounding
1213 russell 2529 box exceeds rational lat/lon values.
1214    
1215 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1216    
1217 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1218 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1219     when getdefaultlocale returns None. Thanks to Bernhard H. .
1220 jan 2542
1221 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1222    
1223 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1224 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1225 jan 2542
1226 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1227    
1228 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1229     OnRangeText(0) to work around a different in wx Behaviour noticed
1230     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1231    
1232 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1233    
1234     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1235 bernhard 2525 None. (Fixes rt#2910.)
1236    
1237 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1238    
1239     New Extension: mouseposition
1240     Tool to collect mouse click positions (map coordinates) in a dialog.
1241    
1242     * Extensions/mouseposition/__init__.py: New, extension registration
1243    
1244     * Extensions/mouseposition/mouseposition.py: New, implements the
1245     dialog and adds a tool to Thuban mainwindow.
1246    
1247     * Extensions/mouseposition/position.xpm: New, icon for tool.
1248    
1249 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1250    
1251     * Doc/manual/thuban-manual-de.xml: More translations.
1252    
1253 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1254    
1255     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1256     Fix indention bug.
1257    
1258 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1259    
1260     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1261 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1262 frank 2517 is not part of the layers Classification.
1263    
1264 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1265    
1266 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1267     BugFix 2883: Former implementation only worked on classified point
1268     layers: KeyError was raised, now use the default size if field is None.
1269 frank 2515
1270 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1271    
1272     svgexport 1.0.0cvs: Fixed label export.
1273    
1274     * Extensions/svgexport/test/test_svgmapwriter.py:
1275     class TestSVGRenderer(): New class; new test test_label_font().
1276    
1277     * Extensions/svgexport/svgmapwriter.py
1278     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1279     makes test_label_font happy.
1280    
1281     * Extensions/svgexport/TODO: crossed out fixed label export item.
1282     Added item for options.
1283    
1284     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1285    
1286 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1287    
1288 jan 2512 Middle mouse button pans.
1289 russell 2511
1290 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1291     OnMiddleDown and OnMiddleUp events.
1292     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1293     previously used tool.
1294     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1295     pressing the middle mouse button.
1296    
1297 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1298    
1299     * Doc/manual/thuban-manual-de.xml: More translations.
1300    
1301 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1302    
1303     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1304     \n to stderr after the warnings. Thanks to Russell Nelson.
1305    
1306 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1307    
1308     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1309     Bernhard (coding guidelines etc.). Additionally it is now possible to
1310     display shapefiles containing feature collections (e.g.polygons
1311     with holes). Works with gdal 1.2.1 now.
1312    
1313     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1314     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1315     tests are skipped now.
1316    
1317     * Extensions/ogr/ogrstart.py: Fixed some typings.
1318    
1319 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1320    
1321     * Extensions/svgexport/TODO: updated to add support for
1322     raster layers and labels for 1.0.1.
1323    
1324     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1325     Issue a warning now.
1326    
1327 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1328    
1329 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1330     the application down the pipe.
1331    
1332     2004-12-19 Bernhard Reiter <[email protected]>
1333    
1334 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1335    
1336     * Extensions/svgexport/svgmapwriter.py:
1337     DrawPath() renamed to DrawPolygonPath(),
1338     added documentation, improved comments and variable names.
1339    
1340     * Extensions/svgexport/svgmapwriter.py,
1341     Extensions/svgexport/test/test_svgmapwriter.py:
1342     All using DrawPolygonPath() now, the default parameter closed=True
1343     omitted.
1344    
1345     * Extensions/svgexport/test/test_svgmapwriter.py:
1346     renamed test_polygon_opened() to test_polyline()
1347     renamed test_transparent_polygon() to test_transparent_polyline()
1348    
1349 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1350    
1351     Some fixes of gns2shp extension.
1352    
1353     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1354     package.
1355    
1356     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1357     dynamically.
1358    
1359     * Extensions/gns2shp/test/README: Simplified description how to test.
1360    
1361     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1362     fixed some dimensions of fields according to the GNS documentation
1363     which seems to change undocumented.
1364     Now killing trailing \n and/or \r from MODIFY_DATE.
1365     This fixes RT#2453.
1366    
1367 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1368 bernhard 2480
1369 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1370    
1371     * Extensions/svgexport/test/test_svgmapwriter.py:
1372     Added new tests: test_export_polygon_with_hole()
1373     and test_polygon_with_hole().
1374    
1375     * Extensions/svgexport/svgmapwriter.py
1376     (draw_polygon_shape()): Uses DrawPath correctly now.
1377    
1378     * Doc/manual/thuban-manual.xml: Added documentation for stable
1379     extention svgexport.
1380     * Doc/manual/thuban-manual-de.xml: Copied English section about
1381     svexport over.
1382    
1383 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1384 bernhard 2482
1385     * Extensions/svgexport/svgsaver.py,maplegend.py:
1386     Moved from experimental to stable extension menu.
1387    
1388     * Extensions/svgexport/TODO: updated.
1389    
1390    
1391     2004-12-18 Bernhard Reiter <[email protected]>
1392    
1393 bernhard 2481 Added Extensions/svgexport/TODO
1394    
1395     2004-12-18 Bernhard Reiter <[email protected]>
1396    
1397 bernhard 2480 Refactored in svgexport:
1398     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1399    
1400     * Extensions/svgexport/svgmapwriter.py
1401     Added verbosity level 3 to print out polygon points.
1402     (class Point): added __repr__
1403     (class Brush, __str__()): Added space after ,.
1404     (DrawPolygon): Renamed to DrawPath()
1405     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1406     (DrawLines): Using DrawPath now.
1407    
1408     * Extensions/svgexport/test/test_svgmapwriter.py:
1409     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1410     inside another list. Adapted test data with a newline before "M".
1411    
1412     2004-12-18 Bernhard Reiter <[email protected]>
1413 bernhard 2479
1414     Refactored svgexport tests: 9 double tests runs eliminated;
1415     code size reduced by 8 lines.
1416    
1417     * Extensions/svgexport/test/test_svgmapwriter.py:
1418     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1419     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1420     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1421     this fixed the double running of the nine tests of TestVirtualDC.
1422     (class TestVirtualDC): Using self.dc and self.file from setUp().
1423    
1424 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1425    
1426     Two windows specific fixes ported from thuban-1­0-branch:
1427    
1428     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1429     instead of getlocale because getlocale doesn't return a usable
1430     encoding name on a german windows 2000
1431    
1432     * setup.py: windows build: Removed the absolute path names and
1433     made all prfixes relative to the directory containing setup.py.
1434     Makes it a little easier to adapt to a different system.
1435    
1436 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1437    
1438 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1439 bh 2472 Fixes RT#2299
1440    
1441     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1442    
1443     * test/postgissupport.py
1444     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1445     table to "roads-multi" because it now uses MULTILINESTRING
1446     geometries and introduce a new "roads" table that uses LINESTRING
1447     (coords_to_multilinestring): Make the doc string more precise
1448     (coords_to_linestring): New. Create a LINESTRING WKT
1449     representatin
1450     (wkt_converter): Add coords_to_linestring
1451     (upload_shapefile): Rephrase the doc-string a bit.
1452    
1453     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1454     (LineStringTests)
1455     (TestPostGISShapestoreLineString)
1456     (TestPostGISShapestoreMultiLineString): Split
1457     TestPostGISShapestoreArc into a base class LineStringTests and two
1458     derived classes TestPostGISShapestoreLineString for LINESTRING
1459     geometries and TestPostGISShapestoreMultiLineString for
1460     MULTILINESTRING geometries. Most test methods are in the base
1461     class with the exception of tests that explicitly check the raw
1462     format.
1463    
1464     2004-12-16 Bernhard Herzog <[email protected]>
1465    
1466 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1467    
1468     * test/postgissupport.py (find_postgis_sql): Different postgis
1469     versions put the postgis.sql file into slightly different places
1470     so we have to look in both. The updated doc string describes this
1471     is more detail.
1472    
1473     * test/test_postgis_db.py
1474     (TestPostGISSpecialCases.test_column_name_quoting): The return
1475     value of UniqueValues is unsorted, so it has to be sorted for
1476     comparison.
1477    
1478     2004-12-16 Bernhard Herzog <[email protected]>
1479    
1480 bh 2470 Fix for RT#2237
1481    
1482     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1483     panel to be shown is the UnknownProjPanel disable the OK and Try
1484     buttons. Otherwise enable them.
1485     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1486     the parameters. In that case __GetProjection also returns None
1487     now.
1488    
1489 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1490    
1491 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1492     minimum number of classes to 2. The calculate_quantiles needs at
1493     least two and raises an exception otherwise.
1494     Fixes RT#2549
1495    
1496     2004-12-15 Bernhard Herzog <[email protected]>
1497    
1498 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1499     so that it returns a result for select statements.
1500     (PostgreSQLServer.server_version): New. Return the version of the
1501     server software.
1502     (PostgreSQLServer.require_authentication): The format of
1503     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1504     server version and generate the file in the correct format
1505    
1506     2004-12-15 Bernhard Herzog <[email protected]>
1507    
1508 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1509     in the doc string and rephrase it a little.
1510    
1511 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1512    
1513     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1514     session has been loaded successfully. The check is called by the relevant
1515     tests after executing load_session().
1516    
1517 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1518    
1519 bh 2454 Make sure the region used to determine which shapes are visible
1520     actually matches the region on the printed page. If this isn't
1521     done properly some shapes might not be printed.
1522     Fixes RT #2692
1523    
1524     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1525     renderer has to be at the same position as the mapregion
1526    
1527     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1528     has to be moved by (self.shiftx, self.shifty) too.
1529    
1530     2004-12-13 Bernhard Herzog <[email protected]>
1531    
1532 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1533     generated python code which leads to exception in the __del__
1534     method when the constructor fails. See the comments in the code
1535     for more details.
1536    
1537     * libraries/pyprojection/Projection.py: Updated from Projection.i
1538     with SWIG.
1539    
1540     2004-12-13 Bernhard Herzog <[email protected]>
1541    
1542 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1543     (TestAltPath.test_02_path_error_fix_from_list)
1544     (TestAltPath.test_05_path_error_fix_from_list_changed)
1545     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1546     is destroyed in tearDown, so there's no need to do it in a test
1547     case.
1548    
1549     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1550     debug print
1551    
1552     2004-12-13 Bernhard Herzog <[email protected]>
1553    
1554 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1555     (TestDrawSplines.setUp): Do not use super with the unittest
1556     classes because in Python 2.2 they're still old-style classes.
1557    
1558 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1559    
1560     Alternative Path feature: When loading a (moved) session where
1561     shapefiles cannot be found, ask the user. Use the specified path
1562     if further shapefiles are missing. However, ask the usr for confirmation
1563     in such cases.
1564    
1565     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1566     in load_session()
1567     (Shapefile_CallBack): Helper, implements controllable callback.
1568    
1569     * Thuban/UI/application.py (ThubanApplication.OnInit):
1570     Added "alt_path" to self.path
1571     (ThubanApplication.OpenSession): Added shapefile_callback as second
1572     callback similar to db_connection_callback.
1573     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1574     shapefile_callback. In addition to raising the dialog the control of
1575     self.path('alt_path') is implemented here.
1576    
1577     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1578     (SessionLoader.open_shapefile): Open shapefile, eventually with
1579     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1580     formerly used in start_fileshapesource()/start_layer().
1581     (SessionLoader.start_fileshapesource): Call open_shapefile().
1582     (SessionLoader.start_layer): Call open_shapefile().
1583     (load_session): Added shapefile_callback.
1584    
1585     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1586     feature (search / check).
1587    
1588     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1589    
1590 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1591    
1592 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1593    
1594     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1595     (def draw_point_shape): new parameter size defaults to 2 as before.
1596     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1597     Added draw_func call with size when dealing with a point layer.
1598    
1599     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1600    
1601     2004-12-11 Bernhard Reiter <[email protected]>
1602    
1603 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1604     to raise the chance that the line length will be below 255 characters,
1605     as recommended by REC SVG 1.1 in section 8.3.1.
1606    
1607     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1608     Adding \n before L's and changed whitespace handling.
1609    
1610     * Extensions/svgexport/test/test_svgmapwriter.py:
1611     Adapted tests to new whitespace handling of DrawPolygon.
1612    
1613     2004-12-11 Bernhard Reiter <[email protected]>
1614    
1615 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1616    
1617     * Extensions/svgexport/test/test_svgmapwriter.py:
1618     Removed test_drawbezier in favour of new test_drawspline3 and
1619     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1620     All only to test DrawSpline.
1621    
1622     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1623     New implementation now really using the strange algorithm of
1624     xfig 3.1's approximated splines and its conversion to postscript
1625     with one twist: SVG can do quadratic beziers, so skipped translation
1626     to cubic beziers.
1627     (TestWithDC): Typo in comment fixed.
1628    
1629 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1630    
1631     * Thuban/Model/classgen.py: Added missing character encoding
1632    
1633     * Extensions/wms/properties.py (OpenWMSProperties): removed
1634    
1635     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1636     support for get_srs_discrepancies() since there are no
1637     discrepancies anymore (was a thinko)
1638    
1639     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1640     format priority now that more formats are supported globally by
1641     the render engine.
1642    
1643 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1644     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1645     because it is not available in all versions of ogr
1646    
1647 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1648     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1649     global tests until a real one is commited.
1650    
1651 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1652    
1653     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1654     ogr. It is planned to add other vector formats.
1655    
1656     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1657    
1658 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1659    
1660     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1661     part of a (non-)fix to renable that the tests are always
1662     executed.
1663    
1664 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1665    
1666     * Extensions/svgexport/test/test_svgmapwriter.py:
1667     Added test_drawbezier() to test DrawSpline().
1668    
1669     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1670     Really implemented bezier drawing.
1671    
1672     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1673     to 0.9.1 because now the legend examples lines styles
1674     will be drawing with beziers.
1675    
1676 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1677    
1678     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1679     GIF as supported bitmap image formats (helpful for the WMS extension)
1680    
1681 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1682    
1683     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1684     Improved the test for the internal compare method
1685    
1686 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1687    
1688     * Thuban/UI/about.py (About.__init__): Added
1689     Norbert Solymosi for hungarian translation and Ole Rahn
1690     as contrbutor. Moved Bernhard Reiter from Contributor
1691     to Developer.
1692    
1693 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1694    
1695     * Extensions/svgexport/test/test_svgmapwriter.py:
1696     Removed Jan from author list as he did not change enough significant
1697     lines yet.
1698    
1699     * Extensions/svgexport/__init__.py: Added Bernhard as author
1700     of the Extension.
1701    
1702 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1703    
1704     * po/hu.po: New. Hungarian translation. Contributed
1705     by Norbert Solymosi.
1706    
1707 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1708    
1709     * Extensions/svgexport/test/test_svgmapwriter.py
1710     (Testobjectexport.test_transparent_polygon): Commented out some
1711     debug prints
1712    
1713 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1714    
1715     Fix broken tests for svg extension and added svg legend
1716     to Experimental menu.
1717    
1718     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1719     the test run correctly even if the extension is a package.
1720     Also removed the "import Thuban" which makes no sense.
1721    
1722     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1723     test module also be executed from the global test routine.
1724     This is done by looking for the absense of the DISPLAY variable.
1725    
1726     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1727     to Experimental menu since this module has yet not reached a stable
1728     status (ie. 1.0).
1729    
1730 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1731    
1732     * Extensions/svgexport/svgmapwriter.py:
1733     Added verbose variable and some logging depending on it.
1734     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1735     because counting i is not necessary.
1736     (class Pen, class Brush): Added simple __str__ methods.
1737     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1738     not exported to svg file) Note: holes still unhandled.
1739    
1740     * Extensions/svgexport/test/test_svgmapwriter.py:
1741     Made a baseclass TestWithDC for test needed a DC.
1742     Added tests for bug #2698 (transparent polygons are not
1743     exported to svg file):
1744     Testobjectexport.test_transparent_polygon()
1745    
1746     * Thuban/Model/base.py (UnsetModified):
1747     Fixed some typos in docstring.
1748    
1749     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1750     Added hints on the used algorithm for handling holes.
1751    
1752 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1753    
1754 jan 2412 Some face lifting for the examples.
1755    
1756     * Examples/__init__.py: Make this directory a package.
1757    
1758     * Examples/simple_extensions/__init__.py: Make this directory a package.
1759    
1760     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1761     menu to Examples menu.
1762    
1763     * Examples/simple_extensions/simple_command.py: Some more comments,
1764     minor changes.
1765    
1766     * Examples/simple_extensions/simple_tool.py: Minor changes.
1767    
1768     2004-11-20 Jan-Oliver Wagner <[email protected]>
1769    
1770 jan 2407 Changed way of extension registry for wms and added extension
1771     registry for umn_mapserver extension.
1772    
1773     * Extensions/wms/__init__.py: Added registry entry and the importing
1774     of the actual wms module. Included a test for the required PyOGCLib.
1775    
1776     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1777    
1778     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1779     importing of the actual umn mapserver management modules.
1780     Included a test for the required Python MapScript.
1781    
1782     2004-11-20 Jan-Oliver Wagner <[email protected]>
1783    
1784 jan 2403 Changed way of extension registry for importAPR, bboxdump
1785     and added extension registry for svgexport.extension registry for
1786     svgexport.
1787    
1788     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1789     of the actual importAPR module.
1790    
1791     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1792     __init__.py).
1793    
1794     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1795     »···of the actual bboxdump module.
1796    
1797     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1798     »···__init__.py).
1799    
1800     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1801     of the svgsaver module.
1802    
1803     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1804     to Experimental menu since this module has yet not reached a stable
1805     status (ie. 1.0).
1806    
1807 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1808    
1809     Now the hit test considers the size of point symbols.
1810    
1811     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1812     'size' defaulting to the previously fixed value 5.
1813     Extended doc-string.
1814     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1815     for symbols.
1816     Now the size of the largest point symbol is determined to find out
1817     about whether the point has been hit.
1818     This fixes the problem that only clicks inside a fixed distance of
1819     5 where found.
1820    
1821 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1822    
1823 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1824 jan 2395 selected symbols.
1825    
1826     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1827     Added consideration of the specific size of point symbols.
1828     The property for each point symbol is retrieved and the size applied
1829     for the rendering method.
1830     Added doc-string.
1831    
1832 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1833    
1834     Changed way of Extension Registry for gns2shp and profiling.
1835    
1836     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1837     __init__.py).
1838    
1839     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1840     of the actual gns2shp module.
1841    
1842     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1843     __init__.py).
1844    
1845     * Extensions/profiling/__init__.py: Added registry entry and the importing
1846     of the actual profiling module.
1847    
1848 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1849    
1850     * Extensions/svgexport/: Minor improvements to doc strings.
1851    
1852 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1853    
1854     Further elements for sizable point objects now
1855     making this feature usable though not yet complete.
1856    
1857     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1858     attribute 'size' for cldata when the shape layer is of point type.
1859     This also now make the test_load.py tests happy.
1860    
1861     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1862     gradient.
1863    
1864     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1865     ID_SELPROP_SPINCTRL_LINEWIDTH.
1866     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1867     (ID_SELPROP_SPINCTRL_SIZE): New Id.
1868     (SelectPropertiesDialog.__init__): Added a second spin control
1869     for the size in case the corresponding layer is of point type.
1870     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1871     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1872     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1873     and refresh preview.
1874    
1875    
1876    
1877 joey 2381 2004-10-04 Martin Schulze <[email protected]>
1878    
1879     * Extensions/wms/test/test_parser.py
1880     (TestWMSCapabilitiesParser.test_compareLists): Added missing
1881     self-test for compareLists()
1882     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1883     self-test for compareDicts()
1884 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1885     to verify the test routine fails with non-equal arguments
1886     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1887     to verify the test routine fails with non-equal arguments
1888 joey 2381
1889 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
1890    
1891 jan 2380 First elements for sizeable point objects.
1892    
1893     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1894    
1895     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1896    
1897     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1898     of a corresponding argument is given.
1899     (TestSymbolSize): New. Test the size attribute of cldata.
1900    
1901     * Thuban/Model/classification.py: Removed some trailing whitespaces.
1902     (ClassGroupProperties.__init__): Set default size.
1903     (ClassGroupProperties.SetProperties): Set the size.
1904     (ClassGroupProperties.GetSize): New. Return the size.
1905     (ClassGroupProperties.SetSize): New. Set the size.
1906     (ClassGroupProperties__eq__): Compare also size.
1907     (ClassGroupProperties__repr__): Print also size.
1908    
1909     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1910     the size attribute.
1911    
1912     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1913     Also, now there is a return value that indicates whether the drawing
1914     size exceeded the given rect extent and if so the new extent.
1915     Finally, point objects are drawn depending on the size. If either
1916     the width or height is exceeded, the new extent is returned.
1917     (ClassRenderer.Draw): Now when calling the previewer drawing function,
1918     evaluate the return value and, if not None, adapt the grid widget size
1919     accordingly and redraw again.
1920    
1921     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1922     If the draw function is for points, call it with the size as additional
1923     parameter.
1924     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1925     the size. Compute the radius using the size.
1926    
1927     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1928     that Thuban supports size, apply this correctly.
1929    
1930     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1931    
1932     2004-10-03 Jan-Oliver Wagner <[email protected]>
1933    
1934 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
1935     Map chapter.
1936    
1937 joey 2368 2004-10-01 Martin Schulze <[email protected]>
1938    
1939     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1940     argument for general use through properties-dialog selector
1941    
1942     * Thuban/UI/classifier.py: Register properties dialog classes for
1943     both provided layer classes/types.
1944    
1945     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1946     map can be retrieved through the parent which is passed to the
1947     constructor anyway and doesn't require an argument of its own,
1948     required for the unification of arguments for general use through
1949     properties-dialog selector.
1950     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1951     whether a dialog is already opened (and raising it to the users
1952     attention) and creating a new dialog into a function of its own
1953     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1954     method
1955     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1956     global registration of properties dialog classes (which are indeed
1957     layer-specific).
1958    
1959     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1960     for general use through properties-dialog selector, the map can be
1961     retrieved through the parent and doesn't require an argument of
1962     its own.
1963    
1964     * Extensions/wms/wms.py: Register the properties dialog class for
1965     the provided WMS layer
1966    
1967 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
1968    
1969     New feature: Registry for Extensions.
1970    
1971     * Thuban/UI/extensionregistry.py: This module defines a registry for
1972     Extensions.
1973    
1974     * Thuban/UI/about.py (About.__init__): Added description
1975     of the registered extensions with all of the information.
1976    
1977     * Thuban/Model/extension.py (Extension): Improved doc-string.
1978    
1979     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1980     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1981     Extensions/wms/wms.py: Added registration of the extension.
1982    
1983 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
1984    
1985     More fixes to svgexport to make used ids unique and
1986     conforming to XML's Name production.
1987    
1988     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1989     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1990     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1991     Added Bernhard R. as author.
1992     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1993     concatenation char now (makes test_make_ide_nosetbaseid() valid).
1994     Also transform second id part with "%d" and catch the TypeError
1995     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1996     Corrected typo inBernhard's author line.
1997     (SetBaseID): Return the transformed base id. Transform characters
1998     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1999     import binascii. If to be set string starts with "xml" or so, add "t".
2000     (draw_shape_layer_incrementally): use the returned value of SetBaseID
2001     for used_baseids checks.
2002    
2003 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
2004    
2005     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2006     Remove a debug print and some tab characters.
2007    
2008 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
2009    
2010     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
2011     (SetBaseID, SetID, make_id): Improved docstring comments to explain
2012     the interaction of the three functions and the XML id contrains.
2013    
2014 bernhard 2352
2015 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
2016    
2017 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
2018     Module.
2019    
2020     * Doc/README: Added info on ThubanModel.xmi.
2021    
2022     2004-09-23 Jan-Oliver Wagner <[email protected]>
2023    
2024 jan 2346 * Doc/README: New. Some info about how to generate technical
2025     documentation from the source code.
2026     This text was send to the Thuban developer mailing list on
2027     September 21st 2004 by Bernhard Reiter.
2028    
2029 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2030    
2031     Improved the svgexport to only use unique ids. Will issues
2032     an error message dialoge when two layer names are the same.
2033     ShapeIDs are now added with a dash within the svg ids.
2034    
2035     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2036     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2037     (TestSVGRenderer): New test class with test_make_in() and
2038     test_check_for_layer_name_clash()
2039     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2040     and draw_shape_layer_incrementally() to not use a baseid twice,
2041     satisfying test_check_for_layer_name_clash()
2042     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2043     test_make_in().
2044     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2045     and wxICON_HAND.
2046     (write_to_svg): Put dc and rendering in a try statement and on
2047     catching SVGmapWriterError notify the user and delete the target file.
2048    
2049 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2050    
2051     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2052    
2053 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2054    
2055     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2056     small bug with the line color. Now the line color will now only set
2057     if it is set in Thuban an not Transparent.
2058    
2059     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2060     deleting the layers from mapfile. Now all layers will delete backwards
2061     from the last.
2062    
2063 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2064 silke 2338
2065 silke 2339 * Thuban/Model/layer.py:
2066     Fixes bug in projection handling: Otherwise very large region might not
2067     have valid values in the layer's projection.
2068    
2069     2004-08-20 Silke Reimer <[email protected]>
2070    
2071 silke 2338 * Thuban/UI/about.py:
2072     small changes to be consistent with coding style.
2073    
2074 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2075    
2076     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2077     Adjusted a comment
2078    
2079 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2080 silke 2334
2081 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2082     too many and too enhanced imports of locale
2083    
2084 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2085    
2086     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2087 silke 2339 function unicodeToLocale() to convert special characters to users
2088     locale encoding
2089 silke 2334
2090 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2091    
2092     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2093     lower case letter'
2094    
2095 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2096    
2097     * ChangeLog: Rewrite the last ChangeLog entry to follow
2098     the standard way.
2099    
2100     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2101     the function where it is needed, because it don't works if it stands
2102     at the beginning.
2103     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2104     numclasses from the mapscript will be used.
2105     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2106     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2107     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2108     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2109     (MF_Map.create_new_layer): New. A new Layer is created and associated
2110     with the mapscript object.
2111     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2112     the mapscript.
2113     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2114     linked to the layer in thuban, else the layerobject linked to the
2115     thubanlayer will be used.
2116     AnnotationLayer will now store the filename of the shapefile.
2117     (MF_Map.remove_layer): If a layer is removed the associated object
2118     must be set new.
2119    
2120     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2121     layers which are exists in thuban to the mapobj. All removed Layers
2122     will be removed from the mapobj.
2123     Added comments to all functions.
2124     (thuban_to_map): No layer will be removed here.
2125    
2126     * Extensions/umn_mapserver/mf_handle.py
2127     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2128     Layersettings for the mapserver kann be edited.
2129    
2130     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2131     imported, will be linked with the associated MF_Layer.
2132     (import_mapfile): All layers, which are not selected, will be removed.
2133     Disable the "import layer from mapfile" menu option.
2134    
2135     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2136     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2137     layer on permanently.
2138    
2139 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2140    
2141 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2142     New. This function removes all metadata
2143     (MF_Layer.set_group): New. Set the group setting.
2144     (MF_Layer.get_group): New. Get the group setting.
2145     (MF_Map): Removed the extra numlayers variable, used the mapscript
2146     parameter instead.
2147     (MF_Map.get_numlayers): New. This get numlayers.
2148     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2149 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2150     if the object is an instance. Also added the annotation layer here to
2151     export, but only the layer is created in the mapfile.
2152    
2153 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2154     the check if a mapobj exist, because its not needed anymore. The
2155     export function is only available if a mapobj exist.
2156     Use the new function to remove all layers.
2157 jschuengel 2323
2158 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2159     option and the metadata button. The layer dialog is temporary disabled.
2160     (Metadata_CustomDataTable): Added some functions to show the grid
2161 jschuengel 2323 correct.
2162    
2163 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2164     the number of layer from import_mapfile to this function.
2165     (AnnotationLayer): New. This Class shows the Annotation layer in
2166     thuban. The layer don't do anything. It's only to show the layer
2167     and to save the layer order.
2168     (add_annotationlayer): New. Import an annotation layer to thuban.
2169     (select_layer2import): New. Import only layers to thuban and not
2170     the other settings like projection or scalebar.
2171     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2172     create_new_mapfile functions from mf_handle.py to mf_import.py.
2173 jschuengel 2323
2174     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2175     parameter to the roads and cultural layers. Also added a new
2176     Annotation Layer for the cultural points.
2177    
2178     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2179     option for the annotation layer.
2180    
2181     * Extensions/umn_mapserver/sample/index.html: Added the start
2182     parameter for the annotation layer.
2183    
2184 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2185    
2186     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2187     translation completed.
2188    
2189     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2190     Fixed unprecise description for Save Session.
2191    
2192 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2193    
2194     Started translation of Users Manual into german.
2195    
2196     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2197    
2198     * Doc/manual/Makefile: Added build instructions for german
2199     users manual.
2200    
2201     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2202    
2203 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2204    
2205     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2206     functions. Now all metadata will handle by the function and its not
2207     needed to initialize it from outside. Therefor the associated mapobj
2208     will be stored in the Metadata Object. So we can use the special
2209     functions from the associated mapobj to get the Metadata.
2210     Therefor all initialization code for the metadata is removed from the
2211     other classes.
2212     (MF_Layer): Added a function to get the metadata object.
2213     (MF_Map): Added a function to set the mappath, the path where
2214     the mapfile ist stored.
2215    
2216     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2217     to set the extent in the mapfile. Now the code is set by the displayed
2218     data in the Thuban-view.
2219     (export_mapfile): The shapepath is now set empty, until relative
2220     pathnames are supported.
2221    
2222     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2223     metadata. Yet only mapfile metadata are supported. Layer and class
2224     supported are not implemented.
2225     Added a dialog to handle layer informations. The dialog only shows the
2226     selected layer at the moment.
2227    
2228     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2229     code for setting the extent in thuban. Now the extent is set to the
2230     given extent from the mapfile.
2231     Fixed a logical mistake. Now the extent is set when realy a layer is
2232     loaded, and not if one is selected to load.
2233    
2234     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2235     move the shown map in the browser.
2236    
2237     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2238     line to the mapobj and added metadata to the political layer.
2239    
2240     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2241     for Metadata.
2242    
2243 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2244    
2245     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2246     ClassMapper
2247    
2248     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2249     case for the new ClassMapper
2250    
2251    
2252 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2253    
2254 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2255     visible extent of the map in projected coordinates
2256    
2257     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2258     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2259     tests.
2260     (SimpleViewPortTest.test_visible_extent): New. The real test for
2261     VisibleExtent()
2262    
2263     2004-07-22 Bernhard Herzog <[email protected]>
2264    
2265 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2266     function when running asa script.
2267    
2268 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2269    
2270     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2271     Removed the old "import Thuban.UI.mainwindow" code.
2272     (tbextent_to_map): Removed the extra function and at the code direct
2273     to "thuban_to_map" function.
2274     (write_creatorcomment): Added. Now a short comment is added to the
2275     beginning of an generated mapfile.
2276     (export_mapfile): Now the Path and filename are saved in to variables,
2277     and not together in one variable. This is needed for the new
2278     write_creatorcomment function.
2279    
2280     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2281     import module "re". Also added Range and the ClassGroupRange import
2282     from Thuban. Both are needed for the new range expression import.
2283     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2284     style from a given mapfile expression.
2285     (added_rasterlayer): Make some small code changes. The shapepath is
2286     now stored in an extra variable and the clazz_name is set empty if no
2287     class name set in the mapfile.
2288     Changed the Error message for Range Expressions, becaus the new
2289     function create a error string which will be shown in the dialog.
2290    
2291     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2292     range expression import.
2293 jan 2312
2294 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2295    
2296     * Extensions/umn_mapserver/README: Added hint that
2297     installation as root can be avoided. Removed all tabs.
2298    
2299 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2300    
2301     * test/test_viewport.py
2302     (ViewPortTest.test_changing_map_projection): Check that changing
2303     the projection of an empty map shown in a viewport doesn't lead to
2304     exceptions in the viewport's handler for the
2305     MAP_PROJECTION_CHANGED messages
2306    
2307     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2308     try to keep the same region visible when the map actually contains
2309     something
2310    
2311 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2312    
2313     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2314     mappath directly from the mapobj. Is needed because of the changes
2315     in mf_import.py.
2316     (MF_Layer.add_thubanclass): Added a new comment.
2317     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2318     mapobj is empty there is no extent get from thuban an so no one can
2319     set to th mapobj.
2320    
2321     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2322     the discription.
2323     Split the funktion in to three smaller ones. The new functions are
2324     add_rasterlayer, add_polygonlayer and select_layer2import.
2325     Removed the mapfilepath and filepath initialisation, because its know
2326     include in the new functions.
2327     Now nothing will be imported if cancel is pressed in the
2328     layer choice dialog.
2329    
2330 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2331    
2332     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2333     import.
2334     (MF_Symbolset): Removed the extra variable for numsymbols.
2335     (MF_Class.__init__): Added a comment to the exception clause.
2336     Removed the extent init, because it was not needed anymore.
2337     (MF_Layer.add_thubanclass): Added the code to set the class name to
2338     the expression value from thuban if no label is defined.
2339     Added the code to export Range expressions from thuban to the mapfile.
2340     (MF_Map.set_extent): Removed the exception and replace it by some if
2341     code. If the size of a map is not defined the size will be set to 1,1.
2342     This is necessary because if the extent is set, mapscript checks if
2343     the size is greater than zero.
2344     (MF_Web): Added the get and set function for the template.
2345    
2346     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2347     if a mapobject exists and used it to set the status of the menu items.
2348     If no mapfile exists the settings could not be edditied.
2349     Define after which menuitem the exportitem will include.
2350    
2351     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2352     Thuban.UI.mainwindow clause, because it is not needed.
2353     Added the command Refresh() to all "OnChangeColor()" functions,
2354     because the color preview window was not updated on a color change.
2355     Added the function to check if a mapobject exists and used it to set the
2356     status of the menu items. If no mapobject exists the settings could not
2357     be edditied.
2358     (Map_Dialog): Moved the imagetype selector from the
2359     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2360     (Web_Dialog): Removed the name label and added the template textbox.
2361    
2362     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2363     the exception handling on loading the layers by an if statement. It
2364     is not necessary to us the exception there.
2365     The Filepath creation now use os.path.join to build the path.
2366    
2367     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2368     definition from global to the setUp function. Now the testMap will
2369     initialize new on each test.
2370    
2371     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2372     classes in the Line Layer, to test logical Expressions.
2373     Set the status of the class "Point9" in the Point Layer to off
2374    
2375 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2376    
2377     * Thuban/UI/baserenderer.py
2378     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2379     optimization that tries not to draw layers under a raster layer.
2380     The bug was harmless. All it effectively did was to produce The a
2381     strange messages about not being able to draw Layer instances for
2382     all vector layers below a raster layer which would be invisible
2383     anyway because the raster layer currently always covers the entire
2384     window
2385    
2386 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2387    
2388     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2389     a list of supported outputformats. This formats are not alle supported
2390     because there is no possibility to get the outputformat without the
2391     name known. Make some formal changes to the code.
2392     (MF_Map.set_name()): Fixed a bug if the name is None.
2393    
2394     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2395     statement, because its not needed anymore. The Outputformat is now
2396     given as string from the object. Make some formal changes to the code.
2397    
2398     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2399     most of the new setting which were added during the last changes.
2400     Removed the MF_Size Test.
2401    
2402     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2403     cultural Layer to test expressions and the the status of that layer
2404     from on to default.
2405     Changed the data path the the correct Thuban Data
2406     Added the Outputformat Object and Symbol Object
2407    
2408 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2409    
2410     * Extensions/umn_mapserver/mapfile.py: Added some new
2411     settings to edit (outputformat, label, imagetype)
2412    
2413     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2414     the Label Dialog and add the OutputDialog.
2415     Make some changes to the code order.
2416    
2417 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2418    
2419     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2420     and line Obj and add the scalebar_status_type, scalebar_style_type and
2421     scalebar_position_type.
2422     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2423     are only used to create a Symbol like the circle in Thuban.
2424     Added the scalebarObject (MF_Scalebar)
2425     (MF_Class): Added set_status and get_status.
2426     (MF_Layer.add_thubanclass): Added code to set the class status
2427     (MF_Map): Added code to handle the symbols and scalebar
2428     (MF_Label): Added the set_partials and get_partials functions
2429    
2430     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2431     from mapfile. Added a function to create a circle object like the one
2432     from thuban if no one exists.
2433    
2434     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2435     press ok in the assosiated dialog and not at the end of the
2436     colordialog.
2437     Added the Dialog for the Scalebar.
2438     (Label_Dialog): Added the offset option
2439    
2440     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2441     status of the Classes.
2442     Fixed a bug with the projection. Now the to_meter parameter will be
2443     added to the Projection only if it doesn't exists.
2444    
2445 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2446    
2447     Added the functionality to handle the content thuban is not
2448     able to handle directly.
2449    
2450     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2451     Thuban with the possibility to edit the mapfile content.
2452    
2453     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2454     to import mapfiles without any layer selected. So it is possible
2455     to edit the other settings in a mapfile.
2456     (import_mapfile): Added code to use the editing functions.
2457     Added the possibility to import the projection to a layer if one
2458     is defined.
2459     Status settings (On,Off) will now set in thuban (visible, invisible).
2460     fixed a bug with with classnames. If no classname is set in mapfile
2461     the value in Thuban will set to the expression.
2462    
2463     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2464     possibility to save a new mapfile or use the old one which is
2465     imported or new created.
2466     Added code to use the editing functions.
2467     Remove some not needed import statements
2468    
2469     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2470     need for the editing functions.
2471     Added needed set-functions for the editing functions.
2472     Added the possibility to export rasterimages.
2473     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2474     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2475     moment.
2476     (MF_Class.set_thubanstyle): Now point layers will set to a default
2477     symbol to show a circle in mapserver and not only a 1px dot.
2478     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2479     correct before.
2480     (MF_Size): Removed, because it is not needed.
2481    
2482     * Extensions/umn_mapserver/README: Added the hints to use the
2483     export and editing functions, too.
2484    
2485     * Extensions/umn_mapserver/sample/iceland.map: Added the
2486     new parameter "UNITS METERS".
2487     Change the political layer to status OFF.
2488    
2489     * Extensions/umn_mapserver/sample/README: Added some
2490     more details to setup the sample in the MapServer.
2491    
2492 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2493    
2494     * Extensions/svgexport/test/test_svgmapwriter.py:
2495     Removed class VFile and used standard StringIO instead.
2496    
2497 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2498    
2499     Add the export function to the umn_mapserver extension.
2500    
2501     * Extension/umn_mapserver/mf_export.py: New. This module extents
2502     Thuban with the possibility to export the Thuban content.
2503    
2504     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2505     with the export module. Especially added the possibility to
2506     add thuban objects directly to the map objects.
2507    
2508     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2509     because of the hint from Bernhard Herzog.
2510     Corrected the handling of absolute pathnames.
2511     Changed the Text of the Menu-Item, now the beginning is upper case.
2512    
2513     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2514    
2515 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2516 jschuengel 2242
2517 jschuengel 2250 Add a sample and make some changes.
2518    
2519     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2520     import from * to explicit used statements. Changed the
2521     Thuban.UI.mainwindow import phrase, too.
2522     (import_mapfile):Corrected a clerical mistake.
2523     Added wxCHANGE_DIR in OpenFile Dialog.
2524     Added a MultipleChoiceDialog, to select the layers to load from
2525     mapfile into thuban. Thereby the projection is only set if one layer
2526     is selected.
2527     Added the possibility to handle relative pathnames which uses
2528     up-level references.
2529     Removed some doubled code.
2530     Corrected an error with integer values used as label in thuban
2531     ClassGroup.
2532    
2533     * Extensions/umn_mapserver/sample: New.
2534    
2535     * Extensions/umn_mapserver/sample/README: New. Describes the
2536     usage of the sample files.
2537    
2538     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2539     a suitable .map-file for the iceland data.
2540    
2541     * Extensions/umn_mapserver/sample/index.html: New. The template
2542     for the mapfile.
2543    
2544     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2545     file for the Iceland Application on web.
2546    
2547     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2548     some details.
2549    
2550     * Extensions/umn_mapserver/test/test_mapserver
2551     (mapserver_import_Test_generalClasses.test_MF_Color):
2552     Corrected the thubancolor test.
2553    
2554     2004-06-15 Jan Schüngel <[email protected]>
2555    
2556 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2557    
2558 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2559    
2560     * libraries/thuban/cpl_mfile.h: Added copyright header.
2561    
2562     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2563     Free Software License so that it is most useful with gdalwarp
2564     and bmpdataset.
2565    
2566 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2567    
2568     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2569     import of wxPython.wx itself (as opposed to the contents of
2570     wxPython.wx). For some reason wxPython.wx is available as
2571     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2572     wrt. wxPython 2.4.
2573    
2574 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2575    
2576     Initial version of new extension "umn_mapserver". This extension aims
2577     to manage configuration for the UMN MapServer application. This
2578     inital version just imports the .map-files and displays all, Thuban is
2579     capable of.
2580    
2581     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2582    
2583     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2584     tests.
2585    
2586     * Extensions/umn_mapserver/test/test.map: New. This is a test
2587     .map-file for automated tests of the umn_mapserver extension of
2588     Thuban.
2589    
2590     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2591     UMN Mapserver classes.
2592    
2593     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2594     directory a package.
2595    
2596     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2597     '.map'-file objects.
2598    
2599     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2600     Thuban with the possibility to handle UMN MapServer mapfiles.
2601    
2602 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2603    
2604     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2605     to a tuple before using it as arguments to the % operator. This
2606     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2607     reported today on thuban-list by Jan Schüngel
2608    
2609     * test/test_layer.py (TestLayerModification.setUp): Save the
2610     filename as an instance variable so we can refer to it in tests
2611     (TestLayerModification.test_tree_info): Uncomment this method
2612     again and make it work. This tests for the formatting issue
2613     filed in RT#2239 on 2004-01-13
2614    
2615 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2616    
2617     * Thuban/UI/baserenderer.py: Fix some typos.
2618    
2619 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2620    
2621     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2622     by increasing a field size.
2623    
2624 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2625    
2626     Update to newest shapelib and get rid of Thuban specific
2627     extensions, i.e. use the new DBFUpdateHeader instead of our
2628     DBFCommit kludge
2629    
2630     * libraries/shapelib/shpopen.c: Update to version from current
2631     shapelib CVS.
2632    
2633     * libraries/shapelib/shapefil.h: Update to version from current
2634     shapelib CVS.
2635    
2636     * libraries/shapelib/dbfopen.c: Update to version from current
2637     shapelib CVS.
2638     (DBFCommit): Effectively removed since shapelib itself has
2639     DBFUpdateHeader now which is better for what DBFCommit wanted to
2640     achieve.
2641     We're now using an unmodified version of dbfopen.
2642    
2643     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2644     value '1' to the Lib.dbflibc extension. This simply reflects the
2645     shapelib and pyshapelib updates
2646    
2647 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2648    
2649     Finished introduction of Menu.FindOrInsertMenu.
2650    
2651     * Extensions/drawshape/drawshape.py: Add the command
2652     to the experimental menu additionally to the toolbar.
2653    
2654     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2655     finding menu on its own.
2656    
2657     * Doc/manual/thuban-manual.xml: updated sample file
2658     to use FindOrInsertMenu().
2659    
2660     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2661     instead of finding menu on its own.
2662    
2663 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2664    
2665     * test/test_menu.py (MenuTest.test): Added testing
2666     of method Menu.FindOrInsertMenu.
2667    
2668 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2669    
2670     Introduce and use Menu.FindOrInsertMenu.
2671    
2672     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2673     given menu or, if not found, insert it.
2674    
2675     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2676     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2677     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2678     menu on its own.
2679    
2680 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2681    
2682     Introduce a abstract ColorDialog class and remove
2683     and outdated file.
2684    
2685     * Thuban/UI/proj4dialog.py: Removed. It is has been
2686     replaced by projdialog for quite a while and is not used
2687     anymore.
2688    
2689     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2690     dialog(s).
2691    
2692     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2693     Now calls the abstract ColorDialog instead of wxColourDialog.
2694     This also removed the dependency to Color class conversion
2695     from this function.
2696    
2697 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2698    
2699     * Extensions/bboxdump/__init__.py: Fixed string left over from
2700     copying.
2701    
2702     * Extensions/bboxdump/bboxdump.py (bboxdump):
2703     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2704     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2705     of formatted outputs (string.join) instead of appending to the
2706     message. Two progress bar dialogs to report progress on the sometimes
2707     lenghty processing.
2708    
2709 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2710    
2711     New Extension to dump bounding boxes of all shapes of the selected
2712     layer. An optional column can be specified to group the objects,
2713     in this case the bounding box is a union of the separate boxes.
2714     Dump can be displayed in a ScrolledMessageDialog or written to file.
2715     The Extension is simply a combination of available and well tested
2716     Thuban functionality.
2717    
2718     * Extensions/bboxdump/__init__.py: New: Init to make this
2719     directory a package.
2720    
2721     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2722     all shapes of the selected layer.
2723    
2724 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2725    
2726     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2727     strings to be i18n now.
2728    
2729 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2730    
2731     Changing popup menu of legend from direct building
2732     to using the Menu construction as used for the mainwindow.
2733    
2734     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2735     layer_to_bottom, layer_visibility
2736     (MainWindow.LayerToTop): New. Put current layer to the top.
2737     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2738     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2739     Replace 1,0 by True, False.
2740     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2741     current layer.
2742     (MainWindow.LayerShowTable): Removed raising of dialog.
2743     (_has_selected_layer_visible): New. Support function.
2744    
2745     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2746     (LegendPanel.__init__): Removed EVT_MENU bindings.
2747     (LegendTree._OnRightClick): Replace direct creation of
2748     menu via wx Classes by applying the menu definition
2749     as of Menu class of menu.py.
2750    
2751 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2752    
2753     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2754     button string to stronger clearify that Thuban will be closed when hitting
2755     the button.
2756    
2757     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2758     Now for layers without a ShapeStore a corresponding message is given
2759     to the user, that this layer has no table to show.
2760    
2761 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2762    
2763     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2764     recalculate the format for the internal render engine as well.
2765    
2766     * Extensions/wms/properties.py (wmsProperties): First start for a
2767     properties dialog. It's functional for a first selection of
2768     layers, but still has some weired wxWidgets/GTK problems but
2769     beautification can be done later.
2770    
2771     * Extensions/wms/layer.py: Added more documentation
2772     (WMSLayer.getFormats): New: Return list of supported image formats
2773     by the WMS server
2774     (WMSLayer.getLayers): New: Return the list of layer names
2775     supported by the WMS server
2776     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2777     (WMSLayer.getWMSFormat): New: Return the image format that is used
2778     for WMS GetMap requests
2779     (WMSLayer.setWMSFormat): New: Set the image format that is used
2780     for WMS GetMap requests
2781     (WMSLayer.__init__): Move away from using only one layer to using
2782     a list of layers (unsorted at the moment, though).
2783     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2784     visible layers
2785     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2786     visible layers
2787    
2788     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2789     order to establish a clean structure.
2790    
2791     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2792     own in order to establish a clean structure.
2793    
2794 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2795    
2796     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2797     support for oldstyle (WMS 1.0 apparently) image format
2798     specification.
2799    
2800     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2801     supported graphic formats back to JPEG and BMP, PNG and others are
2802     too *cough* experimental... Sorry, I meant to filter this out
2803     before I committed this part. This should make the WMS extension
2804     run from CVS again.
2805     (wms_dialog): Reset an empty URL to None so that the subsequent
2806     program can depend on this, since the dialog will indeed return an
2807     empty URL, causing another declaration of love by Python.
2808    
2809     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2810     Whenever a native BoundingBox request cannot be fulfilled, check
2811     whether the requested SRS is EPSG:3426, in which case return the
2812     LatLonBoundingBox values.
2813    
2814     * Extensions/wms/test/test_parser.py
2815     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2816     ignoring AUTO:* SRS.
2817     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2818     Added another test method to test whether the LatLonBoundingBox
2819     values will be returned if BoundingBox values are requested with
2820     SRS set to EPSG:3426.
2821    
2822     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2823     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2824     the moment by placing them into a variable which is currently
2825     unused. Also test whether the EPSG SRS is numerical as it should
2826     be and add an error message if it is not.
2827    
2828     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2829     appear in the real world as well. Since we cannot handle them yet
2830     (OGCLib can't either), we will ignore them for the moment.
2831    
2832     * Extensions/wms/parser.py: Use a variable for denoting the sample
2833     filename
2834     (WMSCapabilitiesParser.peekLayers): Added support for error
2835     messages during grok(). They will be aggregated in an array and
2836     may be displayed later. We may have to add a classification
2837     "Warning" and "Error" to this. That requires more experience,
2838     though, since not every error may be lethal.
2839    
2840     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2841     ShowTable() dialog/frame when the user attempts to display it
2842     while it has been opened before already and not closed again.
2843    
2844 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2845    
2846     * Extensions/wms/infodialog.py: Adjusted the class documentation
2847    
2848     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2849     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2850     wxWidgets variants.
2851     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2852    
2853     * Extensions/wms/infodialog.py: Added an information dialog that
2854     will display various information about the WMS current resource,
2855     so that additional information such as the title, the abstract,
2856     fees and access constraints can be displayed for the user if they
2857     are documented in the WMS XML.
2858    
2859 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2860    
2861     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2862     string handling. It's "foo".lower() and not lower(foo) without
2863     lower imported from strings or something.
2864    
2865     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2866     from capabilities.py and parser.py. Implement priority list for
2867     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2868     and GIF are supported here, but not yet by main Thuban. Hence,
2869     support for them may be removed later. Special contribution to
2870     usability: get wxWidgets to change the cursor when we're waiting
2871     for data from the network so the user won't start to worry. This
2872     causes a redrawing error/warning, though.
2873    
2874     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2875     the DOM object.
2876    
2877     2004-04-01 Martin Schulze <[email protected]>
2878    
2879     * Extensions/wms/capabilities.py: Adjusted documentation
2880     (WMSCapabilities.__init__): Improved documentation, fixed syntax
2881     (WMSCapabilities.saveCapabilities): Only catch IOError when
2882     handling files
2883     (WMSCapabilities.loadCapabilities): Only catch IOError when
2884     handling files
2885     __main__: corrected variable naming
2886     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2887     class a specialisation of WMSCapabilitiesParser as well. Also
2888     execute grok() after loading or fetching capabilities, if that
2889     went well, so that subsequent calls can already access the data.
2890     (WMSCapabilities.getVersion): Export the used version of the
2891     GetCapabilities request, so we can use it for subsequent calls,
2892     i.e. for GetMap requests.
2893     (WMSCapabilities.fetchCapabilities): Added proper error handling
2894     when the GetCapabilities request failed, so that the surrounding
2895     program can act accordingly.
2896    
2897 joey 2146 2004-03-30 Martin Schulze <[email protected]>
2898    
2899     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2900     Adjusted the getLayerSRS method to return the list of SRSes
2901     extracted from <SRS> elements instead of <BoundingBox> elements.
2902     Added a bit of documentation as well.
2903     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2904     since it was only implemented due to a misunderstanding.
2905    
2906     * Extensions/wms/test/test_parser.py
2907     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2908     reflect the corrected interpretation of the standard: i.e. a layer
2909     does not have to define a BoundingBox for all SRSes it supports.
2910     Hence the <SRS></SRS> specification is authoritative, not the list
2911     of BoundingBoxes.
2912     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2913     to ensure None is returned for a non-existing SRS.
2914     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2915     since it is not applicable anymore. Listing more SRSes in <SRS>
2916     elements is valid according to the specs.
2917    
2918 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
2919 joey 2146
2920 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
2921     Reflected wxWidgets name change.
2922    
2923     * Thuban/UI/about.py: Extended copyright to 2004 and added
2924     information about the thuban-devel mailinglist.
2925    
2926 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2927 joey 2120
2928 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
2929     'WMS', also added a linebreak where required
2930    
2931     * Extensions/wms/parser.py: Finally added the XML parser for the
2932     GetCapabilities response.
2933    
2934     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2935     <SRS> elements match the <BoundingBox> elements, except for the
2936     layer 'beschriftung'.
2937    
2938     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2939     since Python uses unicode strings internally, otherwise
2940     comparisons will fail. Removed tests for getLayerBBoxSRS() since
2941     the SRS will be calculated anyway and this method is obsoleted by
2942     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2943     Move loading the sample file into the setUp method. Added a test
2944     for finding the integrity problem in the sample response.
2945     Improved formatting.
2946    
2947     * Extensions/wms/domutils.py: Added convenience routines for
2948     handling of Document Object Model (DOM) nodes.
2949    
2950     * Extensions/wms/test/test_domutils.py: Added a test for the
2951     domutils module
2952    
2953     2004-03-19 Martin Schulze <[email protected]>
2954    
2955 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2956     Moved path detection and adding into a module of its own,
2957     adjustpath, which exports thubandir as main Thuban directory.
2958    
2959     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2960     detection and adding into a module of its own, adjustpath, which
2961     exports thubandir as main Thuban directory. Reorganised the
2962     module in order to support the SkipTest feature for Thuban test
2963     cases.
2964    
2965     * Extensions/wms/test/adjustpath.py: Moved path detection and
2966     adding into a module of its own.
2967    
2968 joey 2115 2004-03-18 Martin Schulze <[email protected]>
2969    
2970     * Extensions/wms/test/test_parser.py: Added another test for
2971     checking whether the WMS XML parser (to be implemented) returns
2972     the information we expect. This requires a sample WMS WML file
2973     (sample.xml) which has been extracted from the frida server and
2974     "improved" manually.
2975    
2976     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2977     main Thuban directory to the path in order to be able to import
2978     random modules. Adjusted the PyOGCLib detection to reuse the
2979     information gathered. Also added a note about the PYTHONPATH
2980     environment variable.
2981    
2982     * Extensions/wms/test/test_ogclib.py: The format specification is
2983     a mime-type, not a graphic format, hence image/jpeg wou ld be the
2984     proper format and not JPEG. We'll also have to take care of the
2985     encoding of / as %2F.
2986    
2987 joey 2111 2004-03-16 Martin Schulze <[email protected]>
2988    
2989     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2990     comprehensive test for the getMapURL method, built compare URLs
2991     according to the documentation in OGC 01-068r3
2992    
2993     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2994     class WMSCapabilities to manage capabilites, will incorporate
2995     parsing the capabilities response and provide details for other
2996     classes.
2997    
2998 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
2999    
3000 bh 2107 Support views in addition to normal tables in the postgis
3001     shapestore
3002    
3003     * Thuban/Model/postgisdb.py
3004     (PostGISShapeStore._fetch_table_information): Add a fallback for
3005     the case where the table name is not in the geometry_columns
3006     table. This is usually the case for views. Also, set
3007     self.shapestore here.
3008     (PostGISShapeStore.ShapeType): No need to query the database all
3009     the time. The shape type is now determined in
3010     _fetch_table_information
3011    
3012     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
3013     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
3014     New parameter to specify views.
3015     (PostGISDatabase.has_data): Also compare the views. New views
3016     parameter
3017     (PostGISDatabase.initdb): Create the views.
3018     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
3019     view
3020    
3021     * test/test_postgis_db.py
3022     (TestPostGISShapestorePointFromViews): New. Test a
3023     PostGISShapeStore with a view
3024     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
3025     the geometry_column explicitly to test whether that works
3026    
3027     2004-03-12 Bernhard Herzog <[email protected]>
3028    
3029 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3030    
3031     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3032     with the following changes:
3033     (dbshapesource): Two new attributes id_column and geometry_column
3034    
3035     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3036     (SessionSaver.write_session): Use the new namespace
3037     (SessionSaver.write_data_containers): Write the new dbshapesource
3038     parameters
3039    
3040     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3041     the new file format version
3042     (SessionLoader.start_dbshapesource): Handle the new db parameters
3043    
3044     * test/test_save.py: Update to the new dtd and namespace
3045     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3046     mock object to provide a working IDColumn method.
3047    
3048     * test/test_load_1_0.py: New. Copy of the test_load.py before
3049     today's changes but with the round-trip tests removed.
3050    
3051     * test/test_load_0_9.py: Update doc-string.
3052    
3053     * test/test_load.py: Update all .thuban files to the new dtd and
3054     namespace.
3055     (TestPostGISLayer.file_contents): Add the new dbshapesource
3056     paramters
3057    
3058 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3059    
3060 bh 2103 Next step for explicit id/geometry columns: User interaction
3061    
3062     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3063     the dialog is constructed. Add combo boxes to select id and
3064     geometry column. Rename some instance variables.
3065     (ChooseDBTableDialog.GetTable): Return id and geometry column
3066     names
3067     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3068     selections in the table list
3069    
3070     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3071     and geometry_column
3072    
3073     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3074     parameters for id_column and geometry column of PostGISShapeStore
3075     here as well.
3076    
3077     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3078     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3079     (PostGISConnection.GeometryTables): Use a better query to
3080     determine which relations in the database might be usable for
3081     shapestores. Now supports views as well but is more PostgreSQL
3082     specific
3083     (PostGISConnection.table_columns): New. Somewhat experimental
3084     method to let the db dialogs provide lists of columns to users so
3085     that they can select id and geometry columns.
3086     (PostGISTable.__init__): The default value of the id_column
3087     parameter is now None it still means "gid" effectively, though.
3088     (PostGISTable.IDColumn): New introspection method to return a
3089     column object for the id column
3090     (PostGISShapeStore.GeometryColumn): New introspection method to
3091     return a column object for the geometry column
3092    
3093     * test/test_postgis_db.py
3094     (TestPostGISConnection.test_gis_tables_non_empty):
3095     Removed. Subsumed by the new:
3096     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3097     New. Tes the GeometryTables and table_columns methods with actual
3098     tables and views.
3099     (PointTests.test_id_column, PointTests.test_geometry_column):
3100     New. tests for the new methods.
3101     (TestPostGISShapestorePoint.setUp)
3102     (TestPostGISShapestorePointSRID.setUp)
3103     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3104     instance variables needed by the new tests
3105    
3106     2004-03-11 Bernhard Herzog <[email protected]>
3107    
3108 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3109     numbers given to ReadValue are ordinals.
3110    
3111     2004-03-11 Bernhard Herzog <[email protected]>
3112    
3113     Elimiate the requirement for PostGIS tables to have a column
3114     called "gid".
3115    
3116     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3117     id_column to specify which column to use to identify rows. Also
3118     new instance variables id_column and quoted_id_column
3119     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3120     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3121     (PostGISTable.SimpleQuery): Use the id column name provided to the
3122     constructor instead of "gid"
3123     (PostGISShapeStore.__init__): New parameter id_column analogously
3124     to PostGISTable.__init__. This parameter is simply passed through
3125     to the base class constructor
3126     (PostGISShapeStore._create_col_from_description): Fix typo in
3127     doc-string
3128     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3129     (PostGISShapeStore.ShapesInRegion): Use the id column name
3130     provided to the constructor instead of "gid"
3131    
3132     * test/postgissupport.py
3133     (PostgreSQLServer.get_default_static_data_db): New static table
3134     landmarks_point_id with an id column != "gid. Update the comments
3135     a bit.
3136     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3137     doc-
3138     (upload_shapefile): New parameter gid_column to use a name other
3139     than "gid" for the column to store the shape ids
3140    
3141     * test/test_postgis_db.py (TableTests): New. Mixin-class
3142     containing all tests previously in TestPostGISTable. The actual
3143     tests are the same but the code is a bit more configurable to
3144     allow for different id columns etc.
3145     (TestPostGISTable): Derive from TableTests now for the actual
3146     tests.
3147     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3148     except that it the landmarks_point_id table to test the id_column
3149     parameter
3150     (PointTests): Extend the doc-string
3151     (TestPostGISShapestorePointExplicitGIDColumn)
3152     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3153     from PointTests to test the explicit id_column parameter. One
3154     tests with the name of the column holding the shape ids, the other
3155     uses PostgreSQL's OID column. For the latter a number of methods
3156     have to be overwritten to make them independent of the actual id
3157     values.
3158    
3159 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3160    
3161     Update debian directory:
3162    
3163     * debian/changelog: Added new version.
3164     * deiban/rules: Updated management of patches (with cbds)
3165     * debian/control: Added cbds to dependencies
3166     * debian/patches/*: New. Adds better support for patches of thuban in
3167     debian
3168     * debian/menu: Syntax of menu changed slightly
3169     * debian/setup.py.patch: removed because it has been moved to
3170     debian/patechs/setup.py.patch
3171    
3172    
3173 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3174    
3175     Create the Doc/technotes directory for text files with information
3176     for developers
3177    
3178     * Doc/technotes/README: New. README for the technotes
3179    
3180     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3181     Thuban
3182    
3183     * Doc/technotes/release_process.txt: New. Used to be
3184     HOWTO-Release. Now slightly adapted to technote formatting style.
3185    
3186     * HOWTO-Release: Removed. It's contents are now in
3187     Doc/technotes/release_process.txt
3188    
3189 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3190    
3191     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3192     version of wxWindows the module was compiled with so we can check
3193     that against the wxPython version.
3194    
3195     * Thuban/version.py (thuban_branch, thuban_release): New variables
3196     controlling which and how Thuban versions are shown. See the
3197     comments for details.
3198     (verify_versions): Also check that the wx version that wxproj is
3199     compiled against matches that of the wxPython we use at runtime
3200    
3201 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3202    
3203 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3204     get_system_proj_file to read the epsg projections. The old way
3205     depended on the current directory being the top Thuban directory.
3206    
3207     2004-02-20 Bernhard Herzog <[email protected]>
3208    
3209 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3210     (TestVirtualDC.test_clippath): Remove a debug print
3211    
3212     2004-02-20 Bernhard Herzog <[email protected]>
3213    
3214 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3215     Extensions/svgexport into a package.
3216    
3217     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3218     doc-string a bit. The doc-string must come first, otherwise it's
3219     not a doc-string. The __future__ import must be the first thing
3220     after the doc-string. Use only double quotes in doc-strings.
3221     Single quotes trip up emacs syntax highlighting if the text
3222     contains apostrophes.
3223    
3224     2004-02-20 Bernhard Herzog <[email protected]>
3225    
3226 bh 2080 * Extensions/svgexport/test/__init__.py,
3227     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3228     suite for svgexport
3229    
3230     * test/runtests.py (find_test_modules): New. Function with the
3231     module finding code from main.
3232     (main): Use find_test_modules to figure out the default test
3233     modules and take modules from Extensions.svgexport.test too.
3234    
3235 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3236    
3237 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3238     the mainwindow has a reference to the map of the initial session.
3239     This fixes a bug introduced with the fix for RT#2245
3240    
3241     2004-02-19 Bernhard Herzog <[email protected]>
3242    
3243 bh 2075 * Extensions/svgexport/svgsaver.py,
3244     Extensions/svgexport/svgmapwriter.py,
3245     Extensions/svgexport/maplegend.py: Added again. This time in the
3246     correct place.
3247    
3248 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3249    
3250 bh 2073 Fix for RT#2245
3251    
3252     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3253     instance variables before trying to create any windows. Creating
3254     windows can start an event loop if e.g. message boxes are popped
3255     up for some reason, and event handlers, especially EVT_UPDATE_UI
3256     may want to access things from the application.
3257     (ThubanApplication.maps_changed): The mainwindow may not have been
3258     created yet, so check whether it has been created before calling
3259     its methods
3260    
3261     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3262     have a map
3263    
3264     2004-02-17 Bernhard Herzog <[email protected]>
3265    
3266 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3267     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3268     extensions/svgexport/svgsaver.py,
3269     extensions/svgexport/svgmapwriter.py,
3270     extensions/svgexport/maplegend.py: Removed. These files were in
3271     the wrong places or didn't work at all.
3272    
3273 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3274    
3275 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3276     line
3277    
3278     2004-02-16 Bernhard Herzog <[email protected]>
3279    
3280 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3281    
3282 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3283    
3284     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3285     to write a session to a file in SVG format.
3286     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3287     to write a SVG map of a session.
3288     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3289     in SVG format for the current session.
3290    
3291 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3292    
3293     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3294     can't be created, return immediately after displaying the error
3295     message.
3296    
3297 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3298    
3299     Handle postgis tables with more than one geometry column.
3300    
3301     * Thuban/Model/postgisdb.py
3302     (PostGISTable._fetch_table_information): Delegate the creation of
3303     column objects to a different method so that we can extend that in
3304     derived classes
3305     (PostGISTable._create_col_from_description): New. Column object
3306     creation part of _fetch_table_information
3307     (PostGISShapeStore._create_col_from_description): New. Extend
3308     inherited method to handle geometry columns
3309     (PostGISShapeStore.__init__): New parameter geometry_column to
3310     specify which geometry column to use. Optional but mandatory for
3311     tables with more than one geometry column
3312     (PostGISShapeStore._fetch_table_information): Also use the name of
3313     the geometry column when looking for the srid
3314     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3315     column when looking for the shape type
3316    
3317     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3318     NonConnectionStore to changes in the PostGISShapeStore
3319    
3320     * test/test_postgis_db.py
3321     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3322     PostGISShapeStore with tables having two geometry columns.
3323    
3324 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3325    
3326     Fix some postgis problems. What remains to be done is real
3327     handling of SRIDs as they affect how reprojection is done
3328    
3329     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3330     doc-string
3331     (PostGISShapeStore._fetch_table_information): New. Extend
3332     inherited method to retrieve srid
3333     (PostGISShapeStore.BoundingBox): Handle tables without data.
3334     extent yields NULL for those
3335     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3336    
3337     * test/test_postgis_db.py
3338     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3339     for the special case of a table without any data
3340     (TestPostGISShapestorePointSRID): New class with tests for a table
3341     that uses srids
3342     (PolygonTests): Fix a doc-string typo
3343    
3344     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3345     reference_systems with a specification of spacial reference
3346     systems to create in the new db.
3347     (PostgreSQLServer.new_postgis_db)
3348     (PostgreSQLServer.get_static_data_db): New parameter
3349     reference_systems to be passed through ultimately to
3350     PostGISDatabase. In new_postgis_db also check whether an existing
3351     db already has the right srids
3352     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3353     table that uses srids
3354     (PostGISDatabase.initdb): Create the entries for the reference
3355     systems
3356     (PostGISDatabase.has_data): Add reference_systems parameter to
3357     check for those too
3358     (upload_shapefile): New parameter srid to create tables with a
3359     specific srid
3360    
3361 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3362    
3363     * po/pt_BR.po: Fixed charset
3364    
3365 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3366    
3367     * po/pt_BR.po: Fixed format string for error message, missing %s
3368     added (Thuban/UI/application.py:273)
3369    
3370 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3371    
3372     First version of Portuguese (Brazilian) translation
3373    
3374     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3375     Brazilian Portuguese by Eduardo Patto Kanegae.
3376    
3377     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3378     translators.
3379    
3380    
3381 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3382    
3383     * Doc/manual/thuban-manual.xml: Added section on installation of
3384     Thuban under Win32 systems. Fixed image path references in the postgis
3385     section. Some minor source formattings.
3386    
3387 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3388    
3389     Make Thuban remember path selections (at least for one application run).
3390    
3391     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3392     attribute of application object. Path is a dictionary of
3393     strings, currently with the items "data" and "projection".
3394     (Application.SetPath): New, stores path for the specified item.
3395     (Application.Path): New, return path for the specified item.
3396    
3397     * Thuban/UI/mainwindow.py
3398     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3399     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3400     MainWindow.TableOpen): Access "data" path information of the
3401     application.
3402    
3403     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3404     Access "projection" path information of the application.
3405    
3406 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3407    
3408 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3409    
3410     2004-01-05 Bernhard Herzog <[email protected]>
3411    
3412 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3413     the translation statistics to the README.
3414    
3415 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3416    
3417 bh 2045 * NEWS: Update for 1.0.0
3418    
3419     * po/it.po: Another update from Maurizio Napolitano
3420    
3421     2003-12-23 Bernhard Herzog <[email protected]>
3422    
3423 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3424    
3425     2003-12-23 Bernhard Herzog <[email protected]>
3426    
3427     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3428     for translation
3429    
3430     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3431     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3432     strings for translation
3433    
3434     * po/de.po: Update with the newly marked strings.
3435    
3436 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3437    
3438 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3439     updated
3440    
3441     2003-12-22 Bernhard Herzog <[email protected]>
3442    
3443 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3444    
3445     * Thuban/version.py (longversion): 1.0.0, yeah!
3446    
3447     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3448     1.0.0 namespace too
3449    
3450     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3451     1.0.0 namespace
3452    
3453     * test/test_load.py (LoadSessionTest.dtd)
3454     (TestSingleLayer.file_contents)
3455     (TestNonAsciiColumnName.file_contents)
3456     (TestLayerVisibility.file_contents)
3457     (TestClassification.file_contents, TestLabels.file_contents)
3458     (TestLayerProjection.file_contents)
3459     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3460     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3461     (TestPostGISLayerPassword.file_contents)
3462     (TestLoadError.file_contents, TestLoadError.test): Update for
3463     1.0.0 namespace
3464    
3465     * test/test_save.py (SaveSessionTest.dtd)
3466     (SaveSessionTest.testEmptySession)
3467     (SaveSessionTest.testSingleLayer)
3468     (SaveSessionTest.testLayerProjection)
3469     (SaveSessionTest.testRasterLayer)
3470     (SaveSessionTest.testClassifiedLayer)
3471     (SaveSessionTest.test_dbf_table)
3472     (SaveSessionTest.test_joined_table)
3473     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3474    
3475     2003-12-22 Bernhard Herzog <[email protected]>
3476    
3477 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3478     alignment flags are byte strings not unicode and that they have
3479     valid values
3480    
3481     * test/test_load.py (TestLabelLayer): New. Test loading (and
3482     indirectly saving) of maps with labels.
3483    
3484     2003-12-22 Bernhard Herzog <[email protected]>
3485    
3486 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3487     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3488     unsubscribe all subscribers.
3489     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3490     self.grid since it may already have been destroyed.
3491     Fixes RT #2256
3492    
3493 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3494    
3495     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3496    
3497 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3498 silke 2029
3499     * debian/bitmappath.patch, debian/setup.py.patch:
3500     added to ensure compliance with FHS for debian
3501     * debian/rules, debian/changelog:
3502     added patches in rules to ensure compliance with FHS for debian
3503 bh 2028
3504 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3505    
3506 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3507     statistics about the translations. Add a comment how produce even
3508     nicer statistics with sed.
3509    
3510 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3511    
3512     * Resources/Projections/defaults.proj:
3513     French projection sample with correct accents (UNICODE).
3514    
3515 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3516    
3517     * MANIFEST.in: Add the devtools directory
3518    
3519     * setup.py (setup call): Use license instead of licence. This
3520     silences a deprecation warning on Python 2.3
3521    
3522 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3523    
3524 frank 2023 Documentation synced with 1.0rc1
3525    
3526     * Doc/manual/thuban-manual.xml:
3527     Minor formatting changes and references to database layers .
3528     Introduction.Internationalization: New section on i18n.
3529     MapManagement.AddingandRemovingLayers: Added item on database layers.
3530     MapManagement.TheLegend: Added section and screenshot on popup menu.
3531     ProjectionManagement: Updated screenshot and sentence on EPSG.
3532     Appendix.SupportedDataSources: Added PostGIS.
3533     Appendix.WorkingwithPostGIS: New section.
3534    
3535     * Doc/manual/images/6_projection.png: Updated screenshot including
3536     EPSG checkboxes.
3537    
3538     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3539    
3540     * Doc/manual/images/app_postgis_add_layer.png,
3541     Doc/manual/images/app_postgis_db_add.png,
3542     Doc/manual/images/app_postgis_db_management.png:
3543     New screenshots focussing on database layers
3544    
3545     2003-12-05 Frank Koormann <[email protected]>
3546    
3547 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3548     write warning to stderr instead of rising a warning dialog
3549    
3550 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3551    
3552 bh 2021 Fix for RT #2243
3553    
3554 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3555     New. Like has_selected_layer but for shape layers only
3556     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3557     shape layers only
3558     (layer_show_table command, layer_jointable command): Use these
3559     commands should only be available for shape layers
3560    
3561     2003-12-03 Bernhard Herzog <[email protected]>
3562    
3563 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3564     publishers that are wx objects and may have been destroyed by wx
3565     already. Fixes RT #2242.
3566    
3567     2003-12-03 Bernhard Herzog <[email protected]>
3568    
3569 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3570    
3571 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3572    
3573     * debian/control, debian/changelog: Added gdal-support to
3574     debian package, updated to new thuban version
3575    
3576    
3577 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3578    
3579     * Thuban/Lib/version.py: New. Module for version number
3580     manipulations. The version of make_tuple here also deals better
3581     with more unusual version number strings, such as e.g.
3582     "1.2+cvs20031111"
3583    
3584     * Thuban/version.py (make_tuple): Removed. It's now in
3585     Thuban.Lib.version. Use that implementation instead.
3586    
3587     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3588    
3589 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3590    
3591 bh 2010 * MANIFEST.in: Add debian files
3592    
3593 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3594     they're installed too
3595     (data_files): Add READMEs and sample data from some Extensions
3596    
3597     * NEWS: Add note about the extensions in binary packages
3598    
3599     2003-12-02 Bernhard Herzog <[email protected]>
3600    
3601 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3602     with the thuban-1.0rc1
3603    
3604     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3605     thuban-1.0rc1 namespace too
3606    
3607     * test/test_save.py (SaveSessionTest.dtd)
3608     (SaveSessionTest.testEmptySession)
3609     (SaveSessionTest.testSingleLayer)
3610     (SaveSessionTest.testLayerProjection)
3611     (SaveSessionTest.testRasterLayer)
3612     (SaveSessionTest.testClassifiedLayer)
3613     (SaveSessionTest.test_dbf_table)
3614     (SaveSessionTest.test_joined_table)
3615     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3616     namespace
3617    
3618     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3619     namespace
3620     (TestSingleLayer.file_contents)
3621     (TestNonAsciiColumnName.file_contents)
3622     (TestLayerVisibility.file_contents)
3623     (TestClassification.file_contents, TestLabels.file_contents)
3624     (TestLayerProjection.file_contents)
3625     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3626     (TestPostGISLayer.file_contents)
3627     (TestPostGISLayerPassword.file_contents)
3628     (TestLoadError.file_contents, TestLoadError.test): Update to
3629     thuban-1.0rc1 namespace
3630    
3631 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3632    
3633 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3634     nt to better match Intevation's current w32 setup
3635    
3636 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3637    
3638     * MANIFEST.in: Add the Extensions
3639    
3640 bh 1998 * NEWS: Update for 1.0rc1
3641    
3642     2003-12-01 Bernhard Herzog <[email protected]>
3643    
3644 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3645     cards for the dialog so that shapefiles ending in all uppercase
3646     SHP are listed too
3647    
3648 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3649    
3650 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3651    
3652     * setup.py (setup call): Update version to 1.0rc1. Use the
3653     [email protected] email address as author email instead of my
3654     personal one.
3655    
3656     2003-11-28 Bernhard Herzog <[email protected]>
3657    
3658 bh 1992 * po/de.po: Update german translation.
3659    
3660     2003-11-28 Bernhard Herzog <[email protected]>
3661    
3662 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3663     files are more platform independend
3664    
3665     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3666     that they can be used on both windows and unix
3667     (SessionSaver.prepare_filename): New. Handle all filename
3668     transformations for filenames stored in the thuban file
3669     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3670     Use prepare_filename
3671    
3672     * test/test_save.py (SaveSessionTest.testSingleLayer)
3673     (SaveSessionTest.testLayerProjection)
3674     (SaveSessionTest.testRasterLayer)
3675     (SaveSessionTest.testClassifiedLayer)
3676     (SaveSessionTest.test_dbf_table)
3677     (SaveSessionTest.test_joined_table): Filenames are always stored
3678     with slashes on all currently supported platforms so adapt all
3679     tests to this
3680    
3681     * test/test_load.py (LoadSessionTest.filenames): With the new
3682     filename scheme the filenames in the tests should be
3683     understandable on all currently supported platforms so we turn
3684     this into an empty list because we don't have to normalize them
3685     anymore
3686    
3687     2003-11-28 Bernhard Herzog <[email protected]>
3688    
3689 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3690     Add the ellipsoid to the projection since some Proj versions
3691     complain if it's missing.
3692    
3693 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3694    
3695     Corect some bounding box projection problems
3696    
3697     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3698     version of ForwardBBox
3699     (Projection._transform_bbox): New. common implementation of
3700     ForwardBBox and InverseBBox
3701     (Projection.ForwardBBox): Use _transform_bbox.
3702    
3703     * test/test_proj.py (TestProjection.test): Add test for
3704     InverseBBox
3705    
3706     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3707     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3708     new InverseBBox method to determine the unprojected bounding box
3709     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3710     bbox.
3711    
3712     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3713     Removed.
3714     (TestLayer.test_arc_layer_with_projection): New. This test is
3715     better able to test whether bounding boxes are projected correctly
3716     than test_point_layer_with_projection
3717    
3718 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3719     InverseBBox to unproject bboxes
3720    
3721 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3722    
3723 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3724     source code.
3725    
3726     2003-11-25 Bernhard Herzog <[email protected]>
3727    
3728 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3729     there for backwards compatibility and all code relying on that
3730     should have been updated by now.
3731    
3732     2003-11-25 Bernhard Herzog <[email protected]>
3733    
3734 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3735     round trip test.
3736     (TestClassification.file_contents): Update to the newest file
3737     format
3738    
3739     2003-11-25 Bernhard Herzog <[email protected]>
3740    
3741 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3742     polygons:
3743    
3744     * Extensions/drawshape/README: New. Brief installation
3745     instructions
3746    
3747     * Extensions/drawshape/drawshape.py: New. Implementation of the
3748     drawshape extensions
3749    
3750     * Extensions/drawshape/patch.diff: Patch to apply before the
3751     extension can be used.
3752    
3753 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3754    
3755 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3756     (ShapefileStore.__init__): Factor opening the shapefile into a
3757     separate method (the new _open_shapefile). This makes the code a
3758     bit more readable but the real reason is that it makes some evil
3759     hacks easier. :-)
3760    
3761     2003-11-24 Bernhard Herzog <[email protected]>
3762    
3763 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3764     converter is specified for an attribute assume it's a string
3765     containing only Latin1 characters. Update doc-string accordingly.
3766     This change should fix many places where unicode objects might
3767     accidentally enter Thuban.
3768    
3769     * test/test_load.py (TestNonAsciiColumnName): New test to check
3770     what happens with column names in DBF files that contain non-ascii
3771     characters
3772    
3773 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3774    
3775     Enable the experimental attribute editing again and introduce a
3776     command line switch to actually activate it
3777    
3778     * Thuban/UI/main.py (options): New. Container for options set on
3779     the commmand line
3780     (main): Add the --enable-attribute-editing flag.
3781    
3782     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3783     editing is enabled use the grid ctrl which allows editing of the
3784     values
3785    
3786     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3787     New. Just delegate this to the underlying table.
3788    
3789 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3790    
3791     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3792     Skip this test if run under non-posix systems since it only works
3793     there
3794    
3795 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3796    
3797 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3798     determined so that we can give a reason in the about why gdal is
3799     not supported.
3800     (gdal_support_status): New. Variable holding a string with the
3801     reason for no gdal support
3802    
3803     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3804     not supported to the message
3805    
3806     2003-11-19 Bernhard Herzog <[email protected]>
3807    
3808 bh 1963 Remove the old table interface and its test cases
3809    
3810     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3811     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3812     anymore
3813    
3814     * Thuban/Model/transientdb.py (TransientTableBase)
3815     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3816     anymore
3817    
3818     * test/test_table.py: Removed since the old interface it tests is
3819     gone.
3820    
3821     * test/runtests.py (main): The old table interface is gone and
3822     with it the deprecation warnings so remove the code that turns
3823     these warnings into errors
3824    
3825     2003-11-19 Bernhard Herzog <[email protected]>
3826    
3827 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3828     tests to use the new table interface is completely wrong since the
3829     whole purpose of the tests in this module is to test the old
3830     interface.
3831    
3832 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3833    
3834 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3835     New. Test whether the connection matches a set of connection
3836     parameters
3837    
3838     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3839     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3840     for existing connections with the same parameters and break out of
3841     the loop correctly.
3842    
3843     * test/test_postgis_db.py (TestBriefDescription)
3844     (TestPostGISSimple.test_brief_description): Rename
3845     TestBriefDescription to TestPostGISSimple and the test method to
3846     test_brief_description so that we can add more test methods.
3847     (TestPostGISSimple.test_matches_parameters): New. Test the new
3848     MatchesParameters method
3849    
3850     2003-11-18 Bernhard Herzog <[email protected]>
3851    
3852 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3853 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3854     already been destroyed.
3855     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3856     been destroyed yet.
3857     (Publisher.Destroy): Set the _was_destroyed flag to true.
3858    
3859     * test/test_connector.py
3860     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3861     calling Unsubscribe after Destroy doesn't raise an exception
3862    
3863 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3864    
3865     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3866     typo in doc-string
3867    
3868 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
3869    
3870     Quote table and column names properly for postgis.
3871    
3872     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3873     quote an identifier for use in an sql statement
3874     (PostGISColumn.__init__): Add the quoted_name attribute
3875     (PostGISTable.__init__): New instance variable quoted_tablename
3876     (PostGISTable._fetch_table_information): Use the quoted table
3877     name. New isntance variable quoted_geo_col with a quoted version
3878     of geometry_column
3879     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3880     (PostGISTable.RowOrdinalToId): Use the quoted table name
3881     (PostGISTable.ReadValue, PostGISTable.ValueRange)
3882     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3883     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3884     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3885     Use quoted table and column names
3886    
3887     * test/test_postgis_db.py (TestPostGISSpecialCases)
3888     (TestPostGISIgnoredColumns): Rename the class to
3889     TestPostGISSpecialCases because that better describes the new
3890     cases
3891     (TestPostGISSpecialCases.test_unsupported_types)
3892     (TestPostGISSpecialCases.test): Rename the method to
3893     test_unsupported_types because we need a more descriptive name now
3894     that there are more methods
3895     (TestPostGISSpecialCases.test_table_name_quoting)
3896     (TestPostGISSpecialCases.test_column_name_quoting)
3897     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3898     cases to test quoting of table and column names in PostGISTable
3899     and PostGISShapeStore
3900    
3901     * test/postgissupport.py
3902     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3903     AddGeometryColumn desn't support table or column names with sapces
3904     or double quotes
3905    
3906 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
3907    
3908     * Extensions/wms/__init__.py: New: Init to make this
3909     directory a package.
3910    
3911     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3912    
3913 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
3914    
3915 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3916     Constant for the file woth deprecated epsg projections
3917     (get_system_proj_file): Update doc-string
3918    
3919     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3920     above the EPS widgets, introduce a check box for the deprecated
3921     eps projections and a label for the epsg widgets
3922     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3923     too
3924    
3925     2003-11-11 Bernhard Herzog <[email protected]>
3926    
3927 bh 1939 Avoid warnings when run under Python 2.3
3928    
3929     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3930     (BaseRenderer.draw_label_layer): Coordinates must be ints.
3931    
3932     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3933     real method so that we can convert to int.
3934     (MapRenderer.label_font): The font size mist be an int.
3935    
3936     * Thuban/UI/common.py (Color2wxColour): The color values must be
3937     ints. Also, remove the unnecessary asserts.
3938    
3939     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3940     (TestUnicodeStrings.test): Python source code should not contain
3941     non-ascii characters unless an encoding is specified in the file.
3942     Therefore use \x escapes in the string literals for non-ascii
3943     characters.
3944    
3945     2003-11-11 Bernhard Herzog <[email protected]>
3946    
3947 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3948     parameter so that this function can be used for all proj files in
3949     Resource/Projections
3950     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3951     get_system_proj_file
3952    
3953     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3954     ProjFile self.__sysProjFile use a dictionary of system ProjFile
3955     objects self._sys_proj_files
3956     (ProjFrame.build_dialog): Adapt to the new changes in the
3957     ProjectionList constructor. Add a check button to toggle whether
3958     EPSG projections are shown
3959     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3960     events.
3961     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3962     the busy cursor if the files have not yet been loaded by the
3963     dialog.
3964     (ProjFrame.load_system_proj): Add a parameter for the name of the
3965     proj file. Maintain the dictionary of system projections
3966     self._sys_proj_files
3967    
3968     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3969     user_projs parameters into one parameter proj_files which is a
3970     list of proj files.
3971     (ProjectionList._subscribe_proj_files)
3972     (ProjectionList._unsubscribe_proj_files): New. Move
3973     subscription/unsubscription of projfile messages to separate
3974     methods
3975     (ProjectionList.Destroy): The unsubscribe is now done in
3976     _unsubscribe_proj_files
3977     (ProjectionList.update_projections): We now have a list of proj
3978     file objects
3979     (ProjectionList.SetProjFiles): New method to set a new list of
3980     proj file objects
3981    
3982     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3983     Specify explicitly which system proj file to load.
3984    
3985     2003-11-11 Bernhard Herzog <[email protected]>
3986    
3987 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3988     instance variables to cut cyclic references. The GC would have
3989     collected the loader eventually but it can happen that it doesn't
3990     run at all until thuban is closed (2.3 but not 2.2 tries a bit
3991     harder and forces a collection when the interpreter terminates)
3992     (load_session): Call the handler's Destroy method to make sure
3993     that it gets garbage collected early. Otherwise it will be
3994     collected very late if at all and it holds some references to e.g.
3995     shapestores and the session which can lead to leaks (of e.g. the
3996     temporary files)
3997    
3998     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3999     resource leak in load_session
4000    
4001 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
4002    
4003     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
4004     extensions are to be rendered.
4005     (_renderer_extensions): New. List with renderer for layers in
4006     extensions
4007     (add_renderer_extension): New. Add a renderer extension
4008     (init_renderer_extensions): New. Init the renderer extensions
4009     (BaseRenderer.render_map_incrementally): Search
4010     _renderer_extensions for how to draw unknown layer types
4011     (BaseRenderer.draw_raster_data): Add format parameter so that
4012     formats other than BMP can be drawn
4013     (BaseRenderer.draw_raster_layer): Pass an explicit format to
4014     draw_raster_data
4015    
4016     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
4017     strings of the format parameter of draw_raster_data method to wx
4018     constants
4019     (MapRenderer.draw_raster_data): Add the format parameter and use
4020     raster_format_map to map it to the right wxwindows constant for
4021     wxImageFromStream
4022    
4023     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
4024     the format parameter and record it
4025     (TestBaseRenderer.test_raster_no_projection): check the format
4026     paramter of the draw_raster_data method
4027     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4028     extension facility
4029    
4030 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4031    
4032     Tweak the usage of the sqlite database to make common use cases
4033     more responsive. In most cases copying the data to the sqlite
4034     database takes so long that using sqlite doesn't have enough
4035     advantages.
4036    
4037     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4038     comments about performance and query the min and max in separate
4039     statements because only that way will indexes be used.
4040     (TransientTableBase.UniqueValues): Add some comments about
4041     performance.
4042     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4043     Do not copy the data to the transient DB but use the transient
4044     copy if it exists. See the new comments for the performance trade
4045     offs
4046    
4047     * test/test_transientdb.py
4048     (TestTransientTable.test_auto_transient_table): Make sure that the
4049     data is copied to the transient database at some point.
4050    
4051 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4052    
4053 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4054     globals to locals so that it's a bit faster
4055    
4056     2003-11-03 Bernhard Herzog <[email protected]>
4057    
4058 bh 1920 * Thuban/UI/baserenderer.py
4059     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4060     method. ReadValue is faster than ReadRowAsDict since it only reads
4061     one cell especially now that the dbf file objects actually
4062     implement it.
4063    
4064     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4065     read_attribute method of the dbf objects
4066    
4067     2003-11-03 Bernhard Herzog <[email protected]>
4068    
4069 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4070     variable to indicate whether the result should be shown in a
4071     dialog box
4072     (profile_screen_renderer, time_screen_renderer): Only show a
4073     dialog box if popup_dialog_box is true.
4074     (profile_screen_renderer): Flush stdout after the printing the
4075     first part of the "profiling..." message
4076    
4077     * Thuban/UI/baserenderer.py
4078     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4079     brushes for the groups so that they're not created over and over
4080     again
4081    
4082 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4083     (Classification._compile_classification)
4084     (Classification._clear_compiled_classification): New. Methods to
4085     manage a 'compiled' representation of the classification groups
4086     which is created on demand
4087     (Classification.InsertGroup, Classification.RemoveGroup)
4088     (Classification.ReplaceGroup): reset the compiled representation
4089     (Classification.FindGroup): Use the compiled representation to
4090     find the matching group
4091     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4092    
4093 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4094    
4095 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4096     Send a CLASS_CHANGED message
4097     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4098     not return the removed group since it wasn't used.
4099    
4100     * test/test_classification.py
4101     (TestClassification.test_set_default_group): New. Test the
4102     SetDefaultGroup method
4103     (TestClassification.test_insert_group): New. Test the InsertGroup
4104     method
4105     (TestClassification.test_remove_group): New. Test the RemoveGroup
4106     method
4107     (TestClassification.test_replace_group): New. Test the
4108     ReplaceGroup method
4109    
4110     2003-10-31 Bernhard Herzog <[email protected]>
4111    
4112 bh 1908 * test/test_classification.py (TestClassification.setUp):
4113     Subscribe to the CLASS_CHANGED messages
4114     (TestClassification.tearDown): New. Destroy the classification
4115     properly
4116     (TestClassification.test_defaults): Add tests for the default line
4117     width and whether no messages were sent yet
4118     (TestClassification.test_set_default_properties): Add tests for
4119     messages and setting the default line width
4120     (TestClassification.test_add_singleton)
4121     (TestClassification.test_add_range)
4122     (TestClassification.test_multiple_groups): Add tests for messages
4123    
4124     2003-10-31 Bernhard Herzog <[email protected]>
4125    
4126 bh 1906 Some more refactoring in preparation for new tests:
4127    
4128     * test/test_classification.py (TestClassification.setUp): New.
4129     Instantiate the classification here. Update the test methods
4130     accordingly.
4131     (TestClassification.test_multiple_groups): Make sure that the two
4132     singletons matching 1 are considered different.
4133    
4134     2003-10-31 Bernhard Herzog <[email protected]>
4135    
4136 bh 1904 * test/test_classification.py (red, green, blue): New. These
4137     constants were used in several cases. Update the relevant methods.
4138     (TestClassification.test_defaults)
4139     (TestClassification.test_set_default_properties)
4140     (TestClassification.test_add_singleton)
4141     (TestClassification.test_add_range)
4142     (TestClassification.test_multiple_groups)
4143     (TestClassification.test_deepcopy): New. These were formerly all
4144     part of the single method test.
4145     (TestClassification.test_deepcopy): Removed.
4146     (TestClassIterator): Removed. The test case is now a method of
4147     TestClassification since it tests part of the public interface of
4148     Classification
4149     (TestClassification.test_iterator): New. Used to be
4150     TestClassIterator effectively
4151    
4152 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4153    
4154     GUIfied the functions of the profiling extension.
4155    
4156     * /Extensions/profiling/__init__.py: New: Init to make this
4157     directory a package.
4158    
4159     * Extensions/profiling/profiling.py: Moved menu entries to
4160     the Extensions menu. Applied _() for strings.
4161     (profile_screen_renderer): Catch the detailed printout and present
4162     it in a dialog.
4163 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4164 jan 1902 of printing it to stdout.
4165    
4166 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4167    
4168 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4169     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4170     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4171     Split TestClassification into several classes, one for each class
4172     being tested. TestClassification itself now only tests
4173     Classification. This split makes changes to the tests a bit easier
4174    
4175     2003-10-31 Bernhard Herzog <[email protected]>
4176    
4177 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4178     Thuban performance
4179    
4180 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4181    
4182     Added two items to legend popup menu: Remove Layer and Show Layer Table
4183    
4184     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4185     LegendPanel._OnShowTable): New event handlers, call the corresponding
4186     mainwindow methods.
4187     (LegendTree._OnRightClick): Added items to popup menu.
4188    
4189 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4190    
4191     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4192     EVT_WINDOW_DESTROY
4193     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4194     nothing but is convenient for the derived classes.
4195    
4196     * Thuban/UI/tableview.py
4197     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4198     Unsubscribe the messages here not in OnClose because that might
4199     get called multiple times. Fixes RT #2196
4200     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4201     anymore.
4202    
4203     * README: Update the minimum requirement for wxPython. Since we
4204     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4205     the version in which that was introduced for all platforms
4206    
4207 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4208    
4209     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4210     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4211     frame.
4212    
4213 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4214    
4215     Improved APR import extension, added further EPSG definitions
4216     and some cleanup regarding string class.
4217    
4218     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4219     Added test for alias 'longlat'.
4220    
4221     * Resources/Projections/epsg-deprecated.proj: New. Contains
4222     deprecated EPSG definitions.
4223    
4224     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4225     the variable names for objects.
4226    
4227     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4228     Copied from importAPR and provided with documentation.
4229    
4230     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4231     Moved to apr.py.
4232     (APR_View): Added object ref 'ITheme'.
4233    
4234     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4235     split function by corresponding use of the string class method.
4236    
4237     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4238     corresponding string method.
4239    
4240 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4241    
4242     * Thuban/UI/baserenderer.py
4243     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4244     special case of a classification that only has the default group
4245    
4246 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4247    
4248 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4249    
4250 bh 1876 * po/de.po: Update.
4251    
4252     * Thuban/UI/application.py
4253     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4254     dialog message properly
4255    
4256     2003-10-27 Bernhard Herzog <[email protected]>
4257    
4258 bh 1873 Rework how localization works so that we use wx's translation
4259     functions when running Thuban as a normal application but not when
4260     we don't need any UI, such as in the test suite. See the comment
4261     in Thuban/__init__.py for details
4262    
4263     * Thuban/__init__.py (_): Add one level of indirection to make the
4264     translation handling more flexible and to make it possible to use
4265     either wx's translation services or not.
4266     (gettext_identity, translation_function_installed)
4267     (install_translation_function): New function to help with this
4268    
4269     * Thuban/UI/__init__.py: Install the wx specific translation
4270     function if it's OK to do that
4271    
4272     * test/support.py (initthuban): Install a dummy translation
4273     function so that importing Thuban.UI doesn't install a wx specific
4274     one for which would need to import wxPython
4275    
4276     2003-10-27 Bernhard Herzog <[email protected]>
4277    
4278 bh 1870 * HOWTO-Release: Source archives should be created first and the
4279     binary packages should be created from the source archives.
4280     There's an official debian package now so there's no need to test
4281     the rpm on debian anymore
4282    
4283     2003-10-27 Bernhard Herzog <[email protected]>
4284    
4285 bh 1868 Several rendering changes:
4286    
4287     - Render the selection into a separate bitmap so that only that
4288     bitmap needs to be redrawn when the selection changes
4289    
4290     - Render incrementally showing previews and allowing interaction
4291     before rendering is complete
4292    
4293     - Update the renderer interface a bit. Most parameters of
4294     RenderMap are now parameters of the constructor
4295    
4296     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4297     and the update region as parameters. Update the doc-string
4298     (BaseRenderer.render_map_incrementally): New. Generator function
4299     to renders the map incrementally
4300     (BaseRenderer.render_map): Remove the map argument (it's now in
4301     the constructor) and simply iterate over the
4302     render_map_incrementally generator to draw the map.
4303     (BaseRenderer.draw_shape_layer_incrementally)
4304     (BaseRenderer.draw_shape_layer): Renamed to
4305     draw_shape_layer_incrementally and changed into a generator that
4306     yields True every 500 shapes. Used by render_map_incrementally to
4307     render shape layers incrementally
4308    
4309     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4310     map and region parameters which are now in the constructor
4311     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4312     the inherited render_map_incrementally.
4313     (BaseRenderer.draw_shape_layer): Removed.
4314     (ScreenRenderer.draw_selection_incrementally): New. The selection
4315     drawing part of the removed draw_shape_layer as a generator
4316     (ScreenRenderer.layer_shapes): Update because of the region
4317     parameter change
4318     (ExportRenderer.__init__): New. Extend the inherited constructor
4319     with the destination region for the drawing
4320     (ExportRenderer.RenderMap): Removed the map and region parameters
4321     which are now in the constructor
4322    
4323     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4324     bitmap suitable for a preview in a tool
4325     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4326     bitmap
4327     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4328     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4329     exists
4330     (MapCanvas.OnIdle): Update the logic to deal with incremental
4331     rendering and the selection bitmap
4332     (MapCanvas._do_redraw): Handle the instantiation of the render
4333     iterator and the redraws during rendering
4334     (MapCanvas._render_iterator): New. Generator to incrementally
4335     redraw both bitmaps
4336     (MapCanvas.Export): Adapt to new renderer interface.
4337     (MapCanvas.full_redraw): Reset the selection bitmap and the
4338     renderer iterator too
4339     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4340     bitmap
4341     (MapCanvas.shape_selected): Only redraw the selection bitmap
4342    
4343     * test/test_baserenderer.py
4344     (TestBaseRenderer.test_polygon_no_projection)
4345     (TestBaseRenderer.test_raster_no_projection)
4346     (TestBaseRenderer.test_point_map_projection)
4347     (TestBaseRenderer.test_point_layer_and_map_projection)
4348     (TestBaseRenderer.test_point_layer_projection)
4349     (TestBaseRenderer.test_point_with_classification): Adapt to new
4350     renderer interface
4351    
4352 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4353    
4354     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4355     (point_in_polygon_shape, shape_centroid): Raise an exception if
4356     the shape can't be read. Previously invalid shape ids would lead
4357     to a segfault.
4358    
4359     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4360     New. test whether an exception is raised for invalid shape ids
4361    
4362 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4363    
4364 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4365     as alias for 'latlong'.
4366    
4367     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4368     as alias for 'latlong'.
4369    
4370     2003-10-24 Jan-Oliver Wagner <[email protected]>
4371    
4372 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4373     the projection even for the UnknownPanel.
4374     (UnknownProjPanel.__init__): Define the text and create the textctrl
4375     widget.
4376     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4377     textctrl created in __init__.
4378     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4379     including the parameters of the projection.
4380    
4381     2003-10-24 Jan-Oliver Wagner <[email protected]>
4382    
4383 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4384     EPSG codes with parameters for proj. The list has been
4385     generated using devtools/create_epsg.py based on the
4386     file nad/epsg of the proj 4.4.7 package. Four projection
4387     definitions have been deleted as they are not accepted by proj:
4388     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4389     and "HD72 / EOV".
4390    
4391 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4392    
4393     Some more tweaks to the projection dialog which should fix RT
4394     #1886.
4395    
4396     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4397     the ProjFile's messages and call the base class methods correctly
4398     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4399     flag on the newly selected item too. Otherwise some other item is
4400     focused and the first time the focus is moved with the keyboard
4401     the selection moves in unexpected ways.
4402    
4403     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4404     focus on the OK button, only on the projection list. That way the
4405     list really has the focus initially
4406     (ProjFrame.OnClose): Call the projection list's Destroy method to
4407     make it unsubscribe all messages
4408    
4409 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4410    
4411 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4412     and most of 2168
4413    
4414     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4415     special wxListCtrl to show a list of projections in a more MVC
4416     fashion
4417    
4418     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4419     throughout the class. The main change is to use the ProjectionList
4420     class instead of a normal wxListBox. Also, add an explicit
4421     "Unknown" projection to the projection choice control.
4422     (ProjPanel.__init__): Add an "unknown" ellipsoid
4423     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4424     instantiation of the panel's controls to make the tab-order more
4425     natural
4426    
4427     2003-10-21 Bernhard Herzog <[email protected]>
4428    
4429 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4430     (TestSingleLayer.test): Add non-ascii characters to the titles of
4431     session, map and layer. This is effectively a port of the
4432     TestUnicodeStrings test in test_load_0_8.py which for some reason
4433     was only added there.
4434    
4435     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4436     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4437     characters to the titles of session, map and layer,.
4438    
4439     2003-10-21 Bernhard Herzog <[email protected]>
4440    
4441 bh 1847 Add EPSG projection handling to .thuban files
4442    
4443     * test/test_save.py (SaveSessionTest.dtd)
4444     (SaveSessionTest.testEmptySession)
4445     (SaveSessionTest.testLayerProjection)
4446     (SaveSessionTest.testRasterLayer)
4447     (SaveSessionTest.testClassifiedLayer)
4448     (SaveSessionTest.test_dbf_table)
4449     (SaveSessionTest.test_joined_table)
4450     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4451     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4452     use a and epsg projection to test saving them
4453    
4454     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4455     namespace
4456     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4457     (TestLayerProjection.file_contents)
4458     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4459     (TestPostGISLayer.file_contents)
4460     (TestPostGISLayerPassword.file_contents)
4461     (TestLoadError.file_contents, TestLoadError.test): Update to use
4462     1.0-dev namespace
4463     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4464     use 1.0-dev namespace and use an EPSG projection to test whether
4465     loading it works
4466    
4467     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4468     as of Thuban 0.9. These are now tests to determine whether Thuban
4469     can still read files generated by Thuban 0.9
4470    
4471     * Thuban/Model/save.py (SessionSaver.write)
4472     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4473     namespace
4474     (SessionSaver.write_projection): Write the projection's epsg
4475     attribute
4476    
4477     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4478     thuban-1.0-dev.dtd namespace
4479     (SessionLoader.check_attrs): Allow a callable object as conversion
4480     too
4481     (SessionLoader.start_projection, SessionLoader.end_projection)
4482     (SessionLoader.start_parameter): Handle the epsg attribute and
4483     rename a few instance variables to lower case
4484    
4485     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4486     thuban-0.9.dtd is the epsg attribute for projections.
4487    
4488     2003-10-21 Bernhard Herzog <[email protected]>
4489    
4490 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4491     on the command line
4492    
4493     * test/support.py (ThubanTestResult.getDescription): Override to
4494     give a better short description. The description can be used as a
4495     parameter to run_tests to run that particular test in isolation.
4496    
4497 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4498    
4499     Popup menu for legend. Scheduled for the 1.2 release this was too
4500     simple to implement: The popup menu is bound to the legend tree, while
4501     the events are hanlded by its anchestor, the legend panel. This
4502     allows reuse of all the event handlers already implemented for the
4503     legend toolbar buttons.
4504    
4505     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4506     to add handlers for the events issued by the popup menu.
4507     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4508     visibility event
4509     (LegendPanel._OnProjection): Handler for layer projection event.
4510     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4511     (LegendTree._OnRightClick): Event handler for right click, select item
4512     and pop up menu.
4513     (LegendTree.ToggleVisibility): Toggle layer visibility
4514     (LegendTree.LayerProjection): Raise layer projection dialog for
4515     current layer.
4516    
4517 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4518    
4519     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4520     declaration. The top-level element is projectionlist not projfile
4521    
4522 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4523    
4524     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4525     method to write a projfile and display a busy cursor and error
4526     dialogs.
4527     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4528     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4529     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4530     busy cursor while loading the user and system prj files.
4531    
4532 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4533    
4534     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4535     ProjFile objects
4536     (clear_proj_file_cache): New function to clear the cache. Mainly
4537     useful for use by the test suite
4538     (read_proj_file): Use the cache.
4539    
4540     * test/test_proj.py (TestProjFile): Clarify the doc-string
4541     (ProjFileReadTests): Update doc-string
4542     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4543     system proj files is cached.
4544     (ProjFileLoadTestCase): New base class for the proj file tests
4545     derived from support.FileLoadTestCase to provide some common
4546     behavior.
4547     (TestLoadingProjFile)
4548     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4549     (TestProjFileWithInvalidParameters.file_contents): Derive from
4550     ProjFileLoadTestCase
4551     (TestLoadingProjFile.test_caching): New. Test whether the cache
4552     works
4553    
4554 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4555    
4556     * debian/*: New directory with configuration files for building a thuban
4557     deb-package.
4558    
4559 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4560    
4561 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4562     __main__ so that missing unsubscribes are detected
4563     (TestProjFile.tearDown): Destroy the proj_file properly
4564    
4565     2003-10-14 Bernhard Herzog <[email protected]>
4566    
4567 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4568     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4569     the ProjFile objects
4570    
4571     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4572     easily send messages when the projections change
4573     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4574     when the change was successful
4575    
4576     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4577     proj file messages
4578     (TestProjFile.test_add_remove)
4579     (TestProjFile.test_remove_non_existing)
4580     (TestProjFile.test_replace)
4581     (TestProjFile.test_replace_non_existing): Test whether the right
4582     messages are sent
4583    
4584     2003-10-14 Bernhard Herzog <[email protected]>
4585    
4586 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4587     tests
4588     (TestProjFile.test_add_remove)
4589     (TestProjFile.test_remove_non_existing)
4590     (TestProjFile.test_replace)
4591     (TestProjFile.test_replace_non_existing): Some of the new
4592     individual test cases
4593     (TestProjFileSimple): New class for the rest of the test cases
4594     that came out of the refactoring
4595     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4596     derived classes don't have to
4597    
4598 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4599    
4600 bh 1820 Add an optional EPSG code to the projection objects and extend the
4601     .proj file format accordingly.
4602    
4603     * Resources/XML/projfile.dtd (element projection): Add epsg
4604     attribute
4605    
4606     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4607     instance variable epsg. Update doc-string
4608     (Projection.EPSGCode, Projection.Label): New methods to provide
4609     access to EPSG code and a label for use in dialogs
4610    
4611     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4612     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4613     Handle the epsg code attribute when reading or writing proj files
4614    
4615     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4616     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4617     (ProjFrame.__FillAvailList): Use the projection's Label method to
4618     get the string for the list box
4619    
4620     * test/test_proj.py (TestProjection.test_label)
4621     (TestProjection.test_label_epsg)
4622     (TestProjection.test_epsgcode_for_non_epsg_projection)
4623     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4624     for the label and EPSGCode methods
4625     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4626     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4627     objects in the test cases and put the expected contents into the
4628     test case methods too. Update doTestWrite accordingly
4629     (TestLoadingProjFile)
4630     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4631     read tests from TestProjFile.
4632     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4633     tests are now in the new classes.
4634     (sample_projfile, sample_projfile_data)
4635     (sample_projfile2, sample_projfile_data2): Removed. Not used
4636     anymore.
4637     (TestProjFile.test_read_unreadable_file): No need to reset the
4638     permissions at the end anymore since we use a unique filename
4639    
4640     2003-10-13 Bernhard Herzog <[email protected]>
4641    
4642 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4643     (ProjFileTest): New base class for the proj file tests.
4644     (TestProjFile): Derive from ProjFileTest
4645     (TestProjFile.test_read_unreadable_file)
4646     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4647     the new filename method to get a unique filename
4648     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4649     (WriteProjFileTests): New class for proj file write tests.
4650     Contains the write test that were in TestProjFile originally.
4651    
4652     2003-10-13 Bernhard Herzog <[email protected]>
4653    
4654 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4655     (TestProjFile.test_read_non_existing_file)
4656     (TestProjFile.test_read_unreadable_file)
4657     (TestProjFile.test_read_empty_file): Split into several methods.
4658    
4659 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4660    
4661 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4662    
4663     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4664     all projection type specific panels and put them into a
4665     NotebookLikeSizer. This way the dialog doesn't change its size
4666     when a different projection is selected
4667     (ProjFrame.__init__): Rename projection_panels
4668     projection_panel_defs and reuse projection_panels for a list of
4669     the instantiated panels.
4670     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4671     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4672     the panels
4673     (UnknownProjPanel._DoLayout): Place the newlines in the message
4674     differently to make the panel narrower.
4675     (TMPanel._DoLayout): Layout the parameters in one column.
4676    
4677     2003-10-10 Bernhard Herzog <[email protected]>
4678    
4679 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4680     that contains all the setup for the dialog's widgets, layout and
4681     event handling.
4682     (__): Call build_dialog to build the dialog.
4683     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4684     Their functionality is now in build_dialog
4685     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4686     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4687     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4688     different widget names and hierarchy introduced with build_dialog.
4689    
4690     2003-10-10 Bernhard Herzog <[email protected]>
4691    
4692 bh 1805 * README: Fix typo.
4693    
4694 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4695    
4696     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4697     projection is already in the list. This is *a lot* faster when
4698     loading files with hundreds of projections since it saves a linear
4699     search. OTOH this will allow adding the same projection to the
4700     user.proj file multiple times in the projection dialog but we'll
4701     deal with that later
4702    
4703 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4704    
4705     * devtools: New. Directory for developer tools that are not intended
4706     for the regular user.
4707    
4708     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4709     a python .proj file.
4710    
4711 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4712    
4713     * test/test_proj.py
4714     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4715     whether GetParameter handles parameters without "=" sign correctly
4716    
4717     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4718     parameters that do not contain a "=". Update the doc-string
4719    
4720 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4721    
4722 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4723     length limit on the projname text control
4724    
4725     2003-10-08 Bernhard Herzog <[email protected]>
4726    
4727 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4728     (TestProjection.test_get_projection_units_normal): New. Tests for
4729     the Projection.GetProjectedUnits method
4730    
4731 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4732    
4733     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4734     Added missing 'val' parameter.
4735    
4736 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4737    
4738 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4739     projection type of the currently selected projection is not known,
4740     i.e. there's no panel for it, use the UnknownProjPanel
4741     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4742     the actual replacing of the proj panel into the new method
4743     _show_proj_panel.
4744     (UnknownProjPanel): Add doc-string.
4745     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4746     that the panel is not so wide.
4747    
4748     2003-10-08 Bernhard Herzog <[email protected]>
4749    
4750 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4751     too. Update the doc-string
4752     (get_proj_files): Removed. It wasn't used anywhere
4753     (get_system_proj_files, get_system_proj_file): Rename to
4754     get_system_proj_file and return the ProjFile object and not a list
4755     of ProjFile objects. Update the callers.
4756     (get_user_proj_files, get_user_proj_file): Rename to
4757     get_user_proj_file return the ProjFile object and not a list of
4758     ProjFile objects. Update the callers.
4759     (ProjFileReader.__init__): New instance variable for the warnings.
4760     Rename the __pf ivar to projfile. Update the methods referring to
4761     __pf
4762     (ProjFileReader.end_projection): Catch any errors raised when
4763     instantiating the projection and record that as an error. The
4764     projection will not be in the final ProjFile object.
4765     (ProjFileReader.GetWarnings): New method to return the warnings.
4766    
4767     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4768     show the warnings from the projfile reader
4769     (ProjFrame._OnImport): Deal with any warnings returned by
4770     read_proj_file
4771     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4772     get_system_proj_file or get_user_proj_file.
4773    
4774     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4775     (TestProjFileWithInvalidParameters.file_contents): New test cases
4776     to test whether read_proj_file handles invalid projection
4777     parameters correctly
4778     (TestProjFile.test_get_system_proj_file): New. Simple test for
4779     resource.get_system_proj_file
4780    
4781 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4782    
4783     * test/test_derivedshapestore.py
4784     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4785     properly so that the temporary directories get deleted correctly
4786    
4787 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4788    
4789 bh 1783 Handle the title changes in a proper MVC way.
4790    
4791     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4792     canvas' TITLE_CHANGED messages
4793     (MainWindow.update_title): New. Update the main window's title
4794     (MainWindow.__SetTitle): Removed. Use update_title instead.
4795     (MainWindow.SetMap): Use update_title instead of __SetTitle
4796     (MainWindow.RenameMap): Do change the window title explicitly
4797     here. That's handled in a proper MVC way now.
4798     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4799     messages
4800    
4801     * Thuban/Lib/connector.py (Conduit): New class to help classes
4802     that forward messages
4803    
4804     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4805     (ViewPort): Derive from Conduit instead of Publisher
4806     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4807     when calling the inherited versions
4808     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4809     methods to subscribe and unsubscribe map messages
4810     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4811     handle the map subscriptions
4812     (ViewPort.Map, ViewPort.map_projection_changed)
4813     (ViewPort.layer_projection_changed): Add or update doc-strings
4814    
4815     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4816     typo
4817     (MyConduit): Helper class for the Conduit test.
4818     (TestConduit): Test cases for Conduit
4819    
4820     * test/test_connector.py: Use support.run_tests as main.
4821    
4822     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4823     the TITLE_CHANGED messages
4824     (ViewPortTest.test_forwarding_title_changed): New test to check
4825     whether the viewport forwards the map's TITLE_CHANGED messages
4826     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4827     after the port's because the latter may require a still functional
4828     map.
4829    
4830     2003-10-06 Bernhard Herzog <[email protected]>
4831    
4832 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4833     doc-string
4834    
4835     2003-10-06 Bernhard Herzog <[email protected]>
4836    
4837 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4838     (SimpleViewPortTest.test_init_with_size): Move the test for the
4839     initial size as a constructor parameter from ViewPortTest.setUp
4840     method to a new separate test in SimpleViewPortTest.
4841    
4842     2003-10-06 Bernhard Herzog <[email protected]>
4843    
4844 bh 1773 * test/test_viewport.py (MockView): New class derived from
4845     ViewPort with a mock implementation of GetTextExtent to be used in
4846     the test cases
4847     (ViewPortTest.setUp): Use MockView instead of ViewPort
4848    
4849     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4850     into what would be a "pure virtual function" in C++: always raise
4851     NotImplementedError. Mock implementations for test cases don't
4852     belong into the real code
4853    
4854 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4855    
4856     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4857     close the dbf file we create so that it's contents have been
4858     written properly.
4859    
4860     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4861     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4862     Update to shapelib 1.2.10
4863    
4864 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4865    
4866     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4867     it annoys lintian which warns about these files not being
4868     executable. The #! isn't necessary here since if you absolutely
4869     must execute them you can always say "python <filename>".
4870    
4871 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
4872    
4873 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4874     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4875     is ported to a newer the import will fail, so it should be noticed
4876     immediately that this function is gone.
4877     Fixes RT#1919
4878    
4879     2003-09-26 Bernhard Herzog <[email protected]>
4880    
4881 bh 1757 Add a DTD for the projection files and make thuban write valid
4882     projection files
4883    
4884     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4885     files
4886    
4887     * Thuban/Model/resource.py (ProjFileSaver.write): Use
4888     'projectionlist' as the name in the document type declaration so
4889     that it matches the element type of the root element.
4890    
4891     * test/test_proj.py (sample_projfile, sample_projfile2): Use
4892     'projectionlist' as the name in the document type declaration just
4893     as it is done now in the files thuban would write
4894     (sample_projfile, sample_projfile_data): Fix spelling of
4895     "Mercator"
4896     (TestProjFile.doTestWrite): Validate the written and the expected
4897     XML data
4898     (TestProjFile): Derive from ValidationTest so that we can run xml
4899     validation tests
4900    
4901 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
4902    
4903     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4904     modify the list returned by map.Layers() in place since it is the
4905     actual list of layers used by the map.
4906    
4907 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
4908    
4909     * Doc/manual/thuban-manual.xml: Added subsection to chapter
4910     Extensions to describe the extensions coming with the Thuban
4911     standard package (gns2shp and importAPR).
4912    
4913 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
4914    
4915     * libraries/thuban/wxproj.cpp (project_point): if there's an
4916     inverse but no forward projection, convert to degrees after
4917     applying the inverse projection. Fixes RT#2096
4918    
4919     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4920     implicitly tests for the fix to RT#2096
4921    
4922     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4923     Check that the sequences have the same lengths
4924    
4925     * Resources/Projections/defaults.proj (Geographic projection): Use
4926     a much more precise value for the to_meter attribute.
4927    
4928 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
4929    
4930     * test/support.py (initthuban): Make sure to unset the LANG env.
4931     var. so that tests that compare translated strings work. Solves RT
4932     #2094
4933    
4934 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
4935    
4936 jan 1735 Small improvement of APR import.
4937    
4938     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4939     Added tests for text-ranges.
4940    
4941     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4942     returns a string object if the range is based on text.
4943    
4944     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4945     range retrieval.
4946    
4947     2003-09-22 Jan-Oliver Wagner <[email protected]>
4948    
4949 jan 1730 Initial version of the importAPR extension which is in
4950     experimental state.
4951    
4952     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4953     /Extensions/importAPR/test/: New directories.
4954    
4955     * /Extensions/importAPR/samples/README: New: Howto load the samples.
4956    
4957     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4958     file which refers to the Thuban Iceland demo data.
4959    
4960     * /Extensions/importAPR/test/README: New: Howto execute the tests.
4961    
4962     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4963    
4964     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4965     as in '.apr'-files.
4966    
4967     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4968     ODB Objects as in '.apr', '.avl' and other files.
4969    
4970     * /Extensions/importAPR/__init__.py: New: Init to make this
4971     directory a package.
4972    
4973     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4974     project file (.apr) and convert it to Thuban.
4975    
4976     2003-09-22 Jan-Oliver Wagner <[email protected]>
4977    
4978     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4979    
4980 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
4981    
4982     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4983     with description on RPM installation and RPM binary package
4984     creation.
4985    
4986 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
4987    
4988     * setup.py (data_files): Only add the mo files if the Locales
4989     directory actually exists, so that setup.py works with a fresh CVS
4990     checkout
4991    
4992 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
4993    
4994     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4995     in viewport, not anymore in view
4996    
4997 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
4998    
4999     Introducing first Extension (gns2shp).
5000    
5001     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
5002    
5003     * Extensions/__init__.py: New. init to make this dir a package.
5004    
5005     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
5006    
5007     * Extensions/gns2shp/test/README: New. some info on this test directory.
5008    
5009     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
5010    
5011     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
5012     of Shapefile from GNS text file format
5013    
5014 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
5015    
5016 jan 1707 Fix/workaround for bug #2019:
5017     https://intevation.de/rt/webrt?serial_num=2019
5018    
5019     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
5020     (IdentifyView.__init__): Added another button that allows to
5021     stop the identify mode.
5022     (IdentifyView.OnStop): New. Stops the identify mode.
5023    
5024     2003-09-03 Jan-Oliver Wagner <[email protected]>
5025    
5026 jan 1705 Introducing a new exception dialog that allows to exit the
5027     application immediately.
5028     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5029    
5030     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5031    
5032     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5033     Made strings available to translations. Exchanged the simple
5034     ScrolledMessageDialog by the new ExceptionDialog.
5035    
5036 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5037    
5038 bh 1701 * NEWS: New. Summary of changes and release notes.
5039    
5040     * MANIFEST.in: Add NEWS
5041    
5042     2003-09-01 Bernhard Herzog <[email protected]>
5043    
5044 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5045     include the documentation too.
5046    
5047     * setup.py (data_files): Add the .mo files
5048     (setup call): Up to version 0.9.0
5049    
5050     2003-09-01 Bernhard Herzog <[email protected]>
5051    
5052 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5053     parameter list to just parent and session
5054     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5055     selection of empty list boxes is not allowed (and produces C++
5056     assertion errors) and the rest of the setup is better done in
5057     __init__ anyway.
5058     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5059     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5060     builtins True/False for booleans to avoid warnings from wxPython
5061    
5062     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5063     ChooseDBTableDialog constructor parameters.
5064    
5065     2003-09-01 Bernhard Herzog <[email protected]>
5066    
5067 bh 1694 * Thuban/Model/postgisdb.py
5068     (PostGISTable): Extend doc-string
5069     (PostGISTable._fetch_table_information): Set the column index
5070     correctly, pretending ignored columns don't exist.
5071    
5072     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5073     for postgis tables with data types not yet supported by thuban.
5074    
5075 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5076    
5077     * HOWTO-Release: Tweak item about running the tests.
5078    
5079 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5080    
5081     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5082    
5083 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5084    
5085     Add some missing parameters to projections. Proj complains about
5086     them on windows but for some reason not on Linux.
5087    
5088     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5089     missing required projection parameters
5090    
5091     * test/test_proj.py (TestProjFile.test): Add missing required
5092     projection parameters
5093    
5094     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5095     (TestLayerProjection.test): Add missing required projection
5096     parameters and tests for them
5097    
5098     * test/test_load.py (TestLayerProjection.file_contents)
5099     (TestLayerProjection.test): Add missing required projection
5100     parameters and tests for them
5101    
5102     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5103     required projection parameters
5104    
5105     2003-08-29 Bernhard Herzog <[email protected]>
5106    
5107     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5108     access the pj_errno because directly accessing pj_errno doesn't
5109     work on windows if the proj library is in a DLL
5110    
5111     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5112    
5113 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5114    
5115 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5116     initthuban
5117    
5118     * test/test_load.py (LoadSessionTest.filenames): New class
5119     variable with the filename attributes to normalize
5120     (LoadSessionTest.check_format): Pass self.filenames to
5121     sax_eventlist to normalize the filename attributes
5122    
5123     * test/xmlsupport.py: Add cvs keywords
5124     (SaxEventLister.__init__): New parameter filenames which indicates
5125     attributes that contain filenames
5126     (SaxEventLister.startElementNS): Normalize the filename attributes
5127     with os.path.normpath
5128     (sax_eventlist): New parameter filenames to pass through to
5129     SaxEventLister
5130    
5131     * test/test_derivedshapestore.py: Make this file callable as a
5132     program to execute the tests
5133     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5134     the session to self.session so that it gets destroyed properly
5135    
5136     * test/test_layer.py (TestLayer.tearDown): Call the session's
5137     Destroy method
5138    
5139     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5140     too if it exists
5141     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5142     so that it gets destroyed properly
5143    
5144     * test/postgissupport.py (reason_for_not_running_tests): Add a
5145     test for the existence of popen2.Popen4.
5146    
5147     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5148     reliable way to destroy the sessions created in the test cases
5149     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5150     so that it gets destroyed properly
5151     (SaveSessionTest.testLayerProjection): Bind the session to
5152     self.session so that it gets destroyed properly
5153    
5154     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5155     sure that the session is destroyed properly
5156    
5157     * test/test_shapefilestore.py: Make this callable as a program to
5158     execute the tests
5159    
5160     * test/test_scalebar.py: Remove unnecessary import of _ from
5161     Thuban
5162    
5163     * test/support.py (print_garbage_information): Call initthuban
5164     here because it may be called indirectly from test cases that test
5165     test support modules which do not use anything from thuban itself
5166     (ThubanTestProgram.runTests): Remove unnecessary debug print
5167    
5168     2003-08-28 Bernhard Herzog <[email protected]>
5169    
5170 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5171    
5172     * Thuban/UI/mainwindow.py: Remove some unused imports
5173    
5174     * README: Add section about required additional software. Add date
5175     and revision CVS keywords
5176    
5177     * HOWTO-Release: Add item about the translations. Add date and
5178     revision CVs keywords and change formatting to match README a bit
5179     better
5180    
5181     * po/de.po: Update for 0.9
5182    
5183     * test/README: Tweak the wording a little because many tests are
5184     not really unittest.
5185    
5186 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5187    
5188 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5189     non-dev namespace
5190    
5191     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5192     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5193     namespace
5194    
5195     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5196     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5197    
5198     * test/test_save.py (SaveSessionTest.dtd)
5199     (SaveSessionTest.testEmptySession)
5200     (SaveSessionTest.testSingleLayer)
5201     (SaveSessionTest.testLayerProjection)
5202     (SaveSessionTest.testRasterLayer)
5203     (SaveSessionTest.testClassifiedLayer)
5204     (SaveSessionTest.test_dbf_table)
5205     (SaveSessionTest.test_joined_table)
5206     (SaveSessionTest.test_save_postgis): Update for new namespace
5207    
5208     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5209     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5210     (TestLayerProjection.file_contents)
5211     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5212     (TestPostGISLayer.file_contents)
5213     (TestPostGISLayerPassword.file_contents)
5214     (TestLoadError.file_contents, TestLoadError.test): Update for new
5215     namespace
5216    
5217     2003-08-27 Bernhard Herzog <[email protected]>
5218    
5219 bh 1663 Make the table interface distinguish between row ids (an integer
5220     that uniquely identifies a row) and row ordinals (a simple row
5221     count from 0 to NumRows() - 1)
5222    
5223     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5224     (PostGISTable.RowOrdinalToId): New methods to conver between row
5225     ids and row ordinals
5226     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5227     parameter row_is_ordinal to indicate whether the row parameter is
5228     the row id or the ordinal
5229    
5230     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5231     (TransientTableBase.RowOrdinalToId)
5232     (AutoTransientTable.RowIdToOrdinal)
5233     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5234     PostGISTable.
5235     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5236     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5237     Same new parameter as in PostGISTable.
5238    
5239     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5240     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5241     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5242     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5243     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5244     parameter as in PostGISTable.
5245    
5246     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5247     (DataTable.RowOrdinalToId): New methods to convert between row ids
5248     and row ordinals.
5249     (TableGrid.SelectRowById): New method to select a row based on its
5250     ID as opposed to its ordinal
5251     (DataTable.GetValue, TableGrid.OnRangeSelect)
5252     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5253     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5254     (LayerTableFrame.__init__): Convert between row ids and row
5255     ordinals as appropriate
5256    
5257     * test/postgissupport.py (PostGISDatabase.__init__): Add
5258     doc-string.
5259     (PostGISDatabase.initdb): The optional third item in a tuple in
5260     tables is now a (key, value) list with additional arguments to
5261     pass to upload_shapefile
5262     (upload_shapefile): New parameter gid_offset to allow gids that
5263     are not the same as the shapeids in the shapefile
5264     (PostgreSQLServer.get_default_static_data_db): Use the new
5265     gid_offset to make the gids in landmarks 1000 higher than the
5266     shapeids in the shapefile
5267    
5268     * test/test_viewport.py
5269     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5270     new shapeids in the landmarks table
5271    
5272     * test/test_transientdb.py
5273     (TestTransientTable.run_iceland_political_tests)
5274     (TestTransientTable.test_transient_joined_table): Add tests for
5275     the new table methods and new keywords arguments.
5276    
5277     * test/test_postgis_db.py
5278     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5279     (TestPostGISTable.test_read_value_row_count_mode)
5280     (TestPostGISTable.test_row_id_to_ordinal)
5281     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5282     table methods and the new arguments
5283     (TestPostGISShapestorePoint.test_shapes_in_region)
5284     (TestPostGISShapestorePoint.test_shape_raw_data)
5285     (TestPostGISShapestorePoint.test_shape_points)
5286     (TestPostGISShapestorePoint.test_shape_shapeid)
5287     (TestPostGISShapestorePoint.test_all_shapes)
5288     (TestPostGISTable.test_simple_query)
5289     (TestPostGISTable.test_simple_query)
5290     (TestPostGISTable.test_simple_query)
5291     (TestPostGISTable.test_read_value)
5292     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5293     shapeids in the landmarks table
5294    
5295     * test/test_memory_table.py
5296     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5297     (TestMemoryTable.test_read_value_row_count_mode)
5298     (TestMemoryTable.test_row_id_to_ordinal)
5299     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5300     table methods and the new arguments
5301    
5302     * test/test_dbf_table.py
5303     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5304     (TestDBFTable.test_read_value_row_count_mode)
5305     (TestDBFTable.test_row_id_to_ordinal)
5306     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5307     methods and the new arguments
5308    
5309 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5310    
5311 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5312     more postgis specific but much faster method to get the bounding
5313     box
5314    
5315     2003-08-26 Bernhard Herzog <[email protected]>
5316    
5317 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5318     (PostGISShapeStore.AllShapes): Add these missing methods.
5319     (PostGISShapeStore.ShapesInRegion): No need to raise
5320     StopIteration. We can simply return
5321    
5322     * test/test_postgis_db.py (TestPostGISTable.test_title)
5323     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5324     new methods
5325    
5326 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5327    
5328 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5329    
5330     * test/test_postgis_db.py (PolygonTests): New class containing
5331     those tests from TestPostGISShapestorePolygon that can also be
5332     used to test MUTLIPOLYGON tables
5333     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5334     so derive from that
5335     (TestPostGISShapestoreMultiPolygon): New class with tests for
5336     MUTLIPOLYGON tables
5337    
5338     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5339     tables argument to have tuples with three items to override the
5340     WKT type used.
5341     (PostgreSQLServer.get_default_static_data_db): Use the above to
5342     create a polygon table with MUTLIPOLYGONs
5343     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5344     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5345     coords_to*
5346     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5347     (wkt_converter): New. Map WKT types to converters
5348     (upload_shapefile): New parameter force_wkt_type to use a
5349     different WKT type than the default
5350    
5351     2003-08-25 Bernhard Herzog <[email protected]>
5352    
5353 bh 1655 * Thuban/UI/application.py
5354     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5355     db_connection_callback. Main difference is that the dialog run
5356     from this method doesn't have a parent so it can be used even when
5357     there is no main window
5358     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5359     no db_connection_callback was given. This way the dialog pops up
5360     even when the .thuban file was given as a command line parameter.
5361    
5362     2003-08-25 Bernhard Herzog <[email protected]>
5363    
5364 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5365     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5366     which leads to an effectively frozen X session because the user
5367     can only interact with the dialog but the mouse is still grabbed
5368     by the canvas.
5369     Also, call the tool's Hide method before MouseLeftUp because
5370     MouseLeftUp may change the tool's coordinates.
5371    
5372     2003-08-25 Bernhard Herzog <[email protected]>
5373    
5374 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5375     LoadCancelled exceptions and handle them by returning immediately.
5376    
5377     2003-08-25 Bernhard Herzog <[email protected]>
5378    
5379 bh 1649 GUI part of loading sessions with postgis connections which may
5380     require user interaction to get passwords or updated parameters
5381    
5382     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5383     bit nucer and be more generic.
5384     (DBFrame.OnAdd): Adapt to new DBDialog interface
5385    
5386     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5387     optional parameter db_connection_callback which is passed to
5388     load_session.
5389    
5390     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5391     Suitable as a db_connection_callback
5392     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5393     db_connection_callback of the application's OpenSession method
5394    
5395    
5396     2003-08-25 Bernhard Herzog <[email protected]>
5397    
5398 bh 1647 Basic loading of sessions containing postgis connections:
5399    
5400     * Thuban/Model/load.py (LoadError): Add doc-string
5401     (LoadCancelled): New exception class to indicate a cancelled load
5402     (SessionLoader.__init__): Add the db_connection_callback parameter
5403     which will be used by the loader to get updated parameters and a
5404     password for a database connection
5405     (SessionLoader.__init__): Add the new XML elements to the
5406     dispatchers dictionary
5407     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5408     to a byte-string object and idref as a generic id reference
5409     (SessionLoader.start_dbconnection)
5410     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5411     elements
5412     (load_session): Add the db_connection_callback to pass through the
5413     SessionLoader
5414    
5415     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5416     New classes to test loading of sessions with postgis database
5417     connections.
5418    
5419     2003-08-25 Bernhard Herzog <[email protected]>
5420    
5421 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5422     replace it and the comment with __BuildDate__ by the Source: and
5423     Id: cvs keywords as used in the other files.
5424    
5425     2003-08-25 Bernhard Herzog <[email protected]>
5426    
5427 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5428     LoadError when a required attribute is missing. The code used to
5429     be commented out for some reason, but probably should have been
5430     active.
5431    
5432     * test/test_load.py (TestLoadError.test): Test the message in the
5433     LoadError too to make sure it really is about the missing
5434     attribute
5435    
5436 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5437 bh 1641
5438     * test/test_save.py (SaveSessionTest.test_dbf_table)
5439     (SaveSessionTest.test_joined_table): Add XML validation tests.
5440    
5441     2003-08-22 Bernhard Herzog <[email protected]>
5442    
5443 bh 1639 Implement saving a session with a postgis connection
5444 bh 1632
5445 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5446     elements for database connections and shapestores using db
5447     connections
5448     (session): Add the dbconnections to the content model
5449    
5450     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5451     Write the db connections
5452     (SessionSaver.write_session): Call write_db_connections to write
5453     the connection before the data sources
5454     (SessionSaver.write_data_containers): Handle postgis shapestores
5455    
5456     * test/test_save.py (SaveSessionTest.thubanids)
5457     (SaveSessionTest.thubanidrefs): Update for new DTD
5458     (SaveSessionTest.test_save_postgis): New. Test saving a session
5459     with postgis connections
5460    
5461     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5462     (PostGISTable.TableName): New accessor methods for the connection
5463     and table name
5464    
5465     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5466     (TestPostGISTable.test_dbname): New methods to test the new
5467     PostGISConnection methods
5468    
5469     2003-08-22 Bernhard Herzog <[email protected]>
5470    
5471 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5472     for exceptions occurring when establishing a Database connection
5473     (PostGISConnection.connect): Catch psycopg.OperationalError during
5474     connects and raise ConnectionError.
5475    
5476     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5477     tests for database exceptions
5478    
5479     2003-08-22 Bernhard Herzog <[email protected]>
5480    
5481 bh 1635 Prepare the test suite for tests with required authentication
5482    
5483     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5484     variables with two predefined users/passwords, one for the admin
5485     and one for a non-privileged user.
5486     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5487     the non-privileged user to the database and set the admin password
5488     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5489     Better error reporting
5490     (PostgreSQLServer.connection_params)
5491     (PostgreSQLServer.connection_string): New methods to return
5492     information about how to connect to the server
5493     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5494     SQL statements
5495     (PostgreSQLServer.require_authentication): Toggle whether the
5496     server requires authentication
5497     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5498     Add or alter users
5499     (PostGISDatabase.initdb): Pass the admin name one the
5500     subprocesses' command lines. Grant select rights on
5501     geometry_columns to everybody.
5502     (upload_shapefile): Use the admin name and password when
5503     connecting. Grant select rights on the new table to everybody.
5504    
5505     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5506     server's new methods to get the connection parameters.
5507    
5508     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5509     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5510     server's new methods to get the connection parameters.
5511    
5512     * test/test_postgis_db.py
5513     (TestPostGISConnection.test_gis_tables_empty)
5514     (TestPostGISConnection.test_gis_tables_non_empty)
5515     (PostGISStaticTests.setUp): Use the server's new methods to get
5516     the connection parameters.
5517    
5518     2003-08-22 Bernhard Herzog <[email protected]>
5519    
5520 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5521    
5522     * Thuban/version.py: Add psycopg version
5523    
5524     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5525     version of the psycopg module
5526    
5527     2003-08-22 Bernhard Herzog <[email protected]>
5528    
5529     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5530     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5531     at the moment. The functionality should probably be implemented
5532     some time, though.
5533 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5534     removed because it's still in use.
5535 bh 1632
5536 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5537    
5538     * Thuban/UI/about.py (About.__init__): split up the huge about
5539     text into elements/lists for easier translation. This fixes bug
5540     https://intevation.de/rt/webrt?serial_num=2058
5541     Also, made some forgotten string available for the i18n.
5542    
5543 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5544    
5545     Make postgis support really optional including insensitive menu
5546     items.
5547    
5548     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5549     whether the postgis is supported.
5550    
5551     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5552     to make postgis support optional
5553    
5554     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5555     version of Thuban.Model.postgisdb.has_postgis_support
5556     (database_management command): Make it only sensitive if postgis
5557     is supported.
5558    
5559 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5560    
5561 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5562     (section Adding and Removing Layers): Added text and described
5563     multi-selection.
5564     (chapter Extensions): New.
5565    
5566     2003-08-21 Jan-Oliver Wagner <[email protected]>
5567    
5568 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5569     settings to allow multiple files to load into the map.
5570     Also reduced selection to *.shp as a default.
5571    
5572 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5573    
5574     Add dialogs and commands to open database connections and add
5575     database layers.
5576    
5577     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5578     method to open the database connection management dialog
5579     (MainWindow.AddDBLayer): New method to add a layer from a database
5580     (_has_dbconnections): New helper function to use for sensitivity
5581     (database_management command, layer_add_db command): New commands
5582     that call the above new methods.
5583     (main_menu): Add the new commands to the menu.
5584    
5585     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5586     (PostGISConnection.connect): Establish the actual connection in a
5587     separate method and call it in __init__. This makes it easier to
5588     override the behavior in test cases
5589     (PostGISConnection.BriefDescription): New method to return a brief
5590     description for use in dialogs.
5591    
5592     * test/test_postgis_db.py (NonConnection): DB connection that
5593     doesn't actually connect
5594     (TestBriefDescription): New class with tests for the new
5595     BriefDescription method
5596    
5597 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5598    
5599     Moved anything from extensions to libraries.
5600    
5601     * libraries: New.
5602    
5603     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5604    
5605     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5606     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5607     been moved here from thuban/extensions/pyprojection/
5608     See there in the Attic for the older history.
5609    
5610     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5611     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5612     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5613     have been moved here from thuban/extensions/pyshapelib/
5614     See there in the Attic for the older history.
5615    
5616     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5617     files have been moved here from thuban/extensions/shapelib/
5618     See there in the Attic for the older history.
5619    
5620     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5621     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5622     thuban/extensions/thuban/
5623     See there in the Attic for the older history.
5624    
5625     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5626    
5627     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5628     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5629    
5630     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5631     Moved to libraries/shapelib.
5632    
5633     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5634     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5635     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5636     Moved to libraries/pyshapelib.
5637    
5638     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5639     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5640     Moved to libraries/pyprojection.
5641    
5642     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5643    
5644     * extensions: Removed.
5645    
5646 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5647    
5648 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5649     facilities of FileTestMixin so don't derive from it.
5650     (TestViewportWithPostGIS): New class with tests for using a
5651     viewport on a map with postgis layers.
5652    
5653     2003-08-19 Bernhard Herzog <[email protected]>
5654    
5655     Add the db connection management to the session.
5656    
5657     * Thuban/Model/session.py (Session.__init__): New instance
5658     variable db_connections
5659     (Session.AddDBConnection, Session.DBConnections)
5660     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5661     (Session.RemoveDBConnection): New methods to manage and query the
5662     db connections managed by the session
5663     (Session.OpenDBShapeStore): New method to open a shapestore from a
5664     db connection
5665    
5666     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5667     messages for the db connection handling in the session
5668    
5669     * test/test_postgis_session.py: New. test cases for the session's
5670     db connection handling with postgis connections
5671    
5672     2003-08-19 Bernhard Herzog <[email protected]>
5673    
5674 bh 1606 Add very basic postgis database support and the corresponding test
5675     cases. The test cases require a PostgreSQL + postgis installation
5676     but no existing database. The database will be created
5677     automatically by the test cases
5678    
5679     * test/README: Add note about skipped tests and the requirements
5680     of the postgis tests.
5681    
5682     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5683    
5684     * test/test_postgis_db.py: New. Test cases for the postgis
5685     support.
5686    
5687     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5688     format
5689    
5690     * test/test_wellknowntext.py: New. Test cases for the
5691     wellknowntext parser
5692    
5693     * test/postgissupport.py: New. Support module for tests involving
5694     a postgis database.
5695    
5696     * test/support.py (execute_as_testsuite): Shut down the postmaster
5697     if it's still running after the tests
5698    
5699     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5700     well known text format
5701    
5702 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5703    
5704     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5705     message dialog.
5706    
5707 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5708    
5709 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5710     reason for the skips in the output to make it a bit more readable.
5711     (execute_as_testsuite): New helper function to run a test suite
5712     and print some more information.
5713     (run_tests): Use execute_as_testsuite to run the tests
5714    
5715     * test/runtests.py (main): Use execute_as_testsuite to run the
5716     tests
5717    
5718     2003-08-18 Bernhard Herzog <[email protected]>
5719    
5720 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5721     changes introduced in Python 2.3:
5722    
5723     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5724     filename is an absolute name
5725    
5726     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5727     filename is an absolute name
5728    
5729     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5730     unique filename to save to and use the correct relative filename
5731     in the expected output.
5732     (SaveSessionTest.test_dbf_table): Use the correct relative
5733     filename in the expected output.
5734    
5735     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5736     test to check whether the filename is absolute.
5737    
5738 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5739    
5740     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5741    
5742 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5743    
5744 bh 1594 Change the way shapes are returned by a shape store. The
5745     ShapesInRegion method returns an iterator over actual shape
5746     objects instead of a list of shape ids.
5747    
5748     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5749     id.
5750     (ShapefileStore.ShapesInRegion): Return an iterator over the
5751     shapes which yields shape objects instead of returning a list of
5752     shape ids
5753     (ShapefileStore.AllShapes): New. Return an iterator over all
5754     shapes in the shape store
5755     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5756    
5757     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5758     doc-string.
5759    
5760     * Thuban/UI/baserenderer.py
5761     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5762     layer_shapes and make it return an iterator containg shapes
5763     instead of a list of ids.
5764     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5765     layer_shapes() change
5766    
5767     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5768     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5769    
5770     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5771     changes in the ShapesInRegion return value.
5772     (ViewPort._get_hit_tester): Remove commented out code
5773    
5774     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5775     new return value.
5776     (SimpleShapeStore.AllShapes): New. Implement this method too.
5777    
5778     * test/test_layer.py (TestLayer.test_arc_layer)
5779     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5780     (TestLayer.test_point_layer_with_projection)
5781     (TestLayer.test_derived_store): Adapt to changes in the
5782     ShapesInRegion return value.
5783    
5784     * test/test_shapefilestore.py
5785     (TestShapefileStoreArc.test_shapes_in_region)
5786     (TestShapefileStorePolygon.test_shapes_in_region)
5787     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5788     in the ShapesInRegion return value.
5789     (TestShapefileStorePoint.test_all_shapes)
5790     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5791     methods
5792    
5793     * test/test_derivedshapestore.py
5794     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5795     the ShapesInRegion return value.
5796     (TestDerivedShapeStore.test_all_shapes)
5797     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5798     methods
5799    
5800     2003-08-15 Bernhard Herzog <[email protected]>
5801    
5802 bh 1592 Make the renderers deal correctly with raw vs. python level
5803     representation of shape geometries
5804    
5805     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5806     Return a flag useraw in addition to the callable and the parameter
5807     to indicate whether the callable can deal with the raw shape data
5808     or uses the higher level python lists of coordinates. The callable
5809     now should accept either the raw data or the return value of the
5810     shape's Points() method.
5811     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5812     change
5813     (BaseRenderer.projected_points): Instead of the shape id use the
5814     points list as parameter.
5815     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5816     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5817     change and accept the points list as parameter instead of the
5818     shape id.
5819    
5820     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5821     the useraw flag as required by the BaseRenderer
5822     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5823     changes.
5824    
5825     * test/test_baserenderer.py
5826     (TestBaseRenderer.test_point_with_classification): New test for
5827     rendering a map with classifications.
5828    
5829     2003-08-15 Bernhard Herzog <[email protected]>
5830    
5831 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5832     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5833     (ViewPort._get_hit_tester, ViewPort.projected_points)
5834     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5835     (ViewPort._find_label_at): Split the find_shape_at method into
5836     several new methods and use the functions in the hit-test module.
5837    
5838     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5839     functions
5840    
5841     * test/test_hittest.py: New. Test for the new hittest module
5842    
5843     2003-08-15 Bernhard Herzog <[email protected]>
5844    
5845 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5846     projection to all corners of the bounding box to get a better
5847     approximation of the projected bounding box
5848    
5849     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5850     New. Test coordinate handling of a layer with a projection.
5851     Catches the bug fixed in Layer.ShapesInRegion
5852    
5853     2003-08-15 Bernhard Herzog <[email protected]>
5854    
5855 bh 1586 Move some of the mock objects in test_baserenderer into their own
5856     module so they can easily be used from other tests
5857    
5858     * test/mockgeo.py: New test helper module with some mock objects
5859     for geometry related things like shapes, shapestores and
5860     projections.
5861    
5862     * test/test_mockgeo.py: New. Tests for the new helper module
5863    
5864     * test/test_baserenderer.py: Some of the mock-objects are in
5865     mockgeo now.
5866    
5867 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
5868    
5869     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5870    
5871 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
5872    
5873 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
5874    
5875     2003-08-12 Bernhard Herzog <[email protected]>
5876    
5877 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5878     strings have to be one string literal.
5879    
5880 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
5881    
5882 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5883     New. This method was used in various derived classes, but it's
5884     better to have it here.
5885    
5886     * test/test_shapefilestore.py
5887     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5888     FloatComparisonMixin
5889    
5890     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5891     It's now in FloatComparisonMixin
5892    
5893     * test/test_derivedshapestore.py
5894     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5895     in FloatComparisonMixin
5896    
5897     2003-08-11 Bernhard Herzog <[email protected]>
5898    
5899 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5900     error message
5901    
5902 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
5903    
5904 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5905     with version number.
5906     Changed title to reflect version number of Thuban.
5907    
5908     2003-08-08 Jan-Oliver Wagner <[email protected]>
5909    
5910 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5911     the list corresponds to the "About" web page.
5912    
5913 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
5914    
5915     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5916     Make sure translated strings are recognized as one string literal.
5917    
5918     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5919     Make sure translated strings are recognized as one string literal.
5920    
5921     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5922     translated strings are recognized as one string literal.
5923    
5924     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5925     sure translated strings are recognized as one string literal.
5926    
5927 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
5928    
5929 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5930     Simply delegates to the original shapestore.
5931    
5932     * test/test_derivedshapestore.py
5933     (TestDerivedShapeStore.test_raw_format): New. Test case for
5934     DerivedShapeStore.RawShapeFormat
5935    
5936     2003-08-07 Bernhard Herzog <[email protected]>
5937    
5938 bh 1561 Add raw data interface to shape objects.
5939    
5940     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5941     class to ShapefileShape which now holds shapefile specific
5942     information.
5943     (ShapefileShape.compute_bbox): Simplified to not cache any
5944     information. The way this method is used that shouldn't matter
5945     performance wise.
5946     (ShapefileShape.RawData): New. Return the shapeid which is the raw
5947     data format for shapes from shapefiles.
5948     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5949     in the shape objects returned by a shapestore. For a
5950     ShapefileStore this is always RAW_SHAPEFILE.
5951     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5952     method.
5953    
5954     * test/test_shapefilestore.py
5955     (TestShapefileStore.test_raw_format): New test to test the raw
5956     format feature of shapes.
5957    
5958 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
5959     data. It was only there for interface compatibility but it's not
5960 bh 1561 used inside of Thuban and the generic Shape class has gone away.
5961 bh 1560
5962 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5963     the raw data format and only use an optimized version of its a
5964     shapefile.
5965    
5966 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
5967    
5968 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
5969     tests.
5970     (SimpleShapeStore.Shape): Use SimpleShape instead of
5971     Thuban.Model.data.Shape to make the tests independed of the coming
5972     changes.
5973    
5974     2003-08-07 Bernhard Herzog <[email protected]>
5975    
5976 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5977     (ThubanTestProgram): New classes that extend the respective
5978     classes from unittest. These new version support skipping tests
5979     under certain expected conditions. In the Thuban test suite we
5980     uses this for tests that require the optional gdal support.
5981     (run_tests): Use ThubanTestProgram instead of the unittest.main()
5982    
5983     * test/runtests.py (main): Use the new ThubanTestRunner instead of
5984     the normal one from unittest
5985    
5986     * test/test_layer.py (TestLayer.test_raster_layer): If this test
5987     is not run because gdal support isn't available report this to the
5988     runner.
5989    
5990     * test/test_baserenderer.py
5991     (TestBaseRenderer.test_raster_no_projection): Do not run this test
5992     if gdal support isn't available and report this to the runner.
5993    
5994 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
5995    
5996     Rearrange the renderers a bit, partly in preparation for changes
5997     required for the postgis merge, partly to make it more testable.
5998     Also make the representation of coordinates in Shapes more
5999     consistent.
6000    
6001     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
6002     this class is now in BaseRenderer. This class is now practically
6003     only a specialization of BaseRenderer for rendering to an actual
6004     wx DC.
6005     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
6006     to get the shapetype specific rendering functions.
6007    
6008     * Thuban/UI/baserenderer.py: New file with the basic rendering
6009     logic. The code in this file is completely independend of wx.
6010     (BaseRenderer): Class with the basic rendering logic
6011    
6012     * test/test_baserenderer.py: New. Test cases for BaseRenderer
6013    
6014     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6015     error_on_redraw to guard agains endless loops and stack overflows
6016     when there's a bug in the rendering code that raises exceptions.
6017     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
6018     rendering into a separate method _do_redraw so that error handling
6019     is a bit easier. When an exception occurs, set error_on_redraw to
6020     true. When it's true on entry to OnIdle do nothing and return
6021     immediately.
6022    
6023     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
6024     Shape object will always have the coordinates as a list of list of
6025     coordinate pairs (tuples).
6026     (Shape.compute_bbox): Adapt to new representation.
6027    
6028     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6029     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6030     Shape objects.
6031    
6032     * test/test_shapefilestore.py
6033     (ShapefileStoreTests.assertFloatTuplesEqual)
6034     (ShapefileStoreTests.assertPointListEquals): Rename to
6035     assertPointListEquals and change purpose to checking equality of
6036     the lists returned by Shape.Points().
6037     (TestShapefileStoreArc.test_shape)
6038     (TestShapefileStorePolygon.test_shape)
6039     (TestShapefileStorePoint.test_shape): Use the new
6040     assertPointListEquals instead of assertFloatTuplesEqual
6041    
6042     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6043     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6044     and change purpose to checking equality of the lists returned by
6045     Shape.Points().
6046     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6047     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6048     (TestLayer.test_derived_store): Use the new assertPointListEquals
6049     instead of assertFloatTuplesEqual
6050    
6051     * test/test_derivedshapestore.py
6052     (TestDerivedShapeStore.assertFloatTuplesEqual)
6053     (TestDerivedShapeStore.assertPointListEquals): Rename to
6054     assertPointListEquals and change purpose to checking equality of
6055     the lists returned by Shape.Points().
6056     (TestDerivedShapeStore.test_shape): Use the new
6057     assertPointListEquals instead of assertFloatTuplesEqual
6058    
6059 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6060    
6061     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6062     a bounding box. A dialog is raised in case, no bounding box
6063     is found. This fixes bug #2043:
6064     https://intevation.de/rt/webrt?serial_num=2043
6065    
6066 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6067    
6068     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6069     object look like a Color instantiation. Formerly it looked like a
6070     tuple.
6071    
6072     * test/test_color.py (TestColor.test_repr)
6073     (TestColor.test_equality, TestColor.test_inequality): New. test
6074     some more apects of the Color class
6075     (TestTransparent.test_repr, TestTransparent.test_hex)
6076     (TestTransparent.test_equality): New. Test cases for the
6077     Transparent object.
6078    
6079 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6080    
6081     * Doc/manual/thuban-manual.xml: a number of small improvements.
6082     The resulting file is the version submitted for GREAT-ER II.
6083    
6084 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6085    
6086 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6087     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6088     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6089    
6090     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6091     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6092     (ThubanEndBusyCursor): Add doc-strings
6093    
6094     2003-08-01 Bernhard Herzog <[email protected]>
6095    
6096 bh 1540 First step towards PostGIS integration. More abstraction by movin
6097     more code from the layer to the shapestore. More methods of the
6098     layer are now simply delegated to the equivalent method of the
6099     shapestore. The SHAPETYPE_* constants are now in data not in
6100     layer.
6101    
6102     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6103     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6104     layer.py to data.py
6105     (ShapefileStore.__init__): More Initialization for the new methods
6106     and functionality.
6107     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6108     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6109     (ShapefileStore.Shape): New methods that were formerly implemented
6110     in the layer.
6111     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6112     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6113     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6114     equivalents of the new shape methods. These versions are simply
6115     delegated to the original shapstore.
6116    
6117     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6118     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6119     (Layer.SetShapeStore): Removed the initializatin of instance
6120     variables that were needed for the stuff that's now in
6121     ShapefileStore
6122     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6123     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6124     shapestore.
6125    
6126     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6127     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6128     instead of layer.
6129    
6130     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6131    
6132     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6133    
6134     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6135     instead of layer.
6136     (TestLayer.test_derived_store): Remove the test for the exception
6137     when instantiating the DerivedShapeStore with an incompatible
6138     table which is now in test_derivedshapestore.py. Add some more
6139     tests of the layer methods to determine whether they work for a
6140     DerivedShapeStore as well.
6141    
6142 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6143    
6144     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6145     by just listing the name and where they can be found.
6146    
6147 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6148    
6149     * Doc/manual/thuban-manual.xml:
6150     Changed the screenshot elements to figure.
6151     Changed some variablelist elements to itemizedlist.
6152     Added section on GDAL formats.
6153    
6154 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6155    
6156     * Doc/manual/thuban-manual.xml: Added a few sentences about
6157     the Fix Border Color option when generating classes.
6158    
6159 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6160    
6161     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6162     Ramp instances to use lower_case_style.
6163    
6164     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6165    
6166     * Thuban/UI/classifier.py: Add docstrings.
6167    
6168     * Thuban/UI/dock.py: Add docstrings.
6169    
6170     * test/test_classgen.py: Use renamed Ramp instances.
6171    
6172 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6173    
6174 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6175     was never used in Thuban.
6176    
6177     2003-07-30 Bernhard Herzog <[email protected]>
6178    
6179 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6180     method directly instead of going through the transient_table
6181     method. This faster because transient_table may force the copy of
6182     a DBF file into the transient database and setting a table's title
6183     doesnm't affect the title of the associated transient table, so
6184     this fixes RT #2042
6185    
6186     * Thuban/UI/main.py (__version__): Don't import the already
6187     removed show_exception_dialog.
6188    
6189 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6190    
6191 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6192     Put back this method and remove the equivalent function since we
6193     are setting the exception hook from within this class (OnInit).
6194    
6195     2003-07-29 Jonathan Coles <[email protected]>
6196    
6197 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6198     Doc/manual/images/5_2_quantiles.png,
6199     Doc/manual/images/5_2_uniform_dist.png,
6200     Doc/manual/images/5_2_unique_values.png,
6201     Doc/manual/images/8_int_error.png: New screen shots.
6202    
6203     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6204     some points, and added more screen shots.
6205    
6206 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6207    
6208 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6209    
6210     2003-07-29 Bernhard Herzog <[email protected]>
6211    
6212 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6213     deprecated since before the 0.8 release and isn't used in Thuban
6214     itself anymore.
6215    
6216 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6217    
6218 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6219 jonathan 1506
6220     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6221     python exception hook here so that we are sure to catch any
6222     Thuban exception that happen during initialization.
6223    
6224     * Thuban/UI/main.py (main): Don't set the exception hook here,
6225     it will get set in ThubanApplication.OnInit.
6226    
6227     2003-07-29 Jonathan Coles <[email protected]>
6228 jonathan 1503
6229     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6230     Removed and called it show_exception_dialog() so that the exception
6231     handler can be set before the class is created.
6232    
6233     * Thuban/UI/main.py (main): Install the exception handler before
6234     a ThubanApplication is created.
6235    
6236 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6237    
6238     * po/it.po: New. Italian translation by Maurizio Napolitano
6239    
6240     * po/ru.po: New. Russian translation by Alex Shevlakov
6241    
6242 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6243    
6244 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6245     projections.
6246    
6247     2003-07-29 Frank Koormann <[email protected]>
6248    
6249 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6250    
6251 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6252    
6253 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6254     on white background.
6255    
6256     2003-07-29 Jonathan Coles <[email protected]>
6257    
6258 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6259     descriptions for the legend toolbar.
6260    
6261     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6262     cursor from dialog box.
6263    
6264     2003-07-28 Jonathan Coles <[email protected]>
6265    
6266     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6267    
6268     * Doc/manual/images/2_4_session_tree.png,
6269     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6270     Doc/manual/images/4_2_layer_properties.png,
6271     Doc/manual/images/4_2_raster_layer_properties.png,
6272     Doc/manual/images/5_3_genclass.png,
6273     Doc/manual/images/5_classification.png,
6274     Doc/manual/images/6_projection.png,
6275     Doc/manual/images/7_1_table_view.png,
6276     Doc/manual/images/7_2_5_join.png: New screenshots.
6277    
6278     2003-07-24 Jonathan Coles <[email protected]>
6279    
6280     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6281    
6282     2003-07-24 Jonathan Coles <[email protected]>
6283    
6284     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6285     chapter on Layer Management.
6286    
6287     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6288     manual and images.
6289    
6290 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6291    
6292     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6293     it annoys lintian which warns about these files not being
6294 jan 1767 executable. The #! isn't necessary here since if you absolutely
6295 bh 1483 must execute them you can always say "python <filename>".
6296    
6297     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6298     superfluous code to set brush and pen for point shapes
6299    
6300     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6301     belong in viewport anyway
6302    
6303 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6304    
6305     * Doc/manual/thuban-manual.xml: Added section on table management.
6306    
6307 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6308    
6309     * test/runtests.py (main): Recognize the long "verbose" option
6310     correctly.
6311    
6312 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6313    
6314     * Doc/manual/thuban-manual.xml: Continue to write first revision
6315     of the manual.
6316    
6317     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6318     with Begin/EndDrawing() calls to ensure we aren't doing to
6319     many updates to the dc during rendering.
6320     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6321     a pen and brush argument so they need to be passed to the function.
6322    
6323     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6324     Calculates the minimum and maximum scale values. Factored out
6325     of set_view_transform so that it could be used to zoom all the
6326     way into a single point.
6327     (ViewPort.set_view_transform): Call calc_min_max_scales().
6328     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6329     if only a single point is selected.
6330    
6331     * Doc/manual/images/1_2_legend_close.png,
6332     Doc/manual/images/1_2_legend_dock.png,
6333     Doc/manual/images/1_2_mainwindow.png,
6334     Doc/manual/images/1_2_mainwindow.ps,
6335     Doc/manual/images/1_2_mainwindow.sk,
6336     Doc/manual/images/3_2_fullextent.png,
6337     Doc/manual/images/3_2_fulllayerextent.png,
6338     Doc/manual/images/3_2_fullshapeextent.png,
6339     Doc/manual/images/3_2_pan.png,
6340     Doc/manual/images/3_2_zoomin.png,
6341     Doc/manual/images/3_2_zoomout.png,
6342     Doc/manual/images/3_3_identify.png,
6343     Doc/manual/images/3_3_label.png,
6344     Doc/manual/images/3_5_invisible.png,
6345     Doc/manual/images/3_5_movedown.png,
6346     Doc/manual/images/3_5_moveup.png,
6347     Doc/manual/images/3_5_props.png,
6348     Doc/manual/images/3_5_tobottom.png,
6349     Doc/manual/images/3_5_totop.png,
6350     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6351    
6352 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6353    
6354 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6355    
6356     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6357     after the new map has been assigned
6358    
6359     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6360     Delegate MAP_REPLACED to the canvas too
6361     (MainWindow.prepare_new_session): Removed. Thanks to the new
6362     MAP_REPLACED message it's no longer needed
6363     (MainWindow.OpenSession, MainWindow.NewSession):
6364     prepare_new_session has been removed.
6365    
6366     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6367     MAP_REPLACED so that we can close the dialog if a new map is set.
6368     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6369     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6370     dialog
6371    
6372     * test/test_viewport.py (SimpleViewPortTest)
6373     (SimpleViewPortTest.test_default_size): Add doc-strings
6374     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6375     tests. Subscribe to MAP_REPLACED messages too.
6376     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6377     (ViewPortTest.test_set_map): New test for the SetMap method.
6378    
6379     2003-07-18 Bernhard Herzog <[email protected]>
6380    
6381 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6382     Move this test from ViewPortTest.setUp to this new separate test
6383     case. setUp is not the place for the actual tests.
6384     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6385     more of the test from setUp to the new test test_inital_settings.
6386     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6387     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6388     test_win_to_proj and test_proj_to_win and make the tests easier to
6389     understand
6390     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6391     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6392     (ViewPortTest.test_unprojected_rect_around_point)
6393     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6394     Reformat to increase readability.
6395    
6396     2003-07-18 Bernhard Herzog <[email protected]>
6397    
6398 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6399    
6400     2003-07-18 Bernhard Herzog <[email protected]>
6401    
6402 bh 1459 * test/runtests.py: The test suite can now be run without an X
6403     connection. To make sure this remains true, remove the DISPLAY
6404     environment variable so that an error occurs if the wxGTK is
6405     imported accidentally
6406    
6407     2003-07-18 Bernhard Herzog <[email protected]>
6408    
6409 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6410    
6411     * Thuban/UI/view.py: Remove unused imports
6412    
6413     2003-07-18 Bernhard Herzog <[email protected]>
6414    
6415 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6416     function is now in viewport.py and is called output_transform
6417     (TestScalebar.test_output_transform)
6418     (TestScalebar.test_OutputTransform): Renamed to
6419     test_output_transform and updated to use output_transform instead
6420     of OutputTransform
6421    
6422     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6423     renamed.
6424     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6425     renamed to output_transform
6426    
6427     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6428     Rename to output_transform
6429    
6430     2003-07-18 Bernhard Herzog <[email protected]>
6431    
6432 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6433     classificationField to classificatin_column and init it here so
6434     that it can be used in SetClassificationColumn
6435     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6436     Rename to GetClassificationColumn.
6437     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6438     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6439     message if the column changes.
6440     (Layer._classification_changed, Layer.ClassChanged): Rename to
6441     _classification_changed. Update the callers.
6442     (Layer.SetShapeStore): Further field->column renames.
6443    
6444     * Thuban/Model/load.py (SessionLoader.start_classification)
6445     (SessionLoader.start_clpoint): Updates because of
6446     field->column method name changes in the Layer class
6447    
6448     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6449     because of field->column method name changes in the Layer class
6450    
6451     * Thuban/UI/classifier.py (Classifier.__init__)
6452     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6453     field->column method name changes in the Layer class
6454    
6455     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6456     because of field->column method name changes in the Layer class
6457    
6458     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6459     of field->column method name changes in the Layer class
6460    
6461     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6462     (SaveSessionTest.testClassifiedLayer): Update because of
6463     field->column method name changes in the Layer class
6464    
6465     * test/test_layer.py (SetShapeStoreTests.setUp)
6466     (SetShapeStoreTests.test_sanity): Update because of field->column
6467     method name changes in the Layer class
6468     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6469     (TestLayerModification.test_sanity)
6470     (TestLayerModification.test_initial_settings): remove unsued code
6471     and rename to test_sanity.
6472     (TestLayerModification.test_set_classification): New test for
6473     SetClassification and SetClassificationField.
6474    
6475     2003-07-18 Bernhard Herzog <[email protected]>
6476    
6477 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6478     the non-fixed values as well. The old test would have accepted a
6479     fixed ramp that only returnes the fixed properties
6480    
6481 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6482    
6483     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6484     shots for the manual. The XCF file is the source image and
6485     has additional layers to support changes.
6486    
6487     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6488    
6489     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6490     Return both the new class and the field name.
6491    
6492     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6493     fit the map to the window as this changes any zoom level that
6494     the user may have set.
6495    
6496 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6497    
6498     * Thuban/Model/classgen.py (generate_singletons,
6499     generate_uniform_distribution, generate_quantiles): Remove
6500     fixes parameter, but maintain the same functionality by having
6501     the calling function pass a FixedRamp object for the ramp.
6502     (FixedRamp): New. Adapts a ramp to have fixed property values.
6503    
6504     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6505     (Classification): Inherit from Publisher.
6506     (Classification.__init__): Remove the layer parameter.
6507     Classifications no longer need to have a parent layer.
6508     (Classification.GetField, Classification.GetFieldType,
6509     Classification.SetFieldInfo): Removed. The field name is stored
6510     in the layer, and the type can be retreived by calling
6511     Layer.GetFieldType().
6512     (Classification._set_layer, Classification.GetLayer): Removed.
6513     Classifications no longer have a parent layer.
6514    
6515     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6516     classification.
6517     (Layer.SetShapeStore): Reset the classification first while
6518     we still have the old shape store to work with.
6519     (Layer.GetClassificationField, Layer.SetClassificationField):
6520     New. Method for getting/setting the field to classify on.
6521     (Layer.SetClassification): Simplified now that the layer
6522     simply has to hold a reference to the classification and not
6523     tell the classification who owns it.
6524     Fixes RTbug #2023.
6525    
6526     * Thuban/Model/load.py (SessionLoader.start_classification):
6527     Set the field name on the layer, not the classification.
6528    
6529     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6530     classification is modified.
6531    
6532     * Thuban/Model/save.py (SessionSaver.write_classification):
6533     Get the field name and type from the layer.
6534    
6535     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6536     parameter records to rows and add docstring. Fixes RTbug #1997.
6537    
6538     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6539     ramp when we need to fix certain values of a ramp rather than
6540     using the old fixes parameter. Fixes RTbug #2024.
6541    
6542     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6543     parameter.
6544     (ClassTable.Reset): Add fieldType parameter and use it, rather
6545     than asking the classification.
6546     (Classifier.__init__): Remember the original class's field
6547     and ask the layer for the field type, rather than the classification.
6548     (Classifier.__SetGridTable): Retrieve the field and field type
6549     for the table because they are not in the classification.
6550     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6551     field on the layer in addition to the classification itself.
6552    
6553     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6554     classification field from layer.
6555    
6556     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6557     classification field from layer. Split up tests and remove
6558     *-imports. Fixes RTbug #1992.
6559    
6560     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6561    
6562     * test/test_classification.py
6563     (TestClassification.test_classification): Remove tests for methods
6564     that no longer exist.
6565    
6566     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6567     __init__ no longer has a field parameter, use SetClassificationField.
6568     (SetShapeStoreTests.test_sanity): Use layer object to get class
6569     field info.
6570    
6571     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6572     SetClassificationField on layer to set class field info.
6573    
6574     * test/test_viewport.py: Renamed from test/test_view.py.
6575    
6576 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6577    
6578     * Doc/manual/thuban-manual.xml: Added authors and an initial
6579     coarse structure.
6580    
6581 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6582    
6583 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6584     and therefore should not be derived from any other class.
6585    
6586     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6587     mix-in, so derive from TestCase as well.
6588    
6589     2003-07-15 Bernhard Herzog <[email protected]>
6590    
6591 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6592     draw_func handling a bit to remove one layer of indirection. This
6593     makes the renderer about 10% faster in the non-classifying case
6594     and the code a bit cleaner
6595     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6596     and set them in the dc. Now the draw_point_shape method and
6597     wxproj's draw_polygon_shape function have basically the same
6598     signature so that both can be directly used as draw_func
6599    
6600     2003-07-15 Bernhard Herzog <[email protected]>
6601    
6602 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6603     string values (in addition to the labels) as UTF 8
6604    
6605     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6606     values if the field type is string
6607    
6608     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6609     saving a session with non-ascii string classification values.
6610    
6611     * test/test_load.py (TestClassification.file_contents)
6612     (TestClassification.test): Check for non-ascii values in string
6613     classifications
6614    
6615 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6616    
6617     * test/test_view.py: New. Tests for ViewPort.
6618    
6619 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6620    
6621     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6622     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6623    
6624 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6625     unicode strings from session file: session title, map title and
6626     projection name.
6627    
6628 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6629    
6630 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6631     drag_stop, not drag_move when the mouse is released.
6632    
6633     2003-07-10 Jonathan Coles <[email protected]>
6634    
6635 jonathan 1403 The most important part of this is the seperation of view.py into
6636     two pieces. viewport.py now has a class called ViewPort which
6637     contains all the non-wx parts of view.py and can therefore be
6638     tested. view.py contains only the wx-specific parts and is fairly
6639     simple.
6640    
6641     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6642     RTTbug #1992.
6643     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6644     RTTbug #1992.
6645    
6646     * Thuban/Model/classgen.py (generate_singletons,
6647     generate_uniform_distribution, generate_quantiles):
6648     Added 'fixes' parameter so that property attributes can
6649     be held constant over the generated classification groups.
6650     (CustomRamp.GetProperties): Remove unused variables.
6651    
6652     * Thuban/Model/map.py (Map.SetProjection): Send the old
6653     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6654     event.
6655    
6656     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6657     parameter which is a list of records that restricts which
6658     records are saved. Fixes RTbug #1997.
6659    
6660     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6661     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6662    
6663     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6664     to allow the user to fix line color/width on generated groups.
6665     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6666     functions to optionally fix group properties.
6667    
6668     * Thuban/UI/main.py (main): Set exception hook to the
6669     ShowExceptionDialog. Fixes RTbug #1993.
6670    
6671     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6672     the table window when it is selectd to be shown.
6673    
6674     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6675     Export Selection button and move the export buttons underneath
6676     the table.
6677     (QueryTableFrame.UpdateStatusText): Added event argument so
6678     that it can respond to grid selection events. The status text
6679     is now updated even when the table is not associated with a
6680     layer as was previously assumed.
6681     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6682     UpdateStatusText responds to these events.
6683     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6684     (QueryTableFrame.doExport): Helper function that saves the
6685     entire table, or selected rows, to a file.
6686     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6687     Respond to export button events and call doExport.
6688    
6689     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6690     the function doesn't return NULL without first setting a Python
6691     Error.
6692    
6693     * test/runtests.py (main): Only print "Unknown option" for
6694     unsupported options.
6695    
6696     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6697     optional epsilon argument to specify floating point accuracy.
6698     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6699     for each item test.
6700    
6701     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6702     tests for saving selected records.
6703    
6704     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6705     tests for saving selected records.
6706    
6707     * test/test_map.py (TestMapWithContents.test_set_projection):
6708     MAP_PROJECTION_CHANGED events send the old projection.
6709    
6710     * test/test_session.py
6711     (TestSessionWithContent.test_forward_map_projection):
6712     MAP_PROJECTION_CHANGED events send the old projection.
6713    
6714     * test/test_table.py (TableTest): Update tests to use non-deprecated
6715     functions.
6716    
6717 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6718    
6719 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6720     constants in the column objects are the standard ones defined in
6721     the table module.
6722    
6723     * test/test_transientdb.py
6724     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6725     exporting transient tables as DBF works. This should catch the bug
6726     just fixed in TransientTableBase.Width.
6727    
6728     2003-07-08 Bernhard Herzog <[email protected]>
6729    
6730 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6731     interpolated colors correctly.
6732    
6733     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6734     New. Test case for the fix in classgen.py
6735    
6736     2003-07-08 Bernhard Herzog <[email protected]>
6737    
6738 bh 1378 * test/runtests.py (main): Make the default output less verbose
6739     and add a verbosity option (-v) to get the old output
6740    
6741     2003-07-08 Bernhard Herzog <[email protected]>
6742    
6743 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6744     0.9.
6745    
6746     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6747     New. Return the join type
6748    
6749     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6750     DTD
6751     (SessionSaver.write_data_containers): Save the join type for
6752     joined tables
6753    
6754     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6755     namespace
6756     (SessionLoader.start_jointable): Handle the jointype attribute
6757    
6758     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6759     as of Thuban 0.8. These are now tests to determine whether Thuban
6760     can still read files generated by Thuban 0.8
6761    
6762     * test/test_load.py (LoadSessionTest.dtd)
6763     (TestSingleLayer.file_contents)
6764     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6765     (TestLayerProjection.file_contents)
6766     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6767     (TestJoinedTable.file_contents)
6768     (TestLoadError.file_contents): Update for new DTD
6769     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6770     for new join type attribute
6771    
6772     * test/test_save.py (SaveSessionTest.dtd)
6773     (SaveSessionTest.testEmptySession)
6774     (SaveSessionTest.testSingleLayer)
6775     (SaveSessionTest.testLayerProjection)
6776     (SaveSessionTest.testRasterLayer)
6777     (SaveSessionTest.testClassifiedLayer)
6778     (SaveSessionTest.test_dbf_table)
6779     (SaveSessionTest.test_joined_table): Update for new DTD
6780     (SaveSessionTest.test_joined_table): Add test for new join type
6781     attribute
6782    
6783 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6784    
6785     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6786     function for table_to_dbf
6787     (table_to_dbf): Deal with names longer than the 10 character limit
6788    
6789     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6790     doc-string
6791     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6792     long column names
6793    
6794 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6795    
6796 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6797    
6798     2003-07-03 Bernhard Herzog <[email protected]>
6799    
6800 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6801     for the Thuban manual and README with some basic information about
6802     the manual
6803    
6804     2003-07-03 Bernhard Herzog <[email protected]>
6805    
6806 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6807     Update doc-string
6808     (TransientJoinedTable.create): Do not modify the column objects of
6809     the input tables in place and copy all columns of the input tables
6810     into the joined table after all.
6811    
6812     * test/test_transientdb.py
6813     (TestTransientTable.test_transient_joined_table_same_column_name):
6814     Update to reflect the new behavior
6815     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6816     Update to reflect the new behavior
6817     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6818     New test case for a bug which modified the column objects in place
6819    
6820 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6821 jonathan 1349
6822 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6823     generate_uniform_distribution, generate_quantiles,
6824 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6825     one, otherwise we could divide by zero.
6826    
6827     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6828     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6829     check the end classification groups against the
6830     proper property values.
6831     (ClassGenTest.doBoundsTest): New. Checks the first and
6832     last classification groups to make sure their properties
6833     are the correct upper and lower bounds for a color ramp.
6834    
6835     2003-07-02 Jonathan Coles <[email protected]>
6836    
6837     * Thuban/Model/classgen.py (generate_singletons,
6838     generate_uniform_distribution, generate_quantiles,
6839 jonathan 1360 GenQuantiles0): The denominator was one to high when
6840     calculating the index for the ramp causing the index
6841     to never to reach one.
6842    
6843     2003-07-02 Jonathan Coles <[email protected]>
6844    
6845 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6846     ClassGroupRange.SetRange() so that the min/max values are
6847     passed as a tuple. This makes a better calling scheme for
6848     when a Range object is passed instead.
6849    
6850     * Thuban/Model/classgen.py: Fixed parameters to
6851     ClassGroupRange constructor.
6852    
6853     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6854     Consolidate the min/max parameters into a single _range which
6855     can either be a tuple or a Range object.
6856     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6857     into a single _range which can either be a tuple or a Range object.
6858    
6859     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6860     call to ClassGroupRange constructor to use a tuple.
6861    
6862     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6863     the classification instance variable to the new class
6864     before calling _set_layer otherwise subscribers to a
6865     LAYER_CHANGED event will not see any difference.
6866    
6867     * test/test_classification.py: Fix tests of ClassGroupRange
6868     so that they use the new signature.
6869    
6870     * test/test_load.py: Fix use of ClassGroupRange so that it
6871     uses the new signature.
6872    
6873     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6874     uses the new signature.
6875    
6876     * test/test_save.py: Fix use of ClassGroupRange so that it
6877     uses the new signature.
6878    
6879    
6880     2003-07-01 Jonathan Coles <[email protected]>
6881    
6882 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6883     Import used objects/class from color.
6884     (generate_singletons): We don't
6885     need the numGroups parameter anymore because we are using
6886     the new ramps with GetProperties().
6887     (generate_uniform_distribution): Use new ramp method
6888     GetProperties().
6889     (generate_quantiles, GenQuantiles0): Use new ramp method
6890     GetProperties().
6891     (CustomRamp.SetNumGroups): Removed. The ramps now map
6892     a value from 0 to 1 to class properties so the number
6893     of groups is not needed ahead of time.
6894     (CustomRamp.next): Removed. CustomRamp does not support
6895     interation anymore.
6896     (CustomRamp.GetProperties): Returns a ClassGroupProperties
6897     object based on the index value from 0 to 1 that is
6898     passed to it.
6899     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6900     Made into instances of Monochromatic class instread of
6901     deriving from it.
6902     (HotToCold.SetNumGroups): Removed. See CustomRamp.
6903     (HotToCold.next): Removed. See CustomRamp.
6904    
6905     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6906     (Classification.SetField, Classification.SetFieldType):
6907     Replaced with SetFieldInfo.
6908     (Classification.SetFieldInfo): New. Does a better job of
6909     what SetField and SetFieldType used to do by combining
6910     their function since they should really always be done
6911     at the same time.
6912     (Classification.SetLayer): Renamed to _set_layer.
6913     (Classification._set_layer): Should only be called from
6914     Layer's SetClassification. This does not cause a recursive
6915     call as SetLayer did because we know that Layer knows about
6916     the classification.
6917    
6918     * Thuban/Model/color.py: Fixes RTbug #1971.
6919     (_Transparent): Renamed from Transparent so it doesn't
6920     conflict with the module variable.
6921     (Transparent, Black): Renamed from Color.Transparent,
6922     Color.Black so they are not class variables.
6923    
6924     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6925     (Layer.Destroy): We don't need to call SetClassification
6926     anymore to clear out the back reference in the classifcation
6927     to the layer. It's better to set it to None using _set_layer,
6928     and we won't be creating another clas object too.
6929     (Layer.SetClassification): Classification._set_layer is not
6930     recursive so remove all the locking variables. Also clean
6931     up the code so that it remains unchanged if something fails.
6932    
6933     * Thuban/Model/load.py: Fixes RTbug #1971.
6934     (SessionLoader.start_classification): Call
6935     Classification.SetFieldInfo().
6936    
6937     * Thuban/Model/save.py: Removed import of Color which wasn't
6938     being used.
6939    
6940     * Thuban/UI/classgen.py: Fixes RTbug #1972.
6941     (ClassGenDialog.__init__): Color ramps are now instances
6942     already so we don't need to create any new objects.
6943     (ClassGenDialog.OnOK): Check for numGroups is no longer
6944     necessary because we never use it.
6945    
6946     * Thuban/UI/classifier.py: Fixes RTbug #1971.
6947     (Classifier.__BuildClassification, Classifier.__SetGridTable):
6948     Call Classification.SetFieldInfo() instead of SetFieldType.
6949    
6950     * Thuban/UI/renderer.py: Fixes RTbug #1971.
6951    
6952     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6953     (MapCanvas.__init__): Subscribe to the idle time event. Set
6954     background color to white.
6955     (MapCanvas.OnPaint): Set a flag indicating that we should
6956     render the map during idle time. If we already have a bitmap
6957     just draw it now.
6958     (MapCanvas.OnIdle): New. Render the map only during idle time.
6959     This also fixes a problem with the busy cursor under gtk.
6960    
6961     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6962     Fix calls to generate_singletons because the signature changed.
6963    
6964     * test/test_classification.py: Fix color references and
6965     change calls to Classification.[SetField|SetFieldType] to
6966     SetFieldInfo.
6967    
6968     * test/test_load.py: Fix color references.
6969    
6970     * test/test_load_0_2.py: Fix color references.
6971    
6972     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6973     Change calls to Classification.[SetField|SetFieldType] to
6974     SetFieldInfo.
6975    
6976 frank 1334 2003-07-01 Frank Koormann <[email protected]>
6977    
6978     MERGE from the greater-ms3 branch.
6979    
6980     * test/test_transientdb.py
6981     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6982     New. Test join of two tables with partly equal column names.
6983    
6984     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6985     If duplicates in left and right tables column names are found,
6986     append '_' (underscores) to the name until it is unique.
6987     Create always new internal names for the resulting table and reference
6988     columns in the join statement with <table>.<column>
6989    
6990 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
6991    
6992     * test/test_transientdb.py
6993     (TestTransientTable.test_transient_joined_table_same_column_name):
6994     New. Test whether joining on columns with the same names in both
6995     tables works.
6996 frank 1334
6997 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6998     sure to use the right internal names even when joining on field
6999     with the same names in both tables. Also, detect duplicate names
7000     in the joined table correctly.
7001    
7002 frank 1325 2003-07-01 Frank Koormann <[email protected]>
7003    
7004     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7005     Reverse List of layers to render in same order as in desktop legend.
7006    
7007 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
7008    
7009 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
7010     and splits it into a tuple of at most three integers.
7011     Used make_tuple() to make tuple versions of the version
7012     numbers.
7013    
7014     * Thuban/UI/about.py: Add Thuban email addresses.
7015    
7016     2003-06-30 Jonathan Coles <[email protected]>
7017    
7018 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
7019     were too high.
7020    
7021     2003-06-30 Jonathan Coles <[email protected]>
7022    
7023 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
7024    
7025     * MANIFEST.in: Added Projections so that default.proj is
7026     included.
7027    
7028 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7029    
7030     New About box with lots more information including library
7031     versions and credits. More/better version checking before
7032     Thuban starts.
7033    
7034     * Thuban/UI/about.py: New. New About box that displays
7035     library version information and credits.
7036    
7037     * Thuban/version.py: Added new 'versions' dictionary which
7038     contains the verions of various libraries which are checked
7039     when the module loads.
7040     (verify_versions): Check all version numbers and returns
7041     a list of errors.
7042    
7043     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7044     Reset the status of the buttons as the situation warrants,
7045     but in a better more reliable way by not relying on the
7046     current status to determine what needs to change.
7047    
7048     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7049     (verify_versions): Remove most of the code since it is
7050     now in Thuban.version.verify_versions.o
7051    
7052     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7053     About box in Thuban.UI.about.
7054    
7055     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7056     Returns the version of gdal library being used as a string.
7057    
7058     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7059     Removed.
7060     (get_proj_version): Return the version of PROJ that the file
7061     was compiled with.
7062     (get_gtk_version): Return th version of GTK that the file
7063     was compiled with.
7064    
7065 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7066    
7067     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7068     of the SelectPropertiesDialog should be self so the window
7069     appears on top.
7070     (ClassGroupPropertiesCtrl.DoEdit): The parent
7071     of the SelectPropertiesDialog should be self so the window
7072     appears on top.
7073    
7074     * Thuban/UI/resource.py: Cleaned up how we determine file
7075     extensions.
7076     (GetImageResource): Return an wxImage from our Resources.
7077    
7078 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7079    
7080     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7081     Check that a layer has a classification before trying
7082     to get it. Raster layers don't have classifications.
7083    
7084 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7085 jonathan 1297
7086     * setup.py: Add Resources/XML to resource list.
7087    
7088     2003-06-23 Jonathan Coles <[email protected]>
7089 jonathan 1286
7090 jonathan 1297 * setup.cfg: Fix copyright dates
7091    
7092     2003-06-23 Jonathan Coles <[email protected]>
7093    
7094 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7095    
7096     * setup.py: Don't include Locale resources yet as we don't
7097     have any and it causes problems building the distribution
7098     for Windows. Update version to 0.8.0.
7099    
7100     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7101    
7102     * Thuban/UI/mainwindow.py: Add blank line at the end because
7103     file was not being read correctly building the Windows
7104     distribution.
7105    
7106     2003-06-23 Jonathan Coles <[email protected]>
7107    
7108 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7109    
7110     * Thuban/version.py: Temporarily update longversion for
7111     the 0.8 release so that it doesn't have the cvs revision.
7112    
7113     2003-06-23 Jonathan Coles <[email protected]>
7114    
7115 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7116     to make sure that we don't create reentrant possibilities with
7117     wxYield.
7118    
7119     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7120     directly to avoid the wxSafeYield() call which generates an
7121     OnPaint event causing infinite recursion. Don't try to catch
7122     exception anymore. This was for before there were limits on map
7123     scaling.
7124    
7125 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7126    
7127     Bug fix for RT #1961:
7128    
7129     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7130     Register DerivedShapestores with the session
7131    
7132     * Thuban/Model/session.py (Session.Tables): Make sure each table
7133     is only listed once.
7134    
7135     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7136     Update file contents to match the one written out.
7137    
7138 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7139    
7140     * test/xmlsupport.py (SaxEventLister.startElementNS)
7141     (SaxEventLister.endElementNS): Do not include the qname. Python
7142     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7143     is (presumably incorrectly) None, whereas it's a string with the
7144     element name in the later versions.
7145    
7146     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7147     (TestEventList.test_even_list_namespace): Update tests to reflect
7148     the new behaviour
7149     (TestEventList.test_even_list_id_normalization): Fix doc-string
7150    
7151 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7152    
7153 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7154     by deriving classes to determine if that layer supports shapes.
7155     (Layer): Override HasShapes and return true.
7156    
7157     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7158     instead of a direct call to wx[Begin|End]CusyCursor().
7159     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7160     table data.
7161    
7162     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7163     New. Wrappers around the wxWindows functions that allow us to
7164     make additional calls such as wxYield which gives the native
7165     system a chance to update the cursor correctly.
7166    
7167     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7168     instead of a direct call to wx[Begin|End]CusyCursor().
7169    
7170     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7171     instead of a direct call to wx[Begin|End]CusyCursor().
7172     (MapCanvas.find_shape_at): Check if the current search layer
7173     support shapes, otherwise go on to the next layer.
7174    
7175     * test/test_layer.py: Add tests in each type of layer for
7176     HasClassification() and HasShapes()
7177    
7178     2003-06-20 Jonathan Coles <[email protected]>
7179    
7180 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7181     turning on the busy cursor to allow the system to change the
7182     cursor before we begin painting. This fixes a problem that
7183     was occuring only under GTK. Fixes RTbug #1840.
7184    
7185 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7186    
7187     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7188     version.
7189    
7190     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7191     sort of the data sources so they can be written with sources that
7192     data sources that depend on other data sources come after the
7193     sources they depend on.
7194     (SessionSaver.__init__): Add idmap instance variable to map from
7195     objects to the ids used in the file.
7196     (SessionSaver.get_id, SessionSaver.define_id)
7197     (SessionSaver.has_id): New. Methods to manage the idmap
7198     (SessionSaver.write): Use thuban-0.8.dtd
7199     (SessionSaver.write_session): Add a namespace on the session and
7200     write out the data sources before the maps.
7201     (SessionSaver.write_data_containers): New. Write the data
7202     containers.
7203     (SessionSaver.write_layer): Layer elements now refer to a
7204     shapestore and don't contain filenames anymore.
7205    
7206     * Thuban/Model/load.py (LoadError): Exception class to raise when
7207     errors in the files are discovered
7208     (SessionLoader.__init__): Define dispatchers for elements with a
7209     thuban-0.8 namespace too.
7210     (SessionLoader.check_attrs): New helper method to check and
7211     convert attributes
7212     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7213     (SessionLoader.start_fileshapesource)
7214     (SessionLoader.start_derivedshapesource)
7215     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7216     Handlers for the new elements in the new fileformat
7217     (SessionLoader.start_layer): Handle the shapestore attribute in
7218     addition to filename.
7219     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7220     They were never used in the old formats and aren't needed for the
7221     new.
7222    
7223     * Thuban/Model/session.py (Session.DataContainers): New method to
7224     return all "data containers", i.e. shapestores and tables
7225    
7226     * test/xmlsupport.py (SaxEventLister.__init__)
7227     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7228     normalize IDs.
7229    
7230     * test/test_xmlsupport.py
7231     (TestEventList.test_even_list_id_normalization): New test case for
7232     id normalization
7233    
7234     * test/test_load.py (LoadSessionTest.check_format): Use ID
7235     normalization
7236     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7237     class atrributes used for ID normalization
7238     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7239     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7240     file format
7241     (TestJoinedTable): New test for loading sessions with joined
7242     tables.
7243     (TestLoadError): New. Test whether missing required attributes
7244     cause a LoadError.
7245    
7246     * test/test_save.py (SaveSessionTest.thubanids)
7247     (SaveSessionTest.thubanidrefs): New class attributes for ID
7248     normalization in .thuban files.
7249     (SaveSessionTest.compare_xml): Use id-normalization.
7250     (SaveSessionTest.testEmptySession)
7251     (SaveSessionTest.testLayerProjection)
7252     (SaveSessionTest.testRasterLayer)
7253     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7254     (SaveSessionTest.testLayerProjection): The filename used was the
7255     same as for testSingleLayer. Use a different one.
7256     (SaveSessionTest.test_dbf_table)
7257     (SaveSessionTest.test_joined_table): New test cases for saving the
7258     new data sources structures.
7259     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7260     data stores for writing.
7261    
7262     * test/runtests.py: Add CVS keywords
7263    
7264 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7265    
7266 jonathan 1267 * test/test_session.py
7267     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7268     Use the cultural_landmark-point.dbf file for the store so that
7269     the table rows and shape count match.
7270    
7271     2003-06-20 Jonathan Coles <[email protected]>
7272    
7273 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7274     an exception if the number of shapes is different from the
7275     number of rows in the table. Address RTbug #1933.
7276    
7277     * test/test_layer.py (TestLayer.test_derived_store): Add
7278     a test for the new exception in DerivedShapeStore.__init__.
7279    
7280     * test/support.py (FloatTestCase): Removed since there is
7281     already FloatComparisonMixin. Fixes RTbug #1954.
7282     (FloatComparisonMixin.assertFloatEqual): Include test for
7283     infinity that was part of FloatTestCase.
7284    
7285     * test/test_range.py (RangeTest): Inherit from
7286     support.FloatComparisonMixin now that we don't have
7287     support.FloatTestCase.
7288    
7289 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7290    
7291 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7292     the implementation in xmlsupport instead.
7293     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7294    
7295     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7296     of test_save
7297    
7298     2003-06-20 Bernhard Herzog <[email protected]>
7299    
7300 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7301     method to make sure the test files we load might have been written
7302     by the current thuban version.
7303     (ClassificationTest.TestLayers, TestSingleLayer.test)
7304     (TestLayerVisibility.test, TestClassification.test)
7305     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7306     Add check_format() calls and fix the thuban data to match the data
7307     that would be written by saving the session loaded from it.
7308    
7309     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7310     the same class and function in test_save.
7311    
7312     * test/test_xmlsupport.py (TestEventList): New. test cases for
7313     sax_eventlist
7314    
7315     2003-06-20 Bernhard Herzog <[email protected]>
7316    
7317 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7318     Thuban are covered by this DTD
7319     (map): Fix content model for layers and raster layers. There can
7320     be any number or layers and raster layers in any order.
7321    
7322 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7323    
7324 jonathan 1265 This is mainly about fixing RTbug #1949.
7325    
7326 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7327     import statement since python 2.2 is the earliest supported
7328     version.
7329    
7330     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7331     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7332     depending on the units this projection *forwards* into.
7333    
7334     * Thuban/Model/save.py (SessionSaver.write_classification):
7335     Remove unnecessary use of lambdas and nested functions.
7336    
7337     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7338     adjustment here if the map projection uses degrees.
7339    
7340     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7341     scale adjust code since it is now done before calling
7342     this method. Don't do anything if the map projection
7343     is None.
7344    
7345 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7346    
7347 bh 1248 Move version specific load tests to their own file.
7348    
7349     * test/test_load.py: Expand the doc-string to explain a bit how to
7350     handle file format changes.
7351     (TestClassification.test): Update the docstring as this test is
7352     not about Thuban 0.2 anymore.
7353    
7354     * test/test_load_0_2.py: New file with the load tests for thuban
7355     files created with Thuban 0.2 and earlier.
7356    
7357     2003-06-19 Bernhard Herzog <[email protected]>
7358    
7359 bh 1246 Add XML validation to some of the tests. Validation will only be
7360     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7361     To make the DTD available to the test cases it's moved into
7362     Resources/XML
7363    
7364     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7365     for versions up to and including 0.2. Two slight changes: added an
7366     encoding specification and fixed the comment which refered to
7367     GRASS, not Thuban
7368    
7369     * test/xmlsupport.py: New support module for tests involving XML.
7370     Currently there's a mix-in class for XML validation.
7371    
7372     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7373    
7374     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7375     so that we can validate the
7376     (SaveSessionTest.testEmptySession)
7377     (SaveSessionTest.testSingleLayer)
7378     (SaveSessionTest.testSingleLayer)
7379     (SaveSessionTest.testLayerProjection)
7380     (SaveSessionTest.testRasterLayer)
7381     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7382    
7383     * test/runtests.py (main): Call print_additional_summary instead
7384     of print_garbage_information
7385    
7386     * test/support.py (resource_dir): New function to return the
7387     "Resource" subdirectory
7388     (print_additional_summary): New function to combine several
7389     summary functions
7390     (run_tests): Use print_additional_summary instead of calling
7391     print_garbage_information directly
7392    
7393     2003-06-19 Bernhard Herzog <[email protected]>
7394    
7395 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7396     the classification element.
7397     (projection): Add the "name" attribute
7398    
7399 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7400    
7401     MERGE from the greater-ms3 branch.
7402    
7403     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7404     scale if projection is latlong to get better estimate.
7405    
7406     Fix problem of hidden properties dialog under windows after double
7407     click on layer tree:
7408     The tree control always gets an Expanded / Collapsed event after
7409 joey 2162 the ItemActivated on double click, which raises the main window again.
7410     We add a second ItemActivated event to the queue, which simply
7411 frank 1242 raises the already displayed window.
7412    
7413     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7414     raiseProperties initialized to prevent endless loops
7415     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7416     simply raise the properties or open the dialog and issue a second
7417     event.
7418    
7419 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7420    
7421 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7422    
7423     2003-06-18 Jonathan Coles <[email protected]>
7424    
7425 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7426     legend was being opened after the mainwindow was created
7427     and not during its creation. This meant the map was drawn
7428     initially and then had to be redrawn when the legend
7429     caused the display to change. Now the legend is opened
7430     in the mainwindow constructor which resolves this issue.
7431    
7432     Also, although we were checking for the existence of
7433     gdal and gdalwarp modules, the gdalwarp extension was
7434     still being compiled (which may fail if the system doesn't
7435     have gdal installed). the build_ext command to setup.py
7436     now accepts the flags --with-gdal and --without-gdal.
7437     If --without-gdal is specified setup.py will try to
7438     use the gdal parameters specified by gdal-config. Under
7439     windows, those parameters have to be set in setup.py
7440     as with proj4 an wxWindows.
7441    
7442     * setup.py: Use a list instead of seperate variables for
7443     extension parameters so we can create a generic function
7444     that runs an appropriate *-config script.
7445     (run_cs_script): Renamed from run_wx_script and modified
7446     to accept a second argument which is a list of lists to
7447     be filled in by the values returned from running the command.
7448     (thuban_build_ext): New. Extends the build_ext command and
7449     provides the options --with-gdal/--without-gdal which then
7450     optionally includes the gdalwarp extension.
7451    
7452     * Thuban/Model/resource.py: First check if we can import
7453     the gdalwarp Thuban extension before checking for gdal.
7454     Also added some comments.
7455    
7456     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7457     the map is None which may be the case if none has been loaded
7458     yet.
7459    
7460     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7461    
7462     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7463    
7464     * Thuban/UI/renderer.py: Check for gdal support before importing
7465     gdalwarp.
7466     (MapRenderer.render_map): Only try to optimize if we have gdal
7467     support otherwise nothing will get drawn.
7468    
7469 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7470     during startup before a map has been created. Check if map is None
7471     before using it and do nothing if it is.
7472    
7473 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7474    
7475     Fix the problem with raster layers under Windows that caused
7476     Thuban to crash. The view should respond to layer projection
7477     changed events to update the display. Changes to a projection
7478     should not cause the map to be set to full extent.
7479    
7480     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7481     current_map_proj to remember the current map projection so that
7482     when the projection changes we know what the previous projection
7483     was.
7484     (MapCanvas.SetMap): Unsubscribe and subscribe to
7485     LAYER_PROJECTION_CHANGED events.
7486     (MapCanvas.projection_changed): Split into two methods that respond
7487     to map and layer projection changes.
7488     (MapCanvas.map_projection_changed): New. Takes the current view and
7489     projects it using the new projection. This does not cause the
7490     map to be redrawn at full extent.
7491     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7492     will draw each layer in its new projection.
7493    
7494     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7495     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7496     under Windows.
7497    
7498     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7499     to twice sizeof(void*) because there are two digits for each
7500     hex byte.
7501    
7502 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7503    
7504     Update to the layer interface: Direct access to the table,
7505     shapetable, shapefile and filename attributes is now actively
7506     deprecated by issuing deprecation warnings for all places where
7507     this happens.
7508    
7509     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7510     to the instance variables table, shapetable, shapefile and
7511     filename via __getattr__ so that we can issue a deprecation
7512     warning.
7513     (Layer.SetShapeStore): Don't set the deprecated instance variables
7514     any more
7515     (Layer.SetShapeStore): Don't use deprecated layer instance
7516     variables
7517     (Layer.Destroy): No need to explicitly remove the instance
7518     variables any more
7519     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7520     instance variables
7521    
7522     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7523     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7524     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7525     use deprecated layer instance variables
7526    
7527     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7528     deprecated layer instance variables
7529    
7530     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7531     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7532     instance variables
7533    
7534     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7535     deprecated layer instance variables
7536    
7537     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7538     deprecated layer instance variables
7539    
7540     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7541     deprecated layer instance variables
7542    
7543     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7544     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7545     variables
7546    
7547     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7548     errors so that they're cought by the tests
7549    
7550     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7551     layer instance variables
7552    
7553 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7554    
7555     Fix a problem under Windows whereby if the user double-clicks on a
7556     layer in the legend that tree item will expand or collapse as well
7557     as open the layer properties dialog. The state of the tree item
7558     should not be affected.
7559    
7560     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7561     preventExpandCollapse and subscribe to expanding and collapsing
7562     events.
7563     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7564     collapsing events and will veto the event if it has been triggered
7565     by the user double clicking on a layer.
7566     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7567     that an expanding/collapsing event should be vetoed.
7568    
7569 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7570    
7571     * Thuban/UI/classifier.py (Classifier.OnClose)
7572     (Classifier.map_layers_removed)
7573     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7574     in OnClose and not in map_layers_removed or
7575     layer_shapestore_replaced to make sure it always happens when the
7576     dialog is closed
7577    
7578 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7579    
7580 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7581     the background of the table view appears correctly.
7582    
7583     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7584     object that can be used by derived classes to place any
7585     controls (including the grid) onto.
7586     (QueryTableFrame.__init__): Use the panel as the parent window
7587     for all the controls. Reparent the grid so that the panel is
7588     the parent. Call UpdateStatusText() to correctly initialize
7589     the status bar.
7590    
7591     2003-06-13 Jonathan Coles <[email protected]>
7592    
7593 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7594     from wxFrame (as opposed to wxDialog like the other classes)
7595     but otherwise behaves like the other classes. This is needed
7596     for the TableView which isn't really a dialog and needs to
7597     have a status bar and control buttons.
7598    
7599     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7600     instance variable to keep track of how many rows are selected.
7601     Subscribe once to the the events we are interested in.
7602     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7603     hasn't been turned off.
7604     (ThubanGrid.OnSelectCell): Only handle event if event handling
7605     hasn't been turned off.
7606     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7607     as an event listener (which changes the event handler stack)
7608     simply set an instance variable to False. This is checked in
7609     the event handlers.
7610     (ThubanGrid.GetNumberSelected): Return the number of currently
7611     selected rows.
7612     (TableFrame): Inherit from ThubanFrame so we can have a
7613     status bar and control buttons.
7614     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7615     Explicitly set which items are selected in the operator choice and
7616     action choice so there is always a valid selection. Fixes RTbug #1941.
7617     Subscribe to grid cell selection events so we can update the
7618     status bar.
7619     (QueryTableFrame.UpdateStatusText): Update the status bar with
7620     how many rows are in the grid, how many columns, and how many
7621     rows are selected.
7622     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7623     Call UpdateStatusText when cells are (de)selected.
7624     (QueryTableFrame.OnQuery): Use the string value in the value
7625     combo if either the selected item index is 0 or if the string
7626     cannot be found in the predefined list (this happens if the
7627     user changes the text). Fixes RTbug #1940.
7628     Only turn off the grid event listeners if there a query comes
7629     back with a none empty list of ids. in the case that the list
7630     is empty this causes a grid.ClearSelection() call to actually
7631     clear the grid selection which causes the selected items in
7632     the map to be deselected. Fixes RTbug #1939.
7633    
7634     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7635     Fixes RTbug #1851.
7636    
7637 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7638    
7639     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7640     self.selected_shape with the current selection to make sure the
7641     contents of the dialog are up to date when it's shown for the
7642     first time.
7643     The dialog used to work without this by luck. The recent fix to
7644     the connector module 'broke' a 'feature' the identify view was
7645     relying on, i.e that subscribing to a message in response to
7646     receiving a message of that type would mean that the new
7647     subscriber would also be called for the same message.
7648    
7649 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7650 jonathan 1175
7651 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7652     the image is rendered. Fixes RTbug #1937.
7653    
7654     2003-06-12 Jonathan Coles <[email protected]>
7655    
7656 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7657 jonathan 1193 user directory if it doesn't exist on a posix system.
7658     Fixes RTbug #1815.
7659 jonathan 1191
7660     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7661     called to get_application_dir here, so that the directory
7662     will only be called if this method is invoked.
7663    
7664     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7665     the projfilepath if no projection is selected.
7666    
7667     2003-06-12 Jonathan Coles <[email protected]>
7668    
7669 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7670     the scalebar if the current map has no projection set.
7671    
7672     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7673     projfilepath label to just the basename of the projection file
7674     rather than include the entire path.
7675    
7676     * Thuban/Model/resource.py: Fix missed proj functions that
7677     needed to be renamed.
7678    
7679     2003-06-12 Jonathan Coles <[email protected]>
7680    
7681 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7682     tested if the variable was an instance of Color.
7683    
7684     * Thuban/Model/color.py (Color): Remove commented code that isn't
7685     used.
7686     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7687     Fixes RTbug #1835.
7688     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7689     Needed now that the class doesn't inherit from Color.
7690    
7691     2003-06-12 Jonathan Coles <[email protected]>
7692    
7693 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7694     check unicode strings.
7695    
7696     * test/test_layer.py: Check for existence of gdal.
7697    
7698     2003-06-12 Jonathan Coles <[email protected]>
7699 jonathan 1172
7700     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7701     that was in load.py
7702 jonathan 1169
7703 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7704     that was in save.py
7705    
7706     2003-06-12 Jonathan Coles <[email protected]>
7707    
7708 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7709     case where gdal is not on the system. The XMLReader and XMLWriter
7710     classes were moved into there own files to resolve some circular
7711     import references and because they shouldn't really be in the
7712     file that is dediciated to reading/writing session files since
7713     they are also used elsewhere.
7714    
7715     * Thuban/Model/classgen.py: Renamed functions to follow the
7716     function_names_with_underscores style. Fixes RTbug #1903.
7717     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7718    
7719     * Thuban/Model/layer.py: Import gdal only if it available.
7720     (RasterLayer): Handle the case where the gdal library is unavailable.
7721     Addresses RTbug #1877.
7722    
7723     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7724     xmlreader.py.
7725    
7726 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7727    
7728     This is largely a collection of bug fixes. We also handle the
7729     case where gdal is not on the system. The XMLReader and XMLWriter
7730     classes were moved into there own files to resolve some circular
7731     import references and because they shouldn't really be in the
7732     file that is dediciated to reading/writing session files since
7733     they are also used elsewhere.
7734    
7735     * Thuban/Model/classgen.py: Renamed functions to follow the
7736     function_names_with_underscores style. Fixes RTbug #1903.
7737     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7738    
7739     * Thuban/Model/layer.py: Import gdal only if it available.
7740     (RasterLayer): Handle the case where the gdal library is unavailable.
7741     Addresses RTbug #1877.
7742    
7743     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7744     xmlreader.py.
7745    
7746 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7747     file xmlwriter.py.
7748    
7749     * Thuban/Model/resource.py: Renamed functions to following the
7750     function_names_with_underscores style.
7751     (has_gdal_support): New function that returns true if the gdal
7752     library is available. Addresses RTbug #1877.
7753    
7754     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7755     Display a message box if the gdal library is not available, but
7756     only if there are any layers that would use it. Addresses RTbug #1877.
7757    
7758     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7759     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7760     when using integers versus floats.
7761    
7762     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7763     determine if the "Add Image Layer" menu option should be
7764     greyed out or not. Addresses RTbug #1877.
7765    
7766     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7767    
7768     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7769     optimize if a raster layer is visible. Fixes RTbug #1931.
7770     Only draw the raster layer if the gdal library is available.
7771     Addresses RTbug #1877.
7772    
7773     * test/test_classgen.py: Add tests for generate_singletons,
7774     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7775     (test_calculate_quantiles): Fix some tests to catch the new
7776     ValueError that is raised.
7777    
7778     * test/test_proj.py: Use renamed projection resource functions.
7779    
7780     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7781     test for saving classified layers. Fixes RTbug #1902.
7782     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7783    
7784 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7785    
7786     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7787    
7788     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7789    
7790     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7791     multiplechoicedialog.py rather than from the wxPython library.
7792    
7793 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7794    
7795 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7796     update.
7797    
7798     2003-06-11 Frank Koormann <[email protected]>
7799    
7800 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7801     determine the absolute .thuban/thuban directory under
7802     "posix" (os.expanduser) and "nt" (read AppData registry key).
7803    
7804     * Thuban/Model/resource.py: Use get_application_dir
7805    
7806     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7807     Use get_application_dir.
7808    
7809 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7810    
7811 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7812     the messages MAP_LAYERS_REMOVED messages
7813     (LayerTableFrame.OnClose): Unsubscribe from it.
7814     (LayerTableFrame.map_layers_removed): New. Receiver for
7815     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7816     dialog is showing is removed.
7817    
7818     2003-06-10 Bernhard Herzog <[email protected]>
7819    
7820 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7821     of the receivers list so that unsubscribing in a receiver doesn't
7822     modify it while iterating over it.
7823    
7824     * test/test_connector.py
7825     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7826     unsubscribing in a receiver works correctly. See docstring for
7827     details
7828    
7829     2003-06-10 Bernhard Herzog <[email protected]>
7830    
7831 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7832     message.
7833    
7834     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7835     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7836     LAYER_CHANGED will still be sent if the classification changes.
7837    
7838     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7839     parameter so we can subscribe to some of its messages
7840     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7841     and the layer's LAYER_SHAPESTORE_REPLACED
7842     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7843     subscribed to in __init__
7844     (Classifier.map_layers_removed)
7845     (Classifier.layer_shapestore_replaced): receivers for the messages
7846     subscribed to in __init__. Unsubscribe and close the dialog
7847    
7848     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7849     the map to the Classifier dialog
7850    
7851     * test/test_layer.py (SetShapeStoreTests): Derive from
7852     SubscriberMixin as well so we can test messages
7853     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7854     messages
7855     (SetShapeStoreTests.tearDown): Clear the messages again
7856     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7857     for the modified flag too
7858     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7859     to check whether SetShapeStore sets the modified flag
7860     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7861     (SetShapeStoreTests.test_set_shape_store_same_field)
7862     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7863     Add tests for the messages. This checks both the new
7864     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7865    
7866 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7867    
7868     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7869     the menu items.
7870    
7871 frank 1134 2003-06-05 Frank Koormann <[email protected]>
7872    
7873 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7874     Layout reimplemented without panel. Make life easier to fit the list
7875     in the dialog.
7876    
7877     2003-06-05 Frank Koormann <[email protected]>
7878    
7879 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7880     once on initialisation (Former implementation resulted in multiple
7881     entries for each projection).
7882     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7883     if set, select the projection found under the specified name. This
7884     overwrites any other selection estimate.
7885     Removed projchoice filling from this method.
7886     (ProjFrame._OnSave, ProjFrame._OnAddToList):
7887     Updated call of ProjFrame.__FillAvailList
7888     (LCCPanel._DoLayout): Moved parameter controls in more common order.
7889    
7890     * Resources/Projections/defaults.proj: Extended defaults representing
7891     various common European projections.
7892    
7893     2003-06-05 Frank Koormann <[email protected]>
7894    
7895 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7896     Use ListCtrl instead of GridCtrl
7897    
7898     * Thuban/Model/resource.py:
7899     Guess location of .thuban directory from tempdir parent directory.
7900    
7901     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7902     Guess location of .thuban directory from tempdir parent directory.
7903    
7904 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
7905    
7906     Do not cache the values returned by the tree widget's
7907     GetFirstChild and GetNextChild methods because it led to lots of
7908     segfaults. The new way requires more brute force but is more
7909     reliable.
7910    
7911     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7912     variable layer2id
7913     (LegendTree.find_layer): New method to do with brute force what
7914     layer2id tried to accomplish
7915     (LegendTree._OnMsgLayerChanged)
7916     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7917     Use find_layer instead of layer2id
7918     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7919     update layer2id anymore
7920     (LegendTree._OnMsgMapLayersRemoved)
7921     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7922    
7923 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
7924    
7925     * Thuban/Model/classgen.py (GenQuantiles0): New function.
7926    
7927 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
7928    
7929 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7930     New commands.
7931     (main_menu): Add the new commands.
7932     (MainWindow.TableRename): New. Implementation of the table_rename
7933     command.
7934     (MainWindow.RenameLayer): New. Implementation of the layer_rename
7935     command.
7936    
7937     * Thuban/Model/session.py (Session.AddTable): call self.changed to
7938     set the modified flag
7939    
7940     * test/test_session.py (TestSessionSimple.test_add_table): Test
7941     whether the modified flag is set properly
7942    
7943     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7944     instead of issue so that the modified flags get updated.
7945    
7946     * test/test_base.py (SomeTitledObject): Derive from Modifiable
7947     instead of Publisher to reflect reality better and to accomodate
7948     the fact that SetTitle now calls changed instead of issue
7949    
7950     2003-06-02 Bernhard Herzog <[email protected]>
7951    
7952     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7953     acquisition has to happen before the try in a try-finally.
7954    
7955     2003-06-02 Bernhard Herzog <[email protected]>
7956    
7957 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7958     possible that a layer is removed that is not currently selected in
7959     the legend so don't check for this.
7960    
7961 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
7962    
7963 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7964     variables to None that have direct or indirect references to
7965     shapefiles or dbf files to make sure that they do go away and the
7966     files are closed.
7967    
7968     2003-05-30 Bernhard Herzog <[email protected]>
7969    
7970 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7971     availImgListIndices when a new image list is created
7972    
7973     2003-05-30 Bernhard Herzog <[email protected]>
7974    
7975 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7976     changing_selection to indicate whether the LegendTree code itself
7977     is currently changing the selection
7978     (LegendTree.normalize_selection): New method to normalize the
7979     selection by selecting the layer item even if the user clicked on
7980     the classification.
7981     (LegendTree._OnSelChanged): normalize the selection. This works
7982     around a bug in wx which doesn't keep track of the selection
7983     properly when subtrees are deleted.
7984    
7985     2003-05-30 Bernhard Herzog <[email protected]>
7986    
7987 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7988     maximum and minimum scale factors.
7989    
7990     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7991     changes in classgen.py
7992    
7993 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
7994    
7995     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7996     all the methods functions. Fixes RTBug #1903.
7997    
7998     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7999     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
8000     RTBug #1907.
8001    
8002     * Thuban/UI/classgen.py: Use classgen functions that were part
8003     of the ClassGenerator class. Put try/finally blocks around
8004     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
8005     RTBug #1904.
8006    
8007     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
8008    
8009     * Thuban/UI/legend.py: The legend was cleared and repopulated any
8010     time something changed which caused some state to be lost such
8011     as which children were expanded or collapsed. Fixes RTBug #1901.
8012     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
8013     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
8014     the legend but not in the map.
8015     (LegendTree.__FillTree): Move main functionality out into smaller
8016     methods that can be used by other methods.
8017     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
8018     if they are available.
8019     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
8020     that we override the wxTreeCtrl method. Iterate over children
8021     and call __RemoveLayer.
8022     (LegendTree.__AddLayer): New. Add a new layer to the legend.
8023     (LegendTree.__RemoveLayer): Remove a layer from the legend.
8024     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
8025     Should only be called with the id of a layer branch.
8026     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
8027     Returns the root item or creates one if necessary.
8028    
8029     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8030     ProjectRasterFile with tuple arguments instead of strings.
8031    
8032     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8033     with try/finally. Fixes RTBug #1904.
8034    
8035     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8036     with try/finally. Fixes RTBug #1904.
8037     (MapCanvas.FitSelectedToWindow): If a single point is selected
8038     simply center it on the display. Fixes RTBug #1849.
8039    
8040     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8041     to be compiled as a standalone app. Now the code can only be
8042     called from Python which simplifies the parameter passing.
8043     (ProjectRasterFile): Handle Python arguments. Remove code that
8044     checks for a destination dataset. Add more clean up code.
8045    
8046     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8047     TestMapWithContents.test_lower_layer_bottom):
8048     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8049     Fixes RTBug #1907.
8050    
8051     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8052     extent to the map when the legend is toggled. Fixes RTBug #1881.
8053    
8054 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8055    
8056     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8057     unsubscribes all that is subcribed in __init__.
8058    
8059 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8060    
8061 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8062     (MainWindow.CanDuplicateLayer): New methods to implement the
8063     Layer/Duplicate command.
8064     (layer_duplicate command): New.
8065     (main_menu): Add layer_duplicate to the Layer menu.
8066    
8067     2003-05-28 Bernhard Herzog <[email protected]>
8068    
8069 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8070     renderer so that NULL/None values get displayed differently (by a
8071     gray rectangle).
8072     (TableGrid.__init__): Override the default renderers
8073    
8074     2003-05-28 Bernhard Herzog <[email protected]>
8075    
8076 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8077     classification to "None" if the type of the field has changed.
8078    
8079     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8080     test for the Layer.SetShapeStore method
8081    
8082 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8083 jan 1085
8084 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8085     does not necessarily have a filename).
8086    
8087     2003-05-28 Jan-Oliver Wagner <[email protected]>
8088    
8089 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8090     sort the selection list for the dialog.
8091    
8092 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8093    
8094     * extensions/thuban/wxproj.cpp
8095     (project_point): Removed cast to int for projected point coordinates.
8096     (shape_centroid): Return last point if all polygon vertices fall
8097     to one point.
8098    
8099 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8100    
8101 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8102     with layers that don't have shapestores, i.e. raster layers.
8103    
8104     2003-05-28 Bernhard Herzog <[email protected]>
8105    
8106 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8107     when determining the title from the filename.
8108    
8109     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8110     reflect changes in the way the title is derived from the filename
8111    
8112 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8113    
8114     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8115     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8116    
8117 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8118    
8119 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8120     delegate SelectedLayer.
8121     (MainWindow.LayerUnjoinTable): Implement.
8122     (_can_unjoin): New. Helper function for the sensitivity of the
8123     layer/unjoin command.
8124    
8125     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8126     (DerivedShapeStore.OrigShapeStore): New. Return the original
8127     shapestore. Used to figure out how to unjoin.
8128     (DerivedShapeStore.Shapefile): Fix a typo.
8129    
8130     2003-05-27 Bernhard Herzog <[email protected]>
8131    
8132 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8133     well
8134     (JoinDialog.__init__): Use the layer parameter and only build the
8135     left choice when a layer is given
8136     (JoinDialog.OnJoin): Handle layer joins as well
8137     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8138     that the user selects the "Select..." item. The sensitivitly
8139     updating is now in update_sensitivity
8140     (JoinDialog.y): New method to refactor the sensitivity update of
8141     the join button into its own method.
8142    
8143     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8144    
8145     2003-05-27 Bernhard Herzog <[email protected]>
8146    
8147 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8148     iff there are unreferenced tables in the session
8149    
8150     2003-05-27 Bernhard Herzog <[email protected]>
8151    
8152 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8153    
8154     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8155     to return tables that are not referenced by other tables or shape
8156     stores and can be removed.
8157     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8158     removing the table
8159    
8160     * Thuban/UI/mainwindow.py: Remove unused imports
8161     (MainWindow.TableClose): Implement.
8162    
8163     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8164     messages so that the frame will be automatically closed when a new
8165     session is opened or the table is removed.
8166     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8167     __init__
8168     (TableFrame.close_on_session_replaced)
8169     (TableFrame.close_on_table_removed): New. Subscribers that close
8170     the window
8171    
8172     * test/test_session.py (TestSessionMessages.test_remove_table)
8173     (TestSessionSimple.test_remove_table): Move the test to
8174     TestSessionSimple and add test for the TABLE_REMOVED message
8175     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8176     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8177     UnreferencedTables method.
8178     (UnreferencedTablesTests): New. Class with some more sophisticated
8179     tests for UnreferencedTables.
8180    
8181 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8182    
8183 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8184     display has some unwanted side effects. Removed again.
8185    
8186     2003-05-27 Frank Koormann <[email protected]>
8187    
8188 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8189    
8190     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8191    
8192 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8193    
8194 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8195     Menu.RemoveItem().
8196 jan 1062
8197 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8198     the menu.
8199 jan 1062
8200 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8201    
8202     Nonmodal dialogs without parent (i.e. they can fall behind the main
8203     window)
8204    
8205     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8206     all dialogs in the dialogs dictionary and the canvas.
8207    
8208     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8209     parent, i.e. can fall behind other windows.
8210     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8211     dictionary before removing it.
8212    
8213     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8214    
8215     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8216     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8217     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8218    
8219 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8220    
8221 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8222     tableview dialog
8223     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8224     Also, don't use the table's titles as the dialog names. The titles
8225     aren't guaranteed to be unique.
8226     (MainWindow.TableOpen): Open a table view dialog after opening the
8227     table
8228    
8229     2003-05-27 Bernhard Herzog <[email protected]>
8230    
8231 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8232     effect can be achieved by simply closing the window showing the
8233     table.
8234     (MainWindow.TableHide): Removed.
8235     (main_menu): Removed "table_hide"
8236    
8237 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8238    
8239     Fix legend tree display problems under Win32
8240    
8241     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8242     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8243     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8244    
8245     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8246    
8247 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8248    
8249     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8250     'after' now allows to insert separators almost anywhere in the menu.
8251    
8252 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8253    
8254     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8255     "S" of selection box label to hint on hot key (Alt-S). Works under
8256     Win32 but is ignored under GTK.
8257    
8258     2003-05-26 Frank Koormann <[email protected]>
8259    
8260     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8261     Center Choices.
8262    
8263 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8264    
8265 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8266     part of the table interface and they're only used in table_to_dbf
8267     anyway.
8268    
8269     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8270     fixed precision of 12 for doubles.
8271     (TransientTableBase.Precision): Removed
8272     (AutoTransientTable.Width): Delegate to self.table.
8273    
8274     * Thuban/Model/table.py (DBFTable.Precision)
8275     (MemoryTable.Precision): Removed.
8276     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8277     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8278     column object specifies something else.
8279    
8280     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8281     test for table_to_dbf
8282    
8283     2003-05-26 Bernhard Herzog <[email protected]>
8284    
8285     * test/test_transientdb.py
8286     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8287    
8288     2003-05-26 Bernhard Herzog <[email protected]>
8289    
8290 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8291     implementation. Mark parts of the file format strings for
8292     localization.
8293    
8294     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8295     file and add the table to the tables managed by the session
8296    
8297 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8298     New. test case for OpenTableFile
8299    
8300 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8301    
8302 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8303     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8304     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8305     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8306    
8307     2003-05-26 Jan-Oliver Wagner <[email protected]>
8308    
8309 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8310     already a selection present, update the grid accordingly.
8311 jan 1033
8312     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8313     resizeable and increase its initial size.
8314    
8315 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8316    
8317     Table export functionality
8318    
8319     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8320     Return width (in characters) for a column.
8321     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8322     (table_to_dbf): Write table to dbf file.
8323     (table_to_csv): Write table to csv file.
8324    
8325     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8326     TransientTableBase.Precision): Return column width and precision.
8327    
8328     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8329     or table_to_csv depending on file selection.
8330    
8331     * test/test_dbf_table.py:
8332     Test table_to_dbf (extension of former part of test).
8333    
8334     * test/test_csv_table.py:
8335     Test table_to_csv.
8336    
8337 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8338    
8339 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8340     Use QueryTableFrame instead of TableFrame.
8341 jan 1021
8342 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8343     table window with 'Layer Table:' instead of 'Table:'.
8344    
8345     2003-05-23 Jan-Oliver Wagner <[email protected]>
8346    
8347     Give all tables a title via mix-in TitledObject.LayerShowTable
8348    
8349 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8350     only if it exists.
8351    
8352     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8353     and call its init-method with a default title. Remove Title() method.
8354    
8355     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8356     AutoTransientTable): mix-in TitledObject and call its init-method with
8357     a default title. Remove Title() method.
8358    
8359 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8360    
8361     * Thuban/Model/session.py (Session.AddShapeStore): Define
8362     AddShapeStore analogously to AddTable.
8363    
8364     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8365     New. Test for AddShapeStore
8366    
8367 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8368    
8369     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8370    
8371     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8372     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8373     The latter implements the selection GUI without dependency on a layer.
8374     LayerTableFrame now is derived from QueryTableFrame and connects
8375     to a layer.
8376    
8377     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8378     implementation that still needs work.
8379    
8380     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8381    
8382 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8383    
8384     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8385     Added "outer_join = False" as optional parameter.
8386     (TransientJoinedTable.create): If outer join is true, perform a
8387     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8388     the left table. Records not matching are filled with 0 / None.
8389    
8390     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8391     (JoinDialog.OnJoin): Consider outer join check box.
8392    
8393 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8394    
8395 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8396     somewhat safer way. Storing the traceback in a local variable can
8397     lead to memory leaks
8398    
8399     2003-05-22 Bernhard Herzog <[email protected]>
8400    
8401 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8402     the wxMessageDialog's Destroy() method.
8403    
8404 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8405    
8406     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8407     TransientTable.Title()
8408    
8409     2003-05-22 Frank Koormann <[email protected]>
8410    
8411     Join Dialog, initial version.
8412    
8413     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8414    
8415     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8416     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8417     in all occurences.
8418    
8419     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8420     Typo fixed.
8421    
8422 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8423    
8424 bh 999 Give the tables titles so that the GUI can display more meaningful
8425     names. For now the titles are fixed but depend on e.g. filenames
8426     or the titles of the joined tables.
8427    
8428     * Thuban/Model/transientdb.py (TransientTable.Title)
8429     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8430    
8431     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8432    
8433     * test/test_transientdb.py
8434     (TestTransientTable.test_auto_transient_table_title): New. Test
8435     for the Title method
8436     (TestTransientTable.test_transient_joined_table)
8437     (TestTransientTable.test_transient_table): Add test for the Title
8438     methods
8439    
8440     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8441     Test for the Title method
8442    
8443     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8444     the Title method
8445    
8446     2003-05-22 Bernhard Herzog <[email protected]>
8447    
8448 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8449     Provide a better way to destroy the layers
8450     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8451     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8452     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8453     the new way to destroy the layers.
8454     (TestLayer.test_derived_store): New. Test for using a layer with a
8455     DerivedShapeStore
8456    
8457     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8458     filename if the shape store actually has one.
8459    
8460     2003-05-22 Bernhard Herzog <[email protected]>
8461    
8462 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8463     for the filename
8464    
8465     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8466     for the FileName method
8467     (TestDBFTableWriting.test_write): Fix spelling of filename
8468    
8469 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8470    
8471     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8472     from SciParam that now really is immutable.
8473    
8474 frank 992 2003-05-22 Frank Koormann <[email protected]>
8475    
8476     Layer Top/Bottom placement added to legend.
8477    
8478     * Thuban/UI/legend.py
8479     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8480     bound to tool events.
8481     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8482     New, methods binding the event methods with the map methods.
8483    
8484     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8485     layer at top/bottom of layer stack.
8486    
8487     * Resources/Bitmaps/top_layer.xpm: New button icon.
8488    
8489     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8490    
8491 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8492    
8493     * Thuban/Model/session.py (Session.RemoveTable): New method to
8494     remove tables
8495    
8496     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8497     Test for RemoveTable
8498    
8499 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8500    
8501     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8502     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8503    
8504 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8505    
8506 bh 985 Implement a way to discover dependencies between tables and
8507     shapestores.
8508    
8509     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8510     (TransientJoinedTable.Dependencies)
8511     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8512     interface
8513     (TransientJoinedTable.__init__): Keep tack of the original table
8514     objects in addition to the corresponding transient tables.
8515    
8516     * Thuban/Model/table.py (DBFTable.Dependencies)
8517     (MemoryTable.Dependencies): New. Implement the dependencies
8518     interface
8519    
8520     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8521     ShapefileStore
8522     (ShapefileStore.__init__): Use ShapeTable instead of
8523     AutoTransientTable
8524     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8525     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8526     methods for filename and type
8527     (ShapefileStore.Dependencies): New. Implement the dependencies
8528     interface
8529     (DerivedShapeStore): New class to replace SimpleStore. The main
8530     difference to SimpleStore is that it depends not on a shapefile
8531     but another shapestore which expresses the dependencies a bit
8532     better
8533     (SimpleStore.__init__): Add deprecation warning.
8534    
8535     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8536     Test for the Dependencies method.
8537    
8538     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8539     New. Test for the Dependencies method.
8540    
8541     * test/test_transientdb.py
8542     (TestTransientTable.test_auto_transient_table_dependencies): New.
8543     Test for the Dependencies method.
8544     (TestTransientTable.test_transient_joined_table): Add test for the
8545     Dependencies method.
8546    
8547     * test/test_session.py (TestSessionSimple.setUp)
8548     (TestSessionSimple.tearDown): New. Implement a better way to
8549     destroy the sessions.
8550     (TestSessionSimple.test_initial_state)
8551     (TestSessionSimple.test_add_table): Bind session to self.session
8552     so that it's destroyed by tearDown
8553     (TestSessionSimple.test_open_shapefile): New. Test for
8554     OpenShapefile and the object it returns
8555    
8556     2003-05-22 Bernhard Herzog <[email protected]>
8557    
8558 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8559     register tables with the session.
8560     (Session.Tables): Return the tables registered with AddTable too.
8561    
8562     * test/test_session.py (TestSessionSimple.test_add_table): New.
8563     Test case for the AddTable method
8564    
8565 frank 981 2003-05-22 Frank Koormann <[email protected]>
8566    
8567     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8568     lower right corner, center labels for selections, initialize controls
8569     in reasonable order for keyboard navigation.
8570    
8571     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8572     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8573     using the wxListBox.FindString() method. Still a problem (#1886)
8574    
8575     * Thuban/UI/classifier.py
8576     (Classifier.__init__, SelectPropertiesDialog.__init__)
8577    
8578     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8579     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8580     different classification types from here to __init__.
8581     (GenUniquePanel.__init__): Set the column width of the first field
8582     in the Field ListCtrl to the full width.
8583    
8584     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8585     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8586     Grid.
8587     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8588     changes focus to the Selection when pressing "Alt-S".
8589    
8590     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8591     the text if not visible. The italic font sometimes exceeds the
8592     rendering area.
8593    
8594 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8595 jonathan 971
8596 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8597     to OnClose so that Thuban closes correctly.
8598    
8599     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8600     DockFrame.OnClose, not DockFrame._OnClose.
8601    
8602     2003-05-21 Jonathan Coles <[email protected]>
8603    
8604 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8605     references to 'inf' and use new Range __init__ to pass floats
8606     directly rather than converting them to strings first.
8607     Fixes RTBug #1876.
8608    
8609     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8610     Use new Range ___init__ to pass floats.
8611    
8612     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8613     filename is a valid image file. Throw IOError otherwise.
8614    
8615     * Thuban/Model/range.py: Brought over new Range from SciParam that
8616     is immutable and has an __init__ which can accept floats.
8617    
8618     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8619     into try block. AddLayer doesn't throw any exceptions anymore.
8620     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8621     try block.
8622    
8623     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8624     the first item in choices. Fixes RTBug #1882.
8625    
8626     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8627     has gone to 0 which is a serious problem. abort.
8628     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8629     print the error from GDAL.
8630    
8631     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8632     ToggleEventListeners to turn on listening.
8633     (TableGrid.ToggleEventListeners): New. Turns event listening on
8634     and off so as to prevent excessive messages.
8635     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8636     to suppress excessive messages when selecting many rows.
8637     Fixes RTBug #1880.
8638    
8639     * Thuban/UI/view.py: Added checks against if scale == 0. This
8640     is a serious problem that can occur when an image without
8641     geo data is loading and causes the map projection bounds to
8642     go to infinity. Right now, the solution is to simply try
8643     to recover.
8644    
8645     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8646     to set the MFILEReceiver attributes even if the data is NULL.
8647    
8648     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8649     and passed GDAL messages back up to the Python layer. Also
8650     tried to fix some memory leaks that were present in the original
8651     utility but didn't matter because the program aborted.
8652    
8653     * test/test_range.py: Copied over tests from SciParam. Removed
8654     tests against importing. Fixes RTBug #1867.
8655    
8656 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8657    
8658     * test/test_load.py: Remove unused imports and restructure the
8659     test code
8660     (LoadSessionTest): Split into one class for each test and turn
8661     LoadSessionTest itself into the base class for all such session
8662     tests.
8663     (ClassificationTest): New base class for load tests that test
8664     classifications
8665     (TestSingleLayer, TestLayerVisibility, TestClassification)
8666     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8667     for the individual tests
8668    
8669     * test/support.py (FileLoadTestCase.filename): New base class for
8670     file loading tests
8671    
8672 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8673    
8674     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8675     Mercator' to 'UTM Zone 32' as a more convenient example.
8676     Added 'Gauss Krueger Zone 6'.
8677    
8678     * Data/iceland_sample_raster.thuban: political polygon now
8679     filled transparent to have the raster image visible at once.
8680    
8681 frank 952 2003-05-21 Frank Koormann <[email protected]>
8682    
8683     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8684     OnClose() to keep in sync with extensions. Internally Thuban
8685     still uses "underscored" names.
8686    
8687 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8688    
8689     This puts back Raster layer support. These layers support projections
8690     through the GDAL library. Currently, the CVS version is being used.
8691     There are no Debian packages available although this may change soon.
8692     A GDAL driver was extended to support writing to memory rather to
8693     files.
8694    
8695     There is still some work that needs to be done, such as some error
8696     handling when loading invalid images or when there is a problem
8697     projecting the image. This putback simply checks in the majority
8698     of the work.
8699    
8700     * setup.py: Add gdalwarp library extension.
8701    
8702     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8703     Defaults to False, but can be overridden by subclasses if they
8704     support classification.
8705     (RasterLayer): New. Defines a new layer that represents an
8706     image.
8707    
8708     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8709     tag handler.
8710     (SessionLoader.start_layer): Encode the filename.
8711     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8712     New. Supports reading a rasterlayer tag.
8713    
8714     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8715    
8716     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8717     get a string in Latin1. If we get such as string convert it to
8718     unicode first, otherwise leave if alone before encoding.
8719     (SessionSaver.write_layer): Add support for writing both Layers
8720     and RasterLayers.
8721    
8722     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8723     The right argument may not be a string, it could also be a Column.
8724    
8725     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8726     Make initial window size 600x400. Fixes RTBug #1872.
8727    
8728     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8729     the dialog is constructed so that we can support layers that
8730     do not have classifications.
8731     (Classifier._OnTry): Only build a classification if the layer
8732     supports one.
8733    
8734     * Thuban/UI/legend.py: Change all checks that a layer is an
8735     instance of Layer into checks against BaseLayer.
8736     (LegendTree.__FillTreeLayer): Only add children to a branch if
8737     the layer supports classification.
8738    
8739     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8740     MainWindow.OpenSession): Don't proceed with an action if the
8741     user chooses Cancel when they are asked to save changes.
8742     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8743     user to select an image file. Create a new RasterLayer and add
8744     it to the map.
8745    
8746     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8747     for rendering RasterLayer layers.
8748     (MapRenderer.draw_raster_layer): Actually method that calls
8749     the GDALWarp python wrapper and constructs an image from the
8750     data returned.
8751    
8752     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8753     Choices symbols to match those used in the table query method.
8754     Replace deprecated method calls on table with new method names.
8755    
8756     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8757     how small the scale can get. This still needs more testing.
8758    
8759     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8760     Provides a driver to output in .bmp format.
8761    
8762     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8763     New. Provides IO routines which write to memory, rather than a file.
8764    
8765     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8766     of the gdalwarp utility provided in GDAL. Added function calls
8767     that can be accessed from python.
8768    
8769     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8770     a raster layer.
8771    
8772     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8773     layer image data.
8774    
8775     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8776    
8777     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8778     tests associated with the raster layer code.
8779    
8780     * test/test_transientdb.py
8781     (TestTransientTable.test_auto_transient_table_query): Added a test
8782     for using a Column object as the "right" parameter to a query.
8783    
8784 frank 924 2003-05-19 Frank Koormann <[email protected]>
8785    
8786 frank 927 * Thuban/version.py (get_changelog_date):
8787     Catch exceptions if ChangeLog does not exist.
8788    
8789     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8790    
8791     2003-05-19 Frank Koormann <[email protected]>
8792    
8793 frank 924 Extended version information for Thuban
8794    
8795     * Thuban/version.py: New, version information for Thuban: Last
8796     modification date and last ChangeLog entry date.
8797    
8798     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8799     information: Display Thuban, wxPython and Python version.
8800    
8801 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8802    
8803 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8804     __future__ import for nested_scopes as Thuban relies on Python 2.2
8805     now.
8806     (XMLWriter.encode): Remove the special case for a None argument.
8807     In the saver encode is always called with a string argument.
8808    
8809     2003-05-16 Bernhard Herzog <[email protected]>
8810    
8811 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8812     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8813     of the bug was that e.g. float("1.2") would fail. Thuban now
8814     requires 2.4.x.
8815    
8816 frank 917 2003-05-16 Frank Koormann <[email protected]>
8817    
8818     Printing enhancement and WMF export (under Win32)
8819    
8820     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8821     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8822     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8823     PrintRender.
8824    
8825     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8826     to fullfil information needed for PrinterRenderer.
8827     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8828     (MapCanvas.Print): Adapted to new MapPrintout.
8829     (OutputTransform): General calculations to transform from canvas
8830     coordinates to export/printing devices.
8831    
8832     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8833     new method_command to call ExportMap, with platform dependency (only
8834     __WXMSW__)
8835    
8836     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8837     of scalebar drawing area as new parameters.
8838    
8839     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8840    
8841     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8842     Update to extended scalebar.DrawScalebar header.
8843    
8844     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8845    
8846     * test/test_scalebar.py: Made test executable as standalone.
8847    
8848 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8849    
8850     * Thuban/Model/table.py (Table): Remove this compatibility alias
8851     for DBFTable.
8852    
8853     * test/test_table.py: Import DBFTable as Table because that alias
8854     doesn't exist anymore.
8855    
8856     * Thuban/UI/classgen.py: Remove some unused imports
8857    
8858 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8859    
8860     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8861     Fix docstring.
8862     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8863     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8864     values of the supplied range to determine the beginning and end
8865     bounds of the generated classes.
8866    
8867     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8868     do not have a leading 0 (.5 is now accepted as well as 0.5).
8869    
8870     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8871     call to ClassGenerator.GenUniformDistribution.
8872    
8873     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8874     layout bug with the 'Projection' label.
8875    
8876     * test/support.py (FloatTestCase): New. Needed for the Range tests.
8877    
8878     * test/test_range.py: New. Imported from SciParam.
8879    
8880 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
8881    
8882 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8883     to table.UniqueValues() with calls that retrieve all the values
8884     from the table. This will need to be replaced by a method on table
8885     which can simply return the list (perhaps more efficiently).
8886    
8887     2003-05-12 Jonathan Coles <[email protected]>
8888    
8889 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
8890     Refer to the documentation for details.
8891    
8892     * test/test_classgen.py: Modified Quantile tests to use the
8893     new return values.
8894    
8895     * Thuban/Model/classgen.py
8896     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8897     use new return values from CalculateQuantiles to produce the correct
8898     range bounds in the Classification.
8899     (ClassGenerator.CalculateQuantiles): Add more comments describing
8900     the return values and parameters. Make minor adjustments to improve
8901     the legibility of the code. Fix problem with adjusted not being set
8902     in most cases.
8903    
8904 frank 893 2003-05-12 Frank Koormann <[email protected]>
8905    
8906     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8907     and latin1. Fixes #1851 finally.
8908    
8909 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
8910    
8911 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
8912    
8913     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8914     Clean up debugging statement, add comments, fix a small bug in the
8915     returned adjusted percentiles.
8916    
8917     2003-05-09 Jonathan Coles <[email protected]>
8918    
8919 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
8920     and such ranges can now be saved and loaded from disk.
8921    
8922     Quantiles are now available in the Classification Generator.
8923    
8924     Initial support for building Queries on a table. Doesn't do anything
8925     but run some tests.
8926    
8927     * Thuban/Model/classification.py: Explicit imports.
8928     (ClassGroupRange): Use the Range class to store the underlying
8929     range information. The interface remains the same, except for
8930     GetRange(), and you can also supply a Range object as the min
8931     parameter to SetRange or __init__.
8932    
8933     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8934     string appropriately for use in Thuban. Fixes RTbug #1851.
8935     (SessionLoader.end_projection): Handle the context of the
8936     projection tag a bit better by looking at what objects are not
8937     None. There was an assumption that a projection tag for a map
8938     could occur before any layers.
8939     (SessionLoader.start_clrange): Provide backward compatibility for
8940     reading min/max values as well as the new range parameter.
8941    
8942     * Thuban/Model/map.py: Explicit imports.
8943    
8944     * Thuban/Model/resource.py: Import _.
8945     (ProjFileSaver.write): write header using projfile.dtd.
8946    
8947     * Thuban/Model/save.py: Explicit imports.
8948     (XMLWriter.encode): New. Encode the given string from a format
8949     used by Thuban into UTF-8. Fixes RTbug #1851.
8950    
8951     * Thuban/UI/classgen.py: Explicit imports.
8952     (ClassGenDialog.__init__): Clean up the code and add support
8953     for Quantiles.
8954     (ClassGenDialog.OnOK): Add support for Quantiles.
8955     (GenQuantilesPanel): New. Input panel for Quantiles.
8956     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8957     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8958    
8959     * Thuban/Model/classgen.py: New. Contains all the classes named above.
8960    
8961     * Thuban/UI/classifier.py: Explicit imports.
8962     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8963     ClassTable.SetValueAsCustom): Reworked to use new Range class.
8964    
8965     * Thuban/UI/legend.py: Explicit imports.
8966    
8967     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8968     a Table menu and associated method calls.
8969     (MainWindow.choose_color): Removed. No longer needed.
8970    
8971     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8972     should be disabled if no projection is selected in the available
8973     list.
8974    
8975     * Thuban/UI/renderer.py: Explicit imports.
8976    
8977     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8978     with correctly selecting the rows and issuing the right events.
8979     Be sure to call Skip() to allow the grid to do some of its own
8980     handling which allows the rows to actually be selected.
8981     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8982     selecting multiple shapes.
8983     (LayerTableFrame): Support for building Queries.
8984     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8985    
8986     * Thuban/UI/tree.py: Explicit imports.
8987    
8988     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8989     table view can call it.
8990    
8991     * test/test_classification.py: Explicit imports.
8992     (TestClassification.test_ClassGroupRange): Fix test for new
8993     Range class.
8994    
8995     * Doc/thuban.dtd: Add range parameter for clrange.
8996    
8997     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8998     object in ClassGroupRange, and also uesd for inputting ranges in
8999     the classifer table and elsewhere.
9000    
9001     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
9002     yet.
9003    
9004 frank 872 2003-05-09 Frank Koormann <[email protected]>
9005    
9006     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
9007    
9008 frank 860 2003-05-08 Frank Koormann <[email protected]>
9009    
9010 frank 870 Coding style updates
9011    
9012     * test/test_scalebar.py: Replaced tab indentation by spaces.
9013    
9014     * Thuban/UI/scalebar.py: Explicit imports.
9015    
9016     2003-05-08 Frank Koormann <[email protected]>
9017    
9018 frank 867 * Thuban/UI/scalebar.py
9019     (ScaleBar.DrawScalebar): Format string bug fixed.
9020    
9021     2003-05-08 Frank Koormann <[email protected]>
9022    
9023 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
9024    
9025     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
9026     (deriveInterval):
9027     Calculate scalebar interval and unit which fits in width for scale.
9028     (roundInterval): Round float.
9029    
9030     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9031    
9032     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9033    
9034     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9035    
9036     2003-05-08 Frank Koormann <[email protected]>
9037    
9038 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9039     Initialize ScaleBar with canvas.map
9040    
9041     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9042     round intervals to display smarter lengths
9043     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9044     layer. If the maps has no projection applied grey the scalebar.
9045    
9046 frank 857 2003-05-07 Frank Koormann <[email protected]>
9047    
9048     Basic Scalebar features added.
9049    
9050     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9051    
9052     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9053     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9054     and the renderer.
9055    
9056     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9057    
9058     * Thuban/UI/messages.py: SCALE_CHANGED added.
9059    
9060 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9061    
9062 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9063     variable shapestores to hold a list of all open shapestore objects
9064     (Session.ShapeStores): New. Accessor method for the shapestores
9065     list.
9066     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9067     Internal methods to maintain the shapestores list.
9068     (Session.Tables): New. Return all tables open in the session.
9069     (Session.OpenShapefile): Insert the new ShapeStore into the
9070     shapestores list.
9071    
9072     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9073     tests for ShapeStores and Tables
9074     (TestSessionWithContent.test_shape_stores)
9075     (TestSessionWithContent.test_tables): New. Test cases for
9076     ShapeStores and Tables
9077    
9078     2003-05-07 Bernhard Herzog <[email protected]>
9079    
9080 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9081     Add comments about the optimizations used.
9082     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9083     Implement the ReadValue table interface method.
9084    
9085     * test/test_transientdb.py
9086     (TestTransientTable.run_iceland_political_tests)
9087     (TestTransientTable.test_transient_joined_table): Add tests for
9088     ReadValue
9089    
9090 frank 848 2003-05-07 Frank Koormann <[email protected]>
9091    
9092     * Resources/Bitmaps/fulllayerextent.xpm,
9093     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9094     new icons.
9095    
9096 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9097    
9098 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9099     New. Simply delegate to the transient table's version.
9100    
9101     * test/test_transientdb.py
9102     (TestTransientTable.test_auto_transient_table_query): New. Test
9103     case for AutoTransientTable's SimpleQuery
9104    
9105     2003-05-06 Bernhard Herzog <[email protected]>
9106    
9107 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9108     Implement a simple query method for the query dialog
9109     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9110     the row index or shapeid.
9111     (TransientTable.create): Insert the right value of the row index
9112     (TransientJoinedTable.create): Copy the row index of the left
9113     table to the joined result table
9114    
9115     * test/test_transientdb.py
9116     (TestTransientTable.test_transient_table_read_twice): Fix
9117     doc-string
9118     (TestTransientTable.test_transient_table_query): New. Test for the
9119     SimpleQuery method
9120    
9121     2003-05-06 Bernhard Herzog <[email protected]>
9122    
9123 bh 840 Convert all table users to use the new table interface. This only
9124     covers Thuban itself, not GREAT-ER or other applications built on
9125     Thuban yet, so the compatibility interface stays in place for the
9126     time being but it now issues DeprecationWarnings.
9127    
9128     Finally, the new Table interface has a new method, HasColumn.
9129    
9130     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9131     issue deprecation warnings when they're. The warnings refer to the
9132     caller of the method.
9133     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9134     for the deprecation warnings
9135    
9136     * test/test_table.py: Ignore the deprecation warnings for the old
9137     table in the tests in this module. The purpose of the tests is to
9138     test the old interface, after all.
9139    
9140     * test/test_transientdb.py
9141     (TestTransientTable.run_iceland_political_tests): Use the
9142     constants for the types. Add a test for HasColumn
9143     (TestTransientTable.test_transient_joined_table): Adapt to new
9144     table interface. Add a test for HasColumn
9145     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9146     table interface
9147    
9148     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9149     Adapt to new table interface
9150    
9151     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9152     new table interface
9153    
9154     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9155     (RecordTable.SetTable): Adapt to new table interface
9156    
9157     * Thuban/UI/classifier.py (Classifier.__init__)
9158     (Classifier.__init__): Adapt to new table interface
9159    
9160     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9161     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9162     to new table interface
9163    
9164     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9165     (AutoTransientTable.HasColumn): Implement the new table interface
9166     method
9167     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9168     (AutoTransientTable.UniqueValues): Adapt to new table interface
9169    
9170     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9171     Adapt to new table interface
9172    
9173     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9174     simplify opening shapefiles a bit easier.
9175     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9176     (TestLayer.test_point_layer): Use the new helper method
9177     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9178     method
9179    
9180     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9181     the new table method
9182    
9183     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9184     Test for the new table method HasColumn
9185    
9186 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9187    
9188     Addresses the "Selection Extent" wish of RTbug #1787.
9189    
9190     * Resources/Bitmaps/fulllayerextent.xpm,
9191     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9192     extent. These are just place holders for the real bitmaps.
9193    
9194     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9195     calculate the bounding box once (the first time compute_bbox() is
9196     called).
9197     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9198     the bounding box for the shapes in lat/long coordinates.
9199    
9200     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9201     option.
9202     (MainWindow.has_selected_shapes): New. Returns true if there are
9203     any selected shapes.
9204     (MainWindow.FullSelectionExtent): New. Calls
9205     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9206     (_has_selected_shapes): New. Returns true if there are any
9207     selected shapes.
9208    
9209     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9210     true if there are any selected shapes.
9211    
9212     * Thuban/UI/view.py (MapCanvas): Added delegated method
9213     HasSelectedShapes.
9214     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9215     shapes on the canvas using the map projection (if any).
9216    
9217     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9218     for Layer.ShapesBoundingBox().
9219    
9220 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9221    
9222     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9223    
9224 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9225    
9226     Addresses the "Full Layer Extent" wish of RTbug #1787.
9227    
9228     * Resources/Projections/defaults.proj: Added UK National Grid.
9229    
9230     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9231     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9232     when the user selects the menu option.
9233    
9234     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9235     scales the given layer on the canvas using the map projection.
9236    
9237 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9238    
9239     Convert the table implementations to a new table interface. All
9240     tables use a common mixin class to provide backwards compatibility
9241     until all table users have been updated.
9242    
9243     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9244     provide backwards compatibility for table classes implementing the
9245     new interface
9246     (DBFTable, MemoryTable): Implement the new table interface. Use
9247     OldTableInterfaceMixin as base for compatibility
9248     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9249     and MemoryTable resp.
9250    
9251     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9252     the new table interface.
9253    
9254     * test/test_memory_table.py: New. Test cases for the MemoryTable
9255     with the new table interface.
9256    
9257     * test/test_table.py: Document the all tests in this file as only
9258     for backwards compatibility. The equivalent tests for the new
9259     interface are in test_memory_table.py and test_dbf_table.py
9260     (MemoryTableTest.test_read): field_info should be returning tuples
9261     with four items
9262     (MemoryTableTest.test_write): Make doc-string a more precise.
9263    
9264     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9265     table interface. Derive from from OldTableInterfaceMixin for
9266     compatibility.
9267     (TransientTableBase.create): New intance variable column_map to
9268     map from names and indices to column objects
9269     (TransientTable.create): Use the new table interface of the input
9270     table
9271     (AutoTransientTable): Convert to new table interface. Derive from
9272     from OldTableInterfaceMixin for compatibility.
9273     (AutoTransientTable.write_record): Removed. It's not implemented
9274     yet and we still have to decide how to handle writing with the new
9275     table and data framework.
9276    
9277     * test/test_transientdb.py
9278     (TestTransientTable.run_iceland_political_tests)
9279     (TestTransientTable.test_transient_joined_table): Use the new
9280     table interface
9281    
9282 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9283    
9284     This is namely a collection of UI updates to improve user interactivity.
9285     Tabbing between controls now exists and you can use ESC to close dialog
9286     boxes; ENTER will active the default button.
9287    
9288     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9289     order that the controls are created so that tabbing works correctly.
9290     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9291     wxDialog can handle the default button correctly.
9292     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9293     same reasons as for OnOK.
9294     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9295     when we ask the table for the maximum/minimum values of a field
9296     which could take a very long time.
9297    
9298     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9299     order that the controls are created so that tabbing works correctly.
9300     (SelectPropertiesDialog.__init__): Rearrange the order that the
9301     controls are created so that tabbing works correctly.
9302    
9303     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9304     to derive from a wxDialog but behave like the original implementation
9305     which was derived from a wxFrame. wxDialog provides useful key
9306     handling functionality like ESC calling OnCancel and ENTER calling
9307     OnOK which is lost with wxFrame.
9308    
9309     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9310     new dialogs.
9311    
9312     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9313     order that the controls are created so that tabbing works correctly.
9314     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9315     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9316     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9317     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9318     can provide the "UK National Grid" as a default projection.
9319     (UTMPanel.__init__): Rearrange the order that the controls are
9320     created so that tabbing works correctly.
9321    
9322 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9323    
9324 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9325     (project_point): If a map projection but no layer projection is
9326     given, convert degrees to radians before applying the map
9327     projection.
9328    
9329 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9330     (TableGrid.allow_messages): New methods to make it possible to
9331     inhibit message sending.
9332     (TableGrid.issue): Only send the message if not inhibited.
9333     (LayerTableGrid.select_shape): Use the new methods to make sure
9334     that no ROW_SELECTED message is sent while we're updating the
9335     selected rows to match the selected shapes.
9336    
9337 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9338    
9339     Implementation of MemoryTable.
9340    
9341     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9342     implementation that operates on a list of tuples. All of the data
9343     are kept in the memory.
9344    
9345     * test/test_table.py (MemoryTableTest): New.
9346    
9347     * test/test_transientdb.py (SimpleTable): Removed.
9348     (TestTransientTable.test_transient_joined_table,
9349     (TestTransientTable.test_transient_table_read_twice): Replaced
9350     SimpleTable by MemoryTable.
9351    
9352 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9353    
9354 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9355     for each of the layers.
9356    
9357     * Resources/Projections/defaults.proj: Geographic projection
9358     contains unit conversion parameter.
9359    
9360     2003-04-30 Jonathan Coles <[email protected]>
9361    
9362 jonathan 793 The most important part of this putback is the projection changes.
9363     It should now be possible to specify the projection that a layer
9364     is in and then specify a different projection for the map. The
9365     projection dialog has an extra parameter for a geographic projection
9366     which lets the user select if the input is in degrees or radians.
9367    
9368     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9369     to say that the parameter is a tuple of unprojected
9370     points (which is what the callers to this method were assuming).
9371     Also, since the points are unprojected we need to projected them.
9372    
9373     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9374     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9375     groups are selected, move the layer up/down. Fixes RTbug #1833.
9376    
9377     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9378    
9379     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9380     parameter in call to SetClientData.
9381     (GeoPanel): Add support for selecting the units that the
9382     source data is in (Radians or Degrees).
9383    
9384     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9385     the rendering loop by reducing the number of if's, removing the
9386     unnecessary try/except block, and checking if the old group
9387     is the same as the new one (which happens a lot if there is
9388     no classification, or lots of shapes are in the same group).
9389    
9390     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9391     around the redraw routine to try to catch problems that the user
9392     may create by selecting invalid projections for the data set and
9393     map. Clears the display if there are any problems and prints the
9394     error.
9395     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9396     rectangle.
9397    
9398     * extensions/thuban/wxproj.cpp (project_point): First invert the
9399     supplied point (which should be in projected coordinates) using
9400     the layer's projection and then project the point using the
9401     map's projection.
9402     (project_points): Use project_point() to project each point.
9403    
9404 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9405    
9406     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9407     don't set the Classification to None if the classfication field
9408     is None (ie only a DEFAULT).
9409    
9410 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9411    
9412 bh 790 * Thuban/UI/view.py: Fix some typos.
9413    
9414 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9415     not pop up the dialog if the selection becomes empty (this could
9416     happen if e.g. a new selection is opened while the identify tool
9417     is active and dialog had been closed)
9418    
9419     2003-04-30 Bernhard Herzog <[email protected]>
9420    
9421 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9422     instance variable read_record_last_result
9423     (TransientTableBase.read_record): Make sure reading the same
9424     record twice works. The implementation uses the new instance
9425     variable read_record_last_result
9426    
9427     * test/test_transientdb.py
9428     (TestTransientTable.test_transient_table_read_twice): New test
9429     case for the above bug-fix.
9430    
9431 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9432    
9433     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9434    
9435     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9436    
9437     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9438     (ClassTable.SetValueAsCustom): Rename keyword argument in
9439     ClassGroup* constructors to match argument name.
9440    
9441 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9442    
9443     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9444     transient DB if it exists to make sure it doesn't leave a journal
9445     file in the temp directory.
9446    
9447     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9448     self.conn to None after closing the connection to make sure it's
9449     not closed twice
9450    
9451 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9452    
9453 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9454     "true". If anything other than "false" is specified we also assume
9455 jonathan 776 "true". Addresses RTbug #1025.
9456 jonathan 769
9457     * Doc/thuban.dtd: Add visible parameter to a layer.
9458    
9459     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9460     of visible from 1 to True.
9461     (Layer.__init__): Change default value of visible from 1 to True.
9462    
9463     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9464     parameter.
9465    
9466     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9467     parameter.
9468    
9469     * test/test_load.py: Add new test data contents_test_visible.
9470     (LoadSessionTest.setUp): save test data.
9471     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9472     is loaded correctly.
9473    
9474     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9475     for saving an invisible layer.
9476    
9477     2003-04-29 Jonathan Coles <[email protected]>
9478    
9479 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9480     legend dialog box and tell it to change its map to the one
9481     supplied to SetMap(). Fixes RTbug #1770.
9482    
9483 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9484    
9485 bh 766 Next step of table implementation. Introduce a transient database
9486     using SQLite that some of the data is copied to on demand. This
9487     allows us to do joins and other operations that require an index
9488     for good performance with reasonable efficiency. Thuban now needs
9489     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9490     haven't tested that.
9491    
9492     * Thuban/Model/transientdb.py: New. Transient database
9493     implementation.
9494    
9495     * test/test_transientdb.py: New. Tests for the transient DB
9496     classes.
9497    
9498     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9499     classes to help automatically remove temporary files and
9500     directories.
9501     (Session.__init__): New instance variables temp_dir for the
9502     temporary directory and transient_db for the SQLite database
9503     (Session.temp_directory): New. Create a temporary directory if not
9504     yet done and return its name. Use AutoRemoveDir to have it
9505     automatically deleted
9506     (Session.TransientDB): Instantiate the transient database if not
9507     done yet and return it.
9508    
9509     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9510     AutoTransientTable so that data is copied to the transient DB on
9511     demand.
9512     (SimpleStore): New class that simply combines a table and a
9513     shapefile
9514    
9515     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9516     DBFTable and update its doc-string to reflect the fact that this
9517     is only the table interface to a DBF file. Table is now an alias
9518     for DBFTable for temporary backwards compatibility.
9519    
9520     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9521     the last reference to the session goes away so that the temporary
9522     files are removed properly.
9523    
9524     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9525     reference to the session to make sure the temporary files are
9526     removed.
9527    
9528     2003-04-29 Bernhard Herzog <[email protected]>
9529    
9530 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9531     the __parser instance variable into a normal local variable in
9532     read. It's only used there and read will never be called more than
9533     once. Plus it introduces a reference cycle that keeps can keep the
9534     session object alive for a long time.
9535    
9536 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9537 jonathan 735
9538 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9539     Projection an immutable item. Fixes RTbug #1825.
9540     (Projection.__init__): Initialize instance variables here.
9541     (ProjFile.Replace): New. Replace the given projection object with
9542     the new projection object. This solves the problem of needing the
9543     mutator Projection.SetProjection() in the ProjFrame class and
9544     allows a projection to change parameters without changing its
9545     location in the file.
9546    
9547     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9548     be of type wxSAVE and should verify overwriting a file.
9549    
9550     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9551     ProjFile.Replace() method instead of the mutator
9552     Projection.SetProjection(). Also requires that we reassign the
9553     client data to the new projection.
9554    
9555     * test/test_proj.py (TestProjection.test): Test GetName() and
9556     GetAllParameters()
9557     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9558     for Replace().
9559    
9560     2003-04-25 Jonathan Coles <[email protected]>
9561    
9562 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9563     to save the name of the projection.
9564    
9565     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9566     test to verify layer projections are saved correctly.
9567    
9568     2003-04-25 Jonathan Coles <[email protected]>
9569    
9570 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9571     to "Unknown" if name is None.
9572     (Projection.SetAllParameters): New. Set the projection's
9573     parameter list to the one supplied.
9574     (Projection.SetProjection): New. Set the projection's
9575     properties to those of the supplied Projection.
9576    
9577     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9578     the dialog title to include the map's title.
9579     (MainWindow.LayerProjection): Set the dialog title to include
9580     the layer's title.
9581    
9582     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9583     error dialogs into a single method call.
9584     (ProjFrame.__VerifyButtons): Add more states to check.
9585     (ProjFrame.__GetProjection): Return the current state of an
9586     edited projection or None.
9587     (ProjFrame.__FillAvailList): Remove checks for states that
9588     shouldn't exist.
9589     (ProjFrame._OnNew): Clear all selected items and supply
9590     a projection panel if necessary.
9591    
9592     * test/test_proj.py (TestProjFile.test): Add tests for
9593     ProjFile.SetAllParameters, ProjFile.SetProjection,
9594     ProjFile.SetName.
9595    
9596     2003-04-25 Jonathan Coles <[email protected]>
9597    
9598 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9599     takes an optional argument to select the current projection.
9600     This does not guarantee that the item is visible due to
9601     limited wxWindows functionality. Fixes RTBug #1821.
9602    
9603     2003-04-25 Jonathan Coles <[email protected]>
9604    
9605 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9606     the projection name and use it when constructing the Projection
9607     object.
9608    
9609     * Thuban/Model/proj.py (Projection.__init__): Change the default
9610     value for 'name' to None and then test if name is equal to None
9611     in the body of the constructor. This way the caller doesn't have to
9612     know what the default value should be. Namely, useful in load.py
9613     where we have to pick a default value if the 'name' parameter
9614     doesn't exist in the XML file.
9615    
9616     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9617     Tests a file where a layer has a projection.
9618    
9619     2003-04-25 Jonathan Coles <[email protected]>
9620    
9621 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9622     tree for projection information.
9623    
9624     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9625     XMLReader.GetFileName.
9626     (SessionLoader): Added support for loading projection tags that
9627     appear inside a layer.
9628    
9629     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9630     back to using a list because the order of the projections in
9631     the file is important to maintain. Fixes RTbug #1817.
9632    
9633     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9634     to ProjFile.GetFilename.
9635    
9636     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9637     information.
9638    
9639     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9640     ProjFrame._OnSaveAs. Removed old dead code from previous
9641     implementation.
9642     (ProjFrame._OnExport): Add support for exporting more than one
9643     projection to a single file.
9644     (ProjFrame.__FillAvailList): use string formatting (% operator)
9645     to build strings that are (partly) translated. Fixes RTbug #1818.
9646    
9647     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9648     class.
9649    
9650 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9651    
9652     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9653    
9654     * po/fr.po: New. French translation by Daniel Calvelo Aros
9655    
9656     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9657     empty strings.
9658    
9659 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9660 jonathan 724
9661     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9662     implement the interface that the ProjFrame dialog expects.
9663    
9664     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9665     name of the projection to be changed.
9666     (ProjFile): Use a dictionary instead of a list so that removing
9667     projections is easier and we are sure about uniqueness.
9668     (ProjFile.Remove): Remove the given projection object.
9669    
9670     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9671     Return a list with only one projection file instead of searching for
9672     any projection file. This simplifies many things if the user can
9673     only have one system file and one user file.
9674    
9675     * Thuban/UI/classgen.py: Change all references to
9676     genCombo to genChoice.
9677    
9678     * Thuban/UI/mainwindow.py: Add a Projection option under the
9679     layer menu.
9680     (MainWindow.LayerProjection): New. Open up a projection window
9681     for a layer.
9682    
9683     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9684     laid out. Use three panels instead of one. One for the list of
9685     projections, one for the edit controls, and one for the buttons.
9686     Fixed resizing problems so that the dialog resizes correctly
9687     when the projection panel changes. Added import/export, save, and
9688     new buttons/functionality.
9689    
9690 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9691    
9692     First step towards table management. Introduce a simple data
9693     abstraction so that we replace the data a layer uses more easily
9694     in the next step.
9695    
9696     * Thuban/Model/data.py: New file with a simple data abstraction
9697     that bundles shapefile and dbffile into one object.
9698    
9699     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9700     open shapefiles and return a shape store object
9701    
9702     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9703     object instead of a shapefile filename. This introduces a new
9704     instance variable store holding the datastore. For intermediate
9705     backwards compatibility keep the old instance variables.
9706     (open_shapefile): Removed. No longer needed with the shape store.
9707     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9708     get the shape store used by a layer.
9709     (Layer.Destroy): No need to explicitly destroy the shapefile or
9710     table anymore.
9711    
9712     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9713     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9714     open shapefiles
9715    
9716     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9717     session's OpenShapefile method to open shapefiles
9718    
9719     * test/test_classification.py
9720     (TestClassification.test_classification): Use the session's
9721     OpenShapefile method to open shapefiles and build the filename in
9722     a more platform independed way
9723    
9724     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9725     Implement to have a session to use in the tests
9726     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9727     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9728     session's OpenShapefile method to open shapefiles
9729     (TestLayerLegend.setUp): Instantiate a session so that we can use
9730     it to open shapefiles.
9731     (TestLayerLegend.tearDown): Make sure that all references to
9732     layers and session are removed otherwise we may get a resource
9733     leak
9734    
9735     * test/test_map.py (TestMapAddLayer.test_add_layer)
9736     (TestMapWithContents.setUp): Instantiate a session so that we can
9737     use it to open shapefiles.
9738     (TestMapWithContents.tearDown): Make sure that all references to
9739     layers, maps and sessions are removed otherwise we may get a
9740     resource leak
9741     ("__main__"): use support.run_tests() so that more info about
9742     uncollected garbage is printed
9743    
9744     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9745     session's OpenShapefile method to open shapefiles
9746     ("__main__"): use support.run_tests() so that more info about
9747     uncollected garbage is printed
9748    
9749     * test/test_selection.py (TestSelection.tearDown): Make sure that
9750     all references to the session and the selection are removed
9751     otherwise we may get a resource leak
9752     (TestSelection.get_layer): Instantiate a session so that we can
9753     use it to open shapefiles.
9754     ("__main__"): use support.run_tests() so that more info about
9755     uncollected garbage is printed
9756    
9757     * test/test_session.py (TestSessionBase.tearDown)
9758     (TestSessionWithContent.tearDown): Make sure that all references
9759     to the session and layers are removed otherwise we may get a
9760     resource leak
9761     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9762     method to open shapefiles
9763    
9764 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9765    
9766     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9767     if the file_or_filename object had the 'read' attribute.
9768    
9769 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9770    
9771 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9772     (ReadProjFile): Add documentation about which exceptions are raised.
9773     Always pass the exceptions up to the caller.
9774     (GetProjFiles): If the directory can't be read return an empty list.
9775     If any of the proj files can't be read skip that file and go
9776     on to the next one.
9777    
9778     * test/test_proj.py: Added test cases to handle nonexistent files,
9779     unreadable files, and files that don't parse correctly.
9780    
9781     2003-04-23 Jonathan Coles <[email protected]>
9782    
9783 jonathan 716 Projection dialog. Allows the user to select from a list
9784     of projection templates and optionally edit them and save new ones.
9785    
9786     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9787     (ProjPanel): Base class for projection specific panels.
9788     (TMPanel): Projection panel for Transverse Mercartor.
9789     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9790     (LCCPanel): Projection panel for Lambert Conic Conformal.
9791     (GeoPanel): Projetion panel for Geographic Projection.
9792    
9793     2003-04-23 Jonathan Coles <[email protected]>
9794    
9795 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9796     promote symmetry. There now exists XMLReader and XMLWriter.
9797     (XMLReader.read): New. Call to read the given file descriptor or
9798     filename.
9799     (XMLReader.close): New. Make sure the file is closed.
9800     (XMLReader.GetFileName): New. Return just the file name that is being
9801     read from.
9802     (XMLReader.GetDirectory): New. Return just the directory of the file
9803     that is being read.
9804     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9805     the names of functions to call as the XML tree is parsed.
9806     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9807     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9808     (SessionLoader): Removed class variables start_dispatcher and
9809     end_dispatcher since this functionality is now part of a class
9810     instance. Fixes RTbug #1808.
9811     (SessionLoader.__init__): Add dispatcher functions.
9812     (load_xmlfile): Code was moved into the XMLReader.read().
9813     (load_session): Use modified SessionLoader.
9814    
9815     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9816     map's projection.
9817    
9818     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9819     GetAllParameters.
9820     (Projection.GetParameter): Returns the value for the given parameter.
9821    
9822     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9823     (GetProjFiles): Renamed from GetProjections. Now returns a list
9824     of ProjFile objects.
9825     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9826     a list of ProjFile objects whose files are not user defined.
9827     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9828     list of ProjFile objects whose files are user defined.
9829     (ProjFileReader): Extend new XMLReader.
9830    
9831     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9832     promote symmetry.
9833    
9834     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9835     control instead of a wxComboBox. wxChoice controls do not generate
9836     events as the uses highlights possible choices which fixes problems
9837     with resizing the dialog when the use selects an option.
9838    
9839     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9840     control instead of a wxComboBox.
9841    
9842     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9843     dialog.
9844    
9845     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9846     method.
9847    
9848 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9849    
9850 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9851     constants
9852    
9853 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9854     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9855    
9856 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9857    
9858 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9859     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9860     anymore.
9861     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9862     (Layer.ShapeType, Layer.Shape): No need to call
9863     self.open_shapefile since it's always called in __init__
9864    
9865 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9866     In wxPython 2.4 there's no need to extend MainLoop anymore since
9867     wxPython itself makes sure OnExit is called.
9868    
9869 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
9870    
9871 jonathan 693 Initial putback of projection management code. Includes new
9872     classes to read and write projection files. The current load
9873     and save classes were abstracted a bit so they could be reused.
9874     The Projection class was extended to provide new methods and
9875     have a name.
9876    
9877     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9878     general XML reading methods that were part of ProcessSession.
9879    
9880     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9881     name.
9882     (ProjFile): New. Represents a file that contains projection
9883     information.
9884    
9885     * Thuban/Model/resource.py: New. Contains general utilities
9886     for read and writing projection files.
9887    
9888     * Thuban/Model/save.py (XMLSaver): New. Contains all the
9889     general XML writing methods that were part of SessionSaver.
9890     (SessionSaver): Renamed from Saver.
9891    
9892     * test/test_proj.py: New test cases for the projection
9893     file read and write functions.
9894    
9895     2003-04-16 Jonathan Coles <[email protected]>
9896    
9897 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
9898     in the ClassGroup*.__repr__() methods so it is clearer when
9899     a value is a string and when it is a number.
9900    
9901     * test/test_load.py: Rework the classification test to test
9902     that we can load old files.
9903     (testLabels): Test a file where the groups have labels.
9904    
9905 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
9906    
9907     Safer implementation of the performance enhancements of the
9908     low-level renderer:
9909    
9910     * extensions/thuban/wxproj.cpp (extract_projection)
9911     (extract_pointer): Rename extract_projection to extract_pointer
9912     and redefine its purpose to return the pointer stored in a CObject
9913     returned by the object's cobject method. Update all callers.
9914     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9915     handling of these low-level parameters so that each s_draw_info
9916     instance is handled as a CObject at python level that also
9917     contains real references to the actual python objects which
9918     contain the values in the struct. Add free_draw_info as the
9919     destructor.
9920     (draw_polygon_shape): Add the py_draw_info parameter which must a
9921     cobject containing an s_draw_info pointer.
9922    
9923     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9924     method to instantiat the low-level render parameter
9925     (MapRenderer.draw_shape_layer): Use the new method. Remove some
9926     commented out code.
9927     (MapRenderer.draw_polygon_shape): Make the first parameter not the
9928     layer but the low-level render parameter
9929     (ScreenRenderer.draw_shape_layer): Use the low-level render
9930     parameter.
9931    
9932 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
9933    
9934 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
9935     the ClassGroup* classes to make debugging a bit easier.
9936     (ClassGroup.SetLabel): Check that the string is an instance
9937     of StringTypes not StringType. Accounts for Unicode strings.
9938    
9939     * Thuban/Model/color.py: Implemented __repr__ to make
9940     debugging a bit easier.
9941    
9942     * Thuban/Model/save.py (Saver.write_classification): Need to
9943     save the group label.
9944    
9945     * test/test_load.py (testClassification): New. Loads the
9946     iceland_sample_test.thuban file and checks if it was loaded
9947     correctly.
9948    
9949     2003-04-15 Jonathan Coles <[email protected]>
9950    
9951 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9952     to improve rendering performance by initializing the variables
9953     that are not change each time draw_polygon_shape() is called.
9954     The values are stored in a global struct draw_info.
9955     (draw_polygon_shape): Removed initialization code that is
9956     now in draw_polygon_init().
9957    
9958     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9959 jonathan 674 drawing initialization call to draw_polygon_init()
9960     (MapRenderer.draw_polygon_shape): Use new signature of
9961     draw_polygon_shape.
9962 jonathan 673
9963 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9964     weirdness by setting the range to (1, maxint).
9965 jonathan 673
9966 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
9967     instance variables private and optimize comparison operator
9968     by first checking if the color references are the same.
9969     (ClassGroupSingleton): Make instance variables private.
9970     (ClassGroupRange): Make instance variables private.
9971 jonathan 673
9972 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
9973    
9974 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
9975    
9976     First stab at internationalized messages:
9977    
9978     * Thuban/__init__.py (_): Implement the translation function for
9979     real using the python gettext module.
9980    
9981     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9982     translate empty strings.
9983    
9984     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9985     Add a missing space to a warning message
9986    
9987     * po/README: New. Notes about the management of the translation
9988     files.
9989    
9990     * po/Makefile: New. Makefile to help manage the translation files.
9991    
9992     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9993    
9994     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9995     translations and support files in po/
9996    
9997     * setup.py (data_files): Add the *.mo files to the data_files too
9998    
9999     * README: Add note about the translations when building from CVS
10000    
10001 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
10002    
10003     * Thuban/UI/dock.py: Fixes some window resizing problems most
10004     noticable under windows. Always assume the button bitmaps will
10005     be there. Code clean up.
10006     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
10007     images for the dock/undock button to the same images.
10008     Work around for RTbug #1801.
10009    
10010     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
10011     be allowed to grow within the sizer. Fixes a bug under Windows
10012     where the toolbar wasn't being drawn.
10013    
10014 frank 664 2003-04-14 Frank Koormann <[email protected]>
10015    
10016     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
10017     Updated design to try to make the button functionality more
10018     transparent.
10019    
10020 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
10021    
10022     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
10023     finalize the intialization of the panel.
10024    
10025     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
10026     creation of the panel. Should be the last thing called in the
10027     initializer of a subclass.
10028    
10029     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10030     set the current selections in the combo boxes. This is needed
10031     under Windows.
10032    
10033     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10034     level panel to the dialog so that the background colors are
10035     consistent under Windows.
10036    
10037 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10038    
10039 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10040     not black.
10041    
10042     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10043     the legend changes. Fixes RTbug #1793.
10044    
10045     * test/test_classification.py: Added test for copying of
10046     classifications.
10047    
10048     2003-04-11 Jonathan Coles <[email protected]>
10049    
10050 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10051     such as bitmaps.
10052    
10053     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10054     added images to the move buttons, added 'reverse' button.
10055     (CustomRampPanel.__init__): Added images to the move buttons.
10056     (GreyRamp): New. Generates a ramp from white to black.
10057     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10058    
10059     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10060     ID_PROPERTY_*.
10061     (Classifier.__init__): Minor changes to the layout.
10062     (Classifier._OnTitleChanged): Listen for when the user edits the
10063     title and update the dialog's title and the layer's title.
10064    
10065     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10066    
10067     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10068     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10069     if the layer's title changes.
10070    
10071     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10072     to open a dialog to rename the map.
10073     (MainWindow): Use new resource class to import bitmaps.
10074    
10075     2003-04-11 Jonathan Coles <[email protected]>
10076    
10077 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10078 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10079     Resources/Bitmaps/group_use_none.xpm,
10080     Resources/Bitmaps/group_use_not.xpm,
10081     Resources/Bitmaps/hide_layer.xpm,
10082     Resources/Bitmaps/layer_properties.xpm,
10083     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10084     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10085     New.
10086 jonathan 646
10087 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10088    
10089 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10090     Should pass group to ClassGroup constructor.
10091    
10092     2003-04-10 Jonathan Coles <[email protected]>
10093    
10094 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10095     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10096     here. Implement SetVisible(), IsVisible().
10097     (ClassGroup.__init__): Add group parameter which acts as a copy
10098     constructor.
10099    
10100     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10101     "Visible" check boxes.
10102     (Classifier): Rename the buttons and refactor the code to match
10103     the new labels.
10104    
10105     * Thuban/UI/legend.py: Classify button is now called "Properties".
10106     Refactored the code to change variable names.
10107     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10108    
10109     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10110     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10111     renamed to MainWindow.LayerEditProperties.
10112     (MainWindow.ToggleLegend): Don't include map name in legend title.
10113     (MainWindow.SetMap): Added the map name to the window title.
10114     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10115     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10116     Functionality is found in the layer properties dialog.
10117    
10118     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10119     draw visible groups.
10120    
10121 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10122    
10123 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10124     addition and selection of new color schemes.
10125     (MonochromaticRamp): New. Generates a ramp between two colors.
10126     (RedRamp): New. Generates a ramp of all red.
10127     (GreenRamp): New. Generates a ramp of all green.
10128     (BlueRamp): New. Generates a ramp of all blue.
10129    
10130     2003-04-09 Jonathan Coles <[email protected]>
10131    
10132 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10133     Need to copy over field and fieldType attributes.
10134    
10135     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10136     maximum and minimum values over the entire table for a given
10137     field.
10138     (Table.GetUniqueValues): New. Retrieve all the unique values
10139     in the table for a given field.
10140    
10141     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10142     (GenUniquePanel): New. Controls to allow the user to select
10143     which unique field values they would like in the classification.
10144     (CustomRampPanel): Code that was in ClassGenDialog that allows
10145     the user to select the properties for a custom ramp.
10146     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10147    
10148     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10149     (Classifier._SetClassification): Callback method so that the
10150     class generator can set the classification in the grid.
10151     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10152     editing of a group properties class into a wxWindows control.
10153    
10154     * Thuban/UI/dock.py: It was decided that if the user closes
10155     a dockable window the window should simply hide itself. That
10156     way if the user wants to show the dock again it appears in the
10157     same place as it was when it was closed.
10158     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10159     (DockableWindow._OnButtonClose): Hide the window instead of
10160     destroying it.
10161     (DockableWindow._OnClose): Hide the window instead of
10162     destroying it.
10163    
10164     * Thuban/UI/legend.py (LegendTree): Use a private method to
10165     consistently set the font and style of the text. Fixes RTbug #1786.
10166    
10167     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10168    
10169 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10170    
10171 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10172     to the map module
10173    
10174     2003-04-07 Bernhard Herzog <[email protected]>
10175    
10176 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10177     favor of ToggleSessionTree
10178     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10179     the session tree.
10180     (MainWindow.SessionTreeShown): New method to return whether the
10181     session tree is currently shown.
10182     (MainWindow.ToggleLegend): New method to toggle visibility of the
10183     legend
10184     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10185     LegendShown
10186     (MainWindow.LegendShown): New method to return whether the legend
10187     is currently shown.
10188     (_method_command): Add checked parameter so we can define check
10189     menu items
10190     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10191     mainwindow methods.
10192     (show_session_tree, show_legend commands): Removed.
10193     (toggle_session_tree, toggle_legend commands): New commands to
10194     toggle the visibility of the dialogs
10195    
10196 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10197    
10198 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10199    
10200     * Thuban/UI/dock.py: Fix Windows problem.
10201    
10202     * Thuban/UI/mainwindow.py: Use False instead of false.
10203     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10204    
10205     2003-04-07 Jonathan Coles <[email protected]>
10206    
10207 jonathan 612 Since we now say that the order of the groups in a classification
10208     matters, it makes sense to be able to manipulate that order. Most
10209     of the changes to Thuban/Model/classification.py are to that end.
10210    
10211     * Thuban/Model/classification.py (Classification.AppendGroup,
10212     Classification.InsertGroup, Classification.ReplaceGroup,
10213     Classification.RemoveGroup, Classification.GetGroup): Do as the
10214     names imply.
10215     (Classification.FindGroup): This was called GetGroup, but GetGroup
10216     takes an index, while FindGroup takes a value.
10217     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10218     REFERENCE. Currently there is a cyclic reference between the layer
10219     and its classification. If the classification doesn't need to know
10220     its owning layer we can change this, since it may make sense to be
10221     able to use the same classification with different layers.
10222    
10223     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10224    
10225     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10226     not AddGroup()
10227    
10228     * Thuban/UI/classifier.py: Now that we can depend on the order in
10229     a Classification and have methods to manipulate that order we don't
10230     need to use our own data structures in the grid. We can simply make
10231     the grid/table access the information they need from a copy of
10232     the classification object.
10233     (Classifier._OnCloseBtn): Event handler for when the user clicks
10234     'Close'. This is needed so if the user applies changes and then
10235     continues to change the table the user has the option of discarding
10236     the most recent changes and keeping what they applied.
10237    
10238     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10239     into the same group.
10240    
10241     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10242     with a really old version of proj, PJ_VERSION won't even be defined.
10243     If it isn't defined then just compile so that the function always
10244     returns Py_False.
10245    
10246     * test/test_classification.py: Fix tests to use the renamed methods.
10247     Still need to write tests for the new methods.
10248    
10249 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10250 jonathan 608
10251 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10252     call to SetSelection out of the method and before the call
10253     to __SelectField in __init__. This prevents a recursion of events
10254     when _OnFieldSelect is triggered by the user.
10255    
10256     2003-04-04 Jonathan Coles <[email protected]>
10257    
10258 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10259     Color.Transparent.
10260     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10261     Don't bother copying the color, since Colors are immutable.
10262    
10263     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10264     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10265     Thuban/UI/renderer.py, Thuban/UI/view.py:
10266     Rename Color.None to Color.Transparent.
10267    
10268     * test/test_classification.py, test/test_load.py: Rename Color.None
10269     to Color.Transparent.
10270    
10271     2003-04-04 Jonathan Coles <[email protected]>
10272 jonathan 603
10273     * Thuban/Model/classification.py: Fix assert calls.
10274     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10275     Copy the color parameter rather than hold onto a reference.
10276 jonathan 601
10277 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10278     the color object.
10279     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10280     are sure there exists only one refernce to Color.None in the system.
10281     This allows us to use 'is' rather than the comparision functions.
10282    
10283     * Thuban/Model/save.py: Fix assert calls.
10284    
10285     * Thuban/UI/classifier.py: Fix assert calls.
10286     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10287     dialog to edit the groups properties.
10288     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10289     correctly if a cell is resized.
10290     (ClassTable.SetClassification): New. Changes the classification
10291     that is in the table.
10292     (ClassTable.__SetRow): Allow groups to be prepended.
10293     (Classifier): New code for opening the EditProperties and
10294     GenerateRanges dialogs.
10295     (SelectPropertiesDialog.__GetColor): Only set the color in the
10296     color dialog if the current color is not None.
10297    
10298     * Thuban/UI/dock.py: Fix assert calls.
10299    
10300     * Thuban/UI/legend.py: Fix assert calls.
10301    
10302     * Thuban/UI/renderer.py: Fix assert calls.
10303    
10304     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10305     classifications.
10306     (GenRangePanel): Panel specific to range generation.
10307     (GenSingletonPanel): Panel specific to singleton generation.
10308     (ClassGenerator): Class responsible for actually generating
10309     the classification from the data gathered in the dialog box.
10310     (PropertyRamp): Generates properties whose values range from
10311     a starting property to an ending property.
10312 jonathan 601
10313 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10314    
10315     * test/support.py (print_garbage_information): New function that
10316     prints information about still connected messages and memory
10317     leaks.
10318     (run_suite): Removed.
10319     (run_tests): New function for use as a replacement of
10320     unittest.main in the test_* files. This one calls
10321     print_garbage_information at the end.
10322    
10323     * test/runtests.py (main): Use support.print_garbage_information
10324    
10325     * test/test_layer.py: Use support.run_tests instead of
10326     unittest.main so we get memory leak information
10327     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10328     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10329     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10330     to fix a memory leak.
10331    
10332     * test/test_classification.py: Use support.run_tests instead of
10333     unittest.main so we get memory leak information
10334     (TestClassification.test_classification): Call the layer's Destroy
10335     method to fix a memory leak.
10336    
10337 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10338    
10339 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10340     Handle the reference counts of the return value and errors in
10341     PyArg_ParseTuple correctly.
10342    
10343 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10344     sure the filename is absolute to avoid problems when saving the
10345     session again
10346    
10347 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10348    
10349 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10350    
10351 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10352 jonathan 587 that there actually are points in the returned list of points
10353     before trying to index into the list. The list may be empty if
10354     the shape is a Null Shape.
10355    
10356 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10357    
10358     * test/test_map.py: Don't use from <module> import *
10359    
10360 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10361    
10362     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10363     LAYER_LEGEND_CHANGED
10364    
10365     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10366     self.Destroy() to close the window after yesterday's changes.
10367    
10368     * test/test_map.py, test/test_session.py: Fix messages that
10369     are sent from maps and layers.
10370    
10371 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10372    
10373     * Thuban/UI/classifier.py: Commented out some debugging statements.
10374     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10375     RTbug #1769.
10376    
10377     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10378     position (although position doesn't work yet under GTK).
10379     (DockableWindow.Destroy): New. Called when the window must be
10380     closed. Namely needed when the DockFrame closes and must close
10381     its children.
10382     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10383    
10384     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10385     when then window is told to close.
10386     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10387     comment in source for more info.
10388    
10389     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10390    
10391     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10392     symmetry with other such methods.
10393     (MainWindow.ShowLegend): Show the legend docked by default.
10394    
10395 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10396    
10397     * Thuban/UI/classifier.py: Support for highlighting a specific
10398     group within the grid when the classification dialog is opened.
10399     Also contains a lot of debugging printouts which will later
10400     be removed.
10401    
10402     * Thuban/UI/dock.py: Complete rework on the dock code so that
10403     that it is fairly removed from the rest of the Thuban application.
10404     It is easy to add new docks which the rest of the program having
10405     to be aware of them.
10406    
10407     * Thuban/UI/legend.py: Modifications to support selecting a
10408     specific group in the classification dialog. Changed how layers
10409     are drawn when the layer is visible/invisible.
10410    
10411     * Thuban/UI/mainwindow.py: Removed legend specific code and
10412     replaced it with calls to the new dock code.
10413    
10414     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10415     to check if scale > 0. Trying to track down a divide by zero.
10416    
10417 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10418    
10419 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10420     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10421     now part of DockableWindow.
10422     (LegendPanel.DoOnSelChanged): Select the current layer in the
10423     map.
10424     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10425     with the selected layer and/or group.
10426    
10427     2003-03-26 Jonathan Coles <[email protected]>
10428    
10429 jonathan 557 This putback contains the code for dockable windows. There is
10430     no support in wxWindows as of this date for windows that can
10431     attach themselves to other windows.
10432    
10433     The current model contains a DockableWindow which has a parent
10434     window for when it is detached and a dock window that it puts
10435     its contents in when it is docked. The contents of a DockableWindow
10436     must be a DockPanel. DockPanel itself derives from wxPanel.
10437    
10438     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10439     message, not a LAYER_LEGEND_CHANGED message.
10440    
10441     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10442    
10443     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10444     as one of the style properties for the fieldTypeText item to
10445     be sure that its size is correct when the text changes.
10446    
10447     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10448     DockableWindow.
10449    
10450     * Thuban/UI/legend.py: Added some more buttons and made the
10451     LegendPanel a DockPanel.
10452    
10453     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10454     and supporting functions for manipulating the sashes.
10455     (MainWindow.ShowLegend): Create a DockableWindow with the
10456     LegendPanel as the contents.
10457    
10458     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10459    
10460     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10461     not LAYER_LEGEND_CHANGED, messages.
10462    
10463 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10464    
10465     * setup.py: Added custom script bdist_rpm_build_script so that
10466     when the rpm is built the path to wx-config is correct.
10467    
10468     * setup.cfg: Added line saying to use the custom build script
10469    
10470 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10471    
10472     Initial implementation of the Legend.
10473    
10474     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10475     Legend information and allows the user to add/modify classifications
10476     and how the layers are drawn on the map.
10477    
10478     * setup.py: New command 'build_docs' which currently uses
10479     happydoc to generate html documentation for Thuban.
10480    
10481     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10482     Returns a string which is appropriately describes the group.
10483    
10484     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10485     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10486    
10487     * Thuban/Model/map.py (Map): Rename messages and use new, more
10488     specific, messages.
10489    
10490     * Thuban/Model/messages.py: New message to indicate that a layer's
10491     data has changed (LAYER_CHANGED). New map messages to indicate
10492     when layers have been added/removed/changed or if the stacking order
10493     of the layers has changed.
10494    
10495     * Thuban/Model/session.py: Rename and use new messages.
10496    
10497     * Thuban/UI/classifier.py: Remember if any changes have actually
10498     been applied so that if the dialog is cancelled without an application
10499     of changes we don't have to set a new classification.
10500     (ClassDataPreviewer): Pulled out the window specific code and put it
10501     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10502     symbols on any DC.
10503    
10504     * Thuban/UI/mainwindow.py: New code to open the legend.
10505    
10506     * Thuban/UI/view.py: Use new message names.
10507    
10508 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10509    
10510     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10511     of Python, wxPython, and some other libraries.
10512    
10513     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10514     version against what wxproj was compiled with.
10515     (check_version_gtk): If wxproj was compiled with gtk then check
10516     the given version against the version of the gtk library
10517     currently being used.
10518    
10519 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10520    
10521     * test/test_command.py: Run the tests when the module is run as a
10522     script
10523    
10524     2003-03-14 Bernhard Herzog <[email protected]>
10525    
10526     Implement selection of multiple selected shapes in the same layer:
10527    
10528     - Introduce a new class to hold the selection. This basically
10529     replaces the interactor which was nothing more than the
10530     selection anyway. A major difference is of course that the new
10531     selection class supports multiple selected shapes in one layer
10532    
10533     - Move the object that represents the selection from the
10534     application to the canvas. The canvas is a better place than the
10535     application because the selection represents which shapes and
10536     layer of the map displayed by the canvas are selected and
10537     affects how the map is drawn.
10538    
10539     - Make the selection and its messages publicly available through
10540     the mainwindow.
10541    
10542     - The non-modal dialogs do not get a reference to the interactor
10543     anymore as they can simply refer to their parent, the
10544     mainwindow, for the what the interactor had to offer.
10545    
10546     * Thuban/UI/selection.py: New module with a class to represent the
10547     selection.
10548    
10549     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10550     these unused messages
10551    
10552     * Thuban/UI/application.py (ThubanApplication.OnInit)
10553     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10554     interactor is gone now.
10555     (ThubanApplication.CreateMainWindow): There is no interactor
10556     anymore so we pass None as the interactor argument for now for
10557     compatibility.
10558    
10559     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10560     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10561     Unsubscribe, delegate messages according to the delegated_messages
10562     class variable.
10563     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10564     attributes from instance variables as described with the
10565     delegated_methods class variable.
10566     (MapCanvas.__init__): New instance variable selection holding the
10567     current selection
10568     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10569     pass them on to the renderer
10570     (MapCanvas.SetMap): Clear the selection when a different map is
10571     selected.
10572     (MapCanvas.shape_selected): Simple force a complete redraw. The
10573     selection class now takes care of only issueing SHAPES_SELECTED
10574     messages when the set of selected shapes actually does change.
10575     (MapCanvas.SelectShapeAt): The selection is now managed in
10576     self.selection
10577    
10578     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10579     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10580     Unsubscribe, delegate messages according to the delegated_messages
10581     class variable.
10582     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10583     attributes from instance variables as described with the
10584     delegated_methods class variable.
10585     (MainWindow.__init__): The interactor as ivar is gone. The
10586     parameter is still there for compatibility. The selection messages
10587     now come from the canvas.
10588     (MainWindow.current_layer, MainWindow.has_selected_layer):
10589     Delegate to the the canvas.
10590     (MainWindow.LayerShowTable, MainWindow.Classify)
10591     (MainWindow.identify_view_on_demand): The dialogs don't need the
10592     interactor parameter anymore.
10593    
10594     * Thuban/UI/tableview.py (TableFrame.__init__)
10595     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10596     (LayerTableFrame.row_selected): The interactor is gone. It's job
10597     from the dialog's point of view is now done by the mainwindow,
10598     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10599     of SELECTED_SHAPE
10600    
10601     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10602     is gone. It's job from the dialog's point of view is now done by
10603     the mainwindow, i.e. the parent.
10604    
10605     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10606     gone. It's job from the dialog's point of view is now done by the
10607     mainwindow, i.e. the parent.
10608    
10609     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10610     gone. It's job from the dialog's point of view is now done by the
10611     mainwindow, i.e. the parent.
10612     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10613     stored as self.mainwindow. The mainwindow is need so that the tree
10614     can still subscribe to the selection messages.
10615     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10616     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10617     selection is now accessible through the mainwindow. Subscribe to
10618     SHAPES_SELECTED instead of SELECTED_SHAPE
10619    
10620     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10621     SHAPES_SELECTED message now.
10622     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10623     so deal with multiple shapes
10624     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10625     gone. It's job from the dialog's point of view is now done by the
10626     mainwindow, i.e. the parent.
10627    
10628     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10629     parameter is now a list of shape ids.
10630     (RecordTable.SetTable): The second parameter is now a list of
10631     indices.
10632    
10633     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10634     selected_shape parameter and ivar to selected_shapes. It's now a
10635     list of shape ids.
10636     (MapRenderer.draw_label_layer): Deal with multiple selected
10637     shapes. Rearrange the code a bit so that the setup and shape type
10638     distinctions are only executed once.
10639    
10640     * test/test_selection.py: Test cases for the selection class
10641    
10642 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10643    
10644     * Thuban/Model/load.py: Temporary fix so that the xml reader
10645     doesn't cause Thuban to crash.
10646    
10647     * Thuban/Model/layer.py: Handle the cyclic references between
10648     a layer and its classification better, and be sure to disconnect
10649     the classification from the layer when the layer is destroyed
10650     so that we don't maintain a cyclic reference that may not be
10651     garbage collected.
10652    
10653     * Thuban/Model/classification.py: See comment for layer.py.
10654    
10655 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10656    
10657     * HOWTO-Release: New. Information on the steps for releasing
10658     a new version of Thuban.
10659    
10660 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10661    
10662     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10663     Use True instead of true.
10664     (Classifier): Should have a single panel in which all the controls lie.
10665    
10666     * Thuban/UI/proj4dialog.py: Add normal border.
10667    
10668     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10669    
10670     * Thuban/UI/mainwindow.py: Use True instead of true.
10671    
10672     * setup.py: Update some definitions to use wxWindows2.4 files
10673    
10674     * Data/iceland_sample_class.thuban: Fixed file so that the
10675     field_type information is present.
10676    
10677 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10678    
10679 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10680     field type label grow so that when the text changes the
10681     size is updated correctly. This may be a wxWindows bug.
10682    
10683     2003-03-10 Jonathan Coles <[email protected]>
10684    
10685 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10686     SESSION_REPLACED.
10687    
10688     * Thuban/UI/classifier.py: Wrap text with _().
10689     (ClassGrid.CreateTable): Set dimensions and size hints here,
10690     instead of in Reset, so we only set the size once.
10691    
10692     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10693    
10694     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10695     Call Close() instead of Shutdown().
10696    
10697     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10698    
10699     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10700     Go back to using OnClose() instead of Shutdown().
10701    
10702     2003-03-10 Jonathan Coles <[email protected]>
10703    
10704 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10705     to know the old field index as well as the new one.
10706    
10707     2003-03-10 Jonathan Coles <[email protected]>
10708    
10709 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10710     to correctly set the table information and call this from
10711     __init__ and from _OnFieldSelect so that all the information
10712     is up to date when the dialog opens and when a field is changed.
10713    
10714     2003-03-10 Jonathan Coles <[email protected]>
10715    
10716 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10717     layer's message function directly, use the ClassChanged() method
10718     when then classification changes. SetField/SetFieldType/SetLayer
10719     must keep the information about field name and field type in
10720     sync when an owning layer is set or removed.
10721    
10722     * Thuban/Model/layer.py: Added ClassChanged() so that the
10723     classification can tell the layer when its data has changed.
10724     (Layer.SetClassification): Accepts None as an arguement to
10725     remove the current classification and correctly handles
10726     adding a new classification.
10727    
10728     * Thuban/Model/load.py: Comment out print statement
10729    
10730     * test/test_classification.py, test/test_save.py: New and
10731     improved tests.
10732    
10733 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10734    
10735     * Thuban/Model/classification.py: Implemented __copy__ and
10736     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10737     they can easily be copied by the classifier dialog.
10738     (ClassGroupProperites.__init__): The default line color should
10739     have been Color.Black.
10740    
10741     * Thuban/UI/classifier.py: Setting and Getting table values now
10742     uses a consistent set of functions.
10743     (Classifier): Now non-modal. Has field type label which changes
10744     as the field changes. Keep track of buttons in a list so that
10745     we can enable/disable the buttons when the None field is selected.
10746     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10747    
10748     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10749     does what OnClose did, but can be called by the application to
10750     close a window. Needed when a session changes, and we have to
10751     close the classifier windows.
10752    
10753     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10754     Shuts down open dialogs. Used when a new session is created
10755     or a session is opened.
10756     (MainWindow.SaveSession): Should only call application.SaveSession()
10757     if we don't call SaveSessionAs first.
10758     (MainWindow.Classify): Allow different classifier dialogs for
10759     different layers.
10760    
10761     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10762     the parent class handle it. Add Shutdown() to unsubscibe from
10763     event notification and call the parent Shutdown(). This was
10764     necessary so the application can close the tree window.
10765    
10766 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10767    
10768     * Thuban/Model/classification.py: Minor documentation changes,
10769     Addition of __eq__ and __ne__ methods.
10770     (Classification.SetLayer): prevent recursion between this method
10771     and Layer.SetClassification().
10772    
10773     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10774    
10775     * Thuban/Model/layer.py (SetClassification): prevent recursion
10776     between this method and Classification.SetLayer().
10777    
10778     * test/test_classification.py, test/test_load.py,
10779     test/test_session.py: Fixed and added tests for the classification
10780     classes.
10781    
10782 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10783    
10784     * Thuban/UI/classifier.py (ClassGrid.__init__)
10785     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10786     CreateTable because otherwise it triggers an assertion in
10787     wxPython/wxGTK 2.4.
10788    
10789 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10790    
10791 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10792 jonathan 471
10793 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10794 jonathan 471
10795 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10796 jonathan 471
10797 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10798 jonathan 471
10799     2003-03-05 Jonathan Coles <[email protected]>
10800    
10801 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10802     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10803     Store just the groups in the table and generate the other
10804     column information when it is requested. Add "None" field
10805     to pull-down to select no classification.
10806    
10807     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10808     (Str2Num): Only catch ValueError exceptions.
10809    
10810     * Thuban/Model/classification.py: Class documentation. Renaming
10811     of methods with Stroke to Line. Groups are stored in a single
10812     list with the default as the first element. Groups are searched
10813     in the order they appear in the list.
10814    
10815     * Thuban/Model/color.py: Documentation.
10816    
10817     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10818     the kind of data represented by a field.
10819    
10820     * Thuban/Model/load.py (ProcessSession): Use proper string
10821     conversion function; fixes RTbug #1713.
10822    
10823     * Thuban/Model/save.py (Saver): Store field type information.
10824    
10825     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10826     (Table): Add field_info_by_name() to retrieve field information
10827     by specifying the field name, not the number.
10828    
10829     * Thuban/UI/mainwindow.py: Function name changes.
10830    
10831     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10832     get the layer classification once. Don't try to classify
10833     values when the field is None: just use the default properties.
10834    
10835     * Thuban/UI/view.py: Function name changes.
10836    
10837     * Doc/thuban.dtd: Add field_type attribute to a classification.
10838    
10839 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10840    
10841 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10842     the fill and stroke layer attributes optional with suitable
10843     default values. Add the stroke_width layer attribute. Use correct
10844     syntax for empty elements. Make the attribute list for labels
10845     refer to the label element.
10846    
10847     2003-03-04 Bernhard Herzog <[email protected]>
10848    
10849 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10850     Python 2.3 containing some of the functionality we implement in
10851     setup.py ourselves.
10852    
10853     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10854     before the selection mode. Doing it the other way round triggers
10855     an assertion in wxWindows.
10856    
10857     * Thuban/Model/save.py (escape): Fix typo in doc-string
10858    
10859     * Thuban/Model/classification.py: Remove unnecessary wxPython
10860     import
10861    
10862 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10863    
10864     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10865     Parameter 'value' should default to None.
10866    
10867     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10868     the class attribute __classification is now private.
10869    
10870     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10871     Classifier to ClassGrid. Added support for removing selected rows,
10872     which including code for keeping track of when cells are selected,
10873     and deselected.
10874     (ClassTable): Support for added/removing rows. Fixed a problem
10875     with __ParseInput whereby it would not allow strings (only numbers)
10876     to be entered.
10877     (Classifier): Added button and supporting code for removing
10878     selected rows.
10879    
10880 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
10881 jonathan 434
10882     * Thuban/common.py: Moved color conversion functions into
10883     Thuban/UI/common.py.
10884     (Str2Num): Now converts the float (not the string) to a long/int
10885     so that an exception isn't thrown.
10886    
10887     * Thuban/UI/common.py: Common functions used in several UI modules
10888    
10889     * Thuban/Model/classification.py: Changed the class hierarchy
10890     so that a Classification consists of Groups which return
10891     Properties when a value matches a Group.
10892    
10893     * Thuban/Model/layer.py: Fixed name resolution problem.
10894    
10895     * Thuban/Model/load.py: Use new Classification and Group functions.
10896    
10897     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10898     failure.
10899     (Saver.write_classification): Use new Classification and Group
10900     functions.
10901    
10902     * Thuban/UI/classifier.py: Changes to use new Classification and Group
10903 jonathan 445 functions. Fix to create a tuple with a single value instead of
10904     simply returning the value.
10905 jonathan 434
10906     * Thuban/UI/renderer.py: Use new Classification and Group functions.
10907     Use common.py functions.
10908    
10909 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
10910 jonathan 447
10911     * test/test_classification.py: Use new Classification and Group
10912     classes.
10913 jonathan 434
10914 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
10915    
10916     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10917     functions from Thuban color objects to wxWindow colour objects.
10918    
10919     * Thuban/Model/classification.py (Classification): Renamed
10920     GetProperties() to GetClassData(). Used the new iterator
10921     in TreeInfo().
10922     (ClassIterator): Iterator implementation to iterate over the
10923     ClassData objects in a classification object.
10924    
10925     * Thuban/Model/save.py (Saver.write_classificaton): Uses
10926     the new iterator to save the classification information.
10927    
10928     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10929     for changing the stroke and fill colors and previewing the
10930     changes.
10931    
10932     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10933     MainWindow.SaveSessionAs): Text string changes so the dialogs
10934     have more meaningful titles.
10935    
10936     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10937     Classification method name from GetProperties to GetClassData.
10938    
10939     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10940     instead of accessing now non-existent class variables.
10941    
10942 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
10943    
10944     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10945     unneeded Shape() call. Rendering is substantially faster without
10946     it and it avoids some problems with broken shape files.
10947    
10948 frank 423 2003-02-20 Frank Koormann <[email protected]>
10949    
10950     Force minimal size of identify and label dialogs. The autosizing
10951     looked too ugly.
10952    
10953     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10954     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10955     Set size of listctrl.
10956     * Thuban/UI/identifyview.py (IdentifyView.__init__):
10957     Set size of dialog.
10958    
10959 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
10960    
10961     * test/test_classification.py, test/test_layer.py,
10962     test/test_load.py, test/test_map.py, test/test_session.py:
10963     Updated the tests to use the new functions that are in the
10964     respective classes.
10965    
10966     * Thuban/Model/classification.py (Classification):
10967     Uses the new ClassData* classes. Modification messages are
10968     passed up to the parent layer (if it exists).
10969     (ClassData): New class to encapsulate the common data in each
10970     classification property.
10971     (ClassDataDefault): Represents the Default class. data.
10972     (ClassDataPoint): Represents a single class. data point
10973     (ClassDataRange): Represents a class. range
10974     (ClassDataMap): Represents a class. map (unused).
10975    
10976     * Thuban/Model/color.py: Added Color.None to represent something
10977     with no color. Color.Black represents the color black.
10978     (NoColor): Helper class derived from Color to represent something
10979     with no color.
10980    
10981     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10982     stroke_width attributes. Made the 'classification' attribute private.
10983     New methods for setting/getting the classification.
10984    
10985     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10986     to get the classifcation and use the new ClassData* classes to
10987     hold the classification data. Use Str2Num to convert numbers
10988     properly.
10989    
10990     * Thuban/Model/save.py (Saver): Use new Color and Classification
10991     methods
10992    
10993     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10994     custom grid.
10995     (ClassTable): Support for editing Values and Labels and for
10996     changing what type (point or range) of data is stored in each
10997     property based on how the user enters the data.
10998     (Classifier): Support for saving the new classifications and
10999     launching the dialog to edit a property.
11000     (SelectPropertiesDialog): New class for editing the visual
11001     properties of a classification (stroke color, width, and fill color)
11002     (ClassPreviewer): Took the Draw method from ClassRenderer and
11003     made most of it into this new class. Intend to use this class in
11004     the SelectPropertiesDialog for previewing changes.
11005    
11006     * Thuban/UI/renderer.py: Use new Color and Classification methods.
11007    
11008     * Thuban/UI/tree.py: Formatting changes.
11009    
11010     * Doc/thuban.dtd: Add 'label' element
11011    
11012     * Thuban/common.py: New. Contains common routines used throughout
11013     the code.
11014     (Str2Num): Takes a string and converts it to the "best" type of
11015     number.
11016    
11017 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
11018    
11019     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
11020     dragging flag is always set to 0 even when the tool implementation
11021     raises an exception
11022    
11023 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
11024    
11025     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
11026     method to create a splash screen.
11027     (ThubanApplication.ShowMainWindow): New. Show the main window.
11028     Needed so the splash screen can display the mainwindow
11029     (ThubanApplication.OnInit): Call the
11030     new splash_screen method to determine whether the application
11031     should display a splash screen. If it displays a splash screen do
11032     not immediately show the main window.
11033    
11034 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11035    
11036     * Thuban/Model/classification.py: Added import line to fix
11037     feature conflicts between running on python2.2 and python2.1.
11038    
11039     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11040     onto the clinfo parameter, so removed the deepcopy().
11041    
11042 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11043    
11044 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11045 jonathan 396 Added element_open variable to track opening and closing of tags
11046     so that tags that don't span more than one line are closed with
11047     /> instead of </tag_name>. Use the GetDefault*() methods of
11048     the Classification class.
11049    
11050     * Thuban/Model/classification.py (Classificaton): Added set and
11051     get methods for the default data. The class also takes a layer
11052     reference so that modification messages can be sent. Fixed the
11053     methods to use the new ClassData class.
11054     (ClassData): New class to encapsulate the classification data
11055    
11056     * Thuban/Model/layer.py (Layer): Remove the
11057 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11058 jonathan 396 SetDefault*() methods on the layer's classification object.
11059 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11060 jonathan 396 Classification class.
11061    
11062     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11063     object instead of a dictionary.
11064    
11065 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11066 jonathan 396 draw the classifications in the dialog box's table.
11067     (Classifier): Modified to use the ClassRenderer class.
11068    
11069 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11070     methods of the Classification class.
11071 jonathan 396
11072     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11073     of the ClassData class.
11074    
11075     * test/test_classification.py, test/test_layer.py,
11076     test/test_map.py, test/test_session.py: Fix the tests to work
11077     with the above code changes.
11078    
11079 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11080    
11081     * Thuban/Model/classification.py (Classification): Added getNull()
11082     to return the NullData reference
11083    
11084     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11085     Layer.SetStrokeWidth): Modified these functions to change the
11086     null data in the classification rather than keep these values
11087     directly in the Layer class. Menu options to change these values
11088     work again.
11089    
11090 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11091    
11092 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11093 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11094 jonathan 380 classification data.
11095    
11096 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11097     Colors in the tree view.
11098    
11099     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11100     the tree info for classifications. Commented out unnecessary lines.
11101    
11102     * Thuban/Model/classification.py (Classification.TreeInfo): New
11103     function to add information about the classification into the
11104     tree view.
11105    
11106 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11107 jan 375
11108 tkoester 403 * Thuban/__init__.py (_): New.
11109 jan 375
11110     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11111     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11112 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11113     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11114     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11115     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11116     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11117     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11118 jan 375
11119 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11120    
11121 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11122 jonathan 370
11123 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11124     a layer classification. Supports specific data points and
11125     ranges.
11126 jonathan 370
11127 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11128     information.
11129 jonathan 370
11130 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11131     information.
11132 jonathan 370
11133 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11134     specifying classification information.
11135 jonathan 370
11136 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11137     dialog.
11138 jonathan 370
11139 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11140     classification information.
11141 jonathan 370
11142 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11143     classification data.
11144 jonathan 370
11145 tkoester 403 * test/test_classification: Tests for the Classification class.
11146 jonathan 370
11147 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11148    
11149 bh 361 * test/test_command.py: New. Tests for the command classes.
11150    
11151 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11152     (Command.IsTool): New method to distinguish between command
11153     switching tools and other commands.
11154    
11155     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11156     the tool to avoid direct assignments to instance variables
11157     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11158     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11159     change the tool
11160    
11161     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11162     active tool's command turns insensitive, disable the tool.
11163     (_tool_command): Use the new ToolCommand class
11164    
11165     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11166     SelectTool method to change the tool
11167     (iconfile): Use the ToolCommand class
11168    
11169 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11170    
11171     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11172     the case of selected items that are not children of Layers or Maps
11173     properly. Previously this bug would trigger an assertion in
11174     wxWindows.
11175    
11176 frank 352 2002-11-06 Frank Koormann <[email protected]>
11177    
11178 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11179     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11180     Full Extent).
11181 tkoester 403
11182 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11183    
11184     * setup.py (setup call): version now 0.1.3
11185    
11186     * MANIFEST.in: Add the files in test/
11187    
11188     * test/README: Add note about tests requiring the iceland data
11189    
11190     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11191     copyright notice.
11192    
11193 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11194    
11195     * test/test_map.py
11196     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11197     epsilon.
11198    
11199     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11200     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11201     message if the assertion fails and don't return the return value
11202     of self.assert_. In assertFloatSeqEqual the return meant that not
11203     all items of the sequence were compared.
11204    
11205 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11206    
11207 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11208    
11209     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11210    
11211 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11212     the string with the bounding box on the fly because of platform
11213     differences in the way %g is handled.
11214    
11215     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11216     DBFfile too because Thuban layers can't yet cope missing DBF
11217     files.
11218    
11219     2002-09-20 Bernhard Herzog <[email protected]>
11220    
11221 bh 326 * test/test_menu.py: Use initthuban instead of
11222     add_thuban_dir_to_path to initialize Thuban.
11223    
11224     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11225     Mixin class for float comparisons
11226     (SubscriberMixin): New. Mixin class to test messages sent through
11227     the Connector class
11228    
11229     * test/README: Fix a typo and add the -v flag to the command for
11230     individual tests
11231    
11232 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11233    
11234     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11235    
11236     * test/test_map.py: New. Test cases for Thuban.Model.map
11237    
11238     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11239    
11240     * test/test_label.py: New. Test cases for Thuban.Model.label
11241    
11242     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11243    
11244     * test/test_color.py: New. Test cases for Thuban.Model.color
11245    
11246     * test/test_base.py: New. Test cases for Thuban.Model.base
11247    
11248 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11249    
11250     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11251     the CHANGED channel too.
11252    
11253     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11254     CHANGED channel too.
11255     (Map.__init__): Call the Modifiable constructor as well.
11256    
11257     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11258     event if the modified flag changes.
11259     (Modifiable.changed): Tweak the doc-string.
11260    
11261     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11262     (MainWindow.set_position_text): Put the code that puts the text
11263     with the mouse position into the status bar into the new method
11264     set_position_text so that it can overwritten in derived classes.
11265    
11266 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11267    
11268     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11269     message box on the main window.
11270    
11271 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11272    
11273     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11274     the 'E' because it's less likely to interfere with other menu
11275     entries.
11276 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11277 bh 313
11278 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11279    
11280     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11281     (_tool_command): Add sensitive parameter
11282     (_has_visible_map): Sensitivity callback to tools and other
11283     commands that require a visible map. Use it in map_zoom_in_tool,
11284     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11285     and map_full_extent
11286    
11287 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11288    
11289     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11290     VIEW_POSITION
11291    
11292 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11293 frank 306
11294     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11295    
11296 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11297    
11298 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11299     wxWindows already and our implementation doesn't work correctly
11300     with wxGTK 2.3:
11301     (MapCanvas.__init__): Remove the instance variable
11302     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11303     be drawin
11304     (MapCanvas.OnIdle): Removed.
11305    
11306 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11307     a parameter to determine the size of the rectangle.
11308     (MapCanvas.find_shape_at): Create the box around the point on a
11309     layer by layer basis and make the size depend on the shape type.
11310     This solves a problem with the selection of point shapes at the
11311     border of the layer's bounding box
11312    
11313 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11314    
11315 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11316     for the sensitivity of remove layer.
11317     (_can_remove_layer): New. Sensitivity callback for remove layer
11318     (Command layer_remove): Use _can_remove_layer
11319    
11320     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11321     determine whether a given layer can be deleted.
11322    
11323 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11324     (MapCanvas.do_redraw): Get rid of the unused update_region
11325     instance variable
11326    
11327 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11328    
11329 bh 292 * test/: new subdirectory with a bunch of unit tests.
11330    
11331     * test/README, test/test_table.py, test/test_save.py,
11332     test/test_menu.py, test/test_load.py: Initial set of tests and
11333     brief instructions on how to run them
11334    
11335 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11336    
11337 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11338     arcs with multiple parts.
11339    
11340 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11341     Handle degenrate rectangles.
11342    
11343 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11344     (Table.__init__): Keep track of whether the DBF is open for
11345     writing
11346     (Table.write_record): Open the DBF file for writing when necessary
11347    
11348 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11349    
11350     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11351     dbf files only for reading by default. Use a new writable dbf
11352     object for writing.
11353    
11354 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11355    
11356 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11357     (MainWindow.Context): New method to return a context
11358     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11359     new method
11360    
11361 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11362     layer table specific code from TableGrid into LayerTableGrid
11363     (TableFrame, LayerTableFrame): Split the layer table specific code
11364     from TableFrame into LayerTableFrame
11365 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11366 bh 278
11367     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11368     LayerTableFrame
11369    
11370 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11371    
11372     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11373     absolute filename.
11374    
11375 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11376    
11377 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11378     records.
11379 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11380 bh 275
11381     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11382     into the underlying table.
11383    
11384     * extensions/shapelib/shapefil.h (DBFCommit),
11385     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11386     commit any changes made to the DBF file.
11387    
11388 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11389     (_tool_command): Put the code that generates the "checked"
11390     callback into a separate function so that we can reuse it
11391     elsewhere
11392    
11393 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11394     session into an XML file. The main reason to introduce a class is
11395     that applications built on Thuban can derive from it so that they
11396     can save additional information in a session file.
11397     (save_session): Delegate almost all the work to the Saver class.
11398     Rename the filename argument to file because it may be a file like
11399     object now.
11400    
11401     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11402     code. Remove the little test code which would be executed when the
11403     module is run as a script which didn't work anymore since it can't
11404     import the other Thuban modules.
11405     (ProcessSession, load_session): Refactor the ProcessSession to
11406     have one method for each element start and end tag so that derived
11407     classes can easily override the processing of individual tags.
11408     Also, always parse with namespaces enabled because applications
11409     built on top of Thuban will likely use namespaces if they extend
11410     the session file format.
11411    
11412 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11413    
11414     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11415     because thubaninit_contents will do it for us.
11416    
11417 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11418 jan 265
11419     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11420     tree window already open
11421    
11422 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11423    
11424 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11425     with self.
11426    
11427     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11428     when we have actually captured it.
11429    
11430 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11431     shapefile and destroy the table.
11432    
11433     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11434    
11435 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11436    
11437 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11438     instance variable columns
11439     (RecordTable.GetTypeName): row and col may be negative in some
11440     cases.
11441    
11442 bh 254 * setup.py (InstallLocal.initialize_options)
11443     (InstallLocal.finalize_options, InstallLocal.user_options): New
11444     option create-init-file to build a thubaninit.py when running
11445     install_local
11446     (InstallLocal.run): Create the thubaninit.py module when requested
11447     (thubaninit_contents): Split the template into several parts and
11448     create a new function thubaninit_contents that creates the
11449     contents of a thubaninit module.
11450     (ThubanInstall.run): Use the new function to create the thubaninit
11451     module.
11452    
11453 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11454    
11455     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11456     cleanup.
11457     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11458    
11459     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11460     direct base class' Destroy method.
11461    
11462     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11463     layers.
11464     (Map.Destroy): Destroy the label_layer as well and call the
11465     inherited Desatroymethod first so that no more messages are
11466     issued.
11467     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11468     message if the stacking order actually has changed. Add
11469     doc-strings.
11470     (Map.BoundingBox): Correct the doc-string.
11471     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11472     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11473    
11474     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11475     all labels.
11476    
11477 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11478    
11479     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11480     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11481     to a layer's channels into separate methods.
11482     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11483     (Map.Destroy): Unsubscribe from a layer's channels before
11484     destroying it.
11485    
11486     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11487     selected_layer parameter to searched_layer which is the layer to
11488     search in.
11489     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11490     search to that layer. Return the selected layer and shape.
11491    
11492     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11493     typo
11494    
11495 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11496    
11497 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11498     Extend the doc string.
11499     (ThubanApplication.subscribe_session)
11500     (ThubanApplication.unsubscribe_session): New methods to
11501     subscribe/unsubscribe to/from session channels.
11502     (ThubanApplication.SetSession): Call the new methods here.
11503     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11504     Renamed set_map to maps_changed. Its now a subscriber for
11505     MAPS_CHANGED.
11506    
11507     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11508     x-coordinate in case of simple clicks
11509    
11510     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11511     don't pass it as a parameter
11512    
11513     * Thuban/Model/session.py (Session.RemoveMap): New
11514    
11515 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11516     window size into a parameter.
11517    
11518 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11519    
11520 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11521     just commands.
11522    
11523 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11524     parameter list a bit to allow setting the window title and the
11525     initial message in the status bar. Update the callers.
11526    
11527     * Thuban/UI/application.py (ThubanApplication.OnInit)
11528     (ThubanApplication.CreateMainWindow): Put the mainwindow
11529     instantiation into a separate method so that it can be overridden
11530     by a subclass.
11531    
11532 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11533    
11534 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11535     another changed message is issued to make it easier to get
11536     notified of changes.
11537     (Session): Update the doc string
11538     (Session.forward): Issue changed-events as CHANGED as well.
11539     (Session.changed): Overwrite the inherited version to issue
11540     CHANGED events as well.
11541    
11542     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11543     CHANGED channel to be informed of changes.
11544     (SessionTreeCtrl.session_channels): Not needed any longer.
11545 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11546 bh 234 Only have to (un)subscribe CHANGED
11547    
11548     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11549    
11550 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11551     for the wxPython locale bug to __init__.py so that it's
11552     automatically executed by anybody using UI code from Thuban.
11553    
11554 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11555    
11556 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11557    
11558     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11559     as parameter and store it in an instance variable
11560     (MainWindow.invoke_command, MainWindow.update_command_ui)
11561     (MainWindow.save_modified_session, MainWindow.NewSession)
11562     (MainWindow.OpenSession, MainWindow.SaveSession)
11563     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11564     application object.
11565    
11566     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11567     the main window with self.
11568    
11569 bh 225 * Thuban/UI/context.py: New module with the context class
11570    
11571     * Thuban/UI/command.py (Command): Update doc string.
11572    
11573     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11574     MainWindow.update_command_ui): Pass an instance of the context
11575     class to the command's methods
11576     (check_current_tool, call_method): Handle the new context
11577     implementation
11578    
11579     * Examples/simple_extensions/simple_tool.py (simple_tool,
11580     check_simple_tool): Handle the new context implementation
11581    
11582     * Examples/simple_extensions/simple_command.py (simple_command):
11583     Handle the new context implementation. Update the comments about
11584     the context.
11585    
11586     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11587     doc-string
11588     (ThubanApplication.Session): New method to return the session
11589     object
11590    
11591     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11592     interactor's selected_layer may not be a layer of the current
11593     session when the tree is updated while a new session is being set.
11594    
11595 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11596    
11597     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11598     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11599     update_tree into update_tree and add_items. The tree now uses a
11600     more generic way to display the contents of the tree.
11601     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11602    
11603     * Thuban/Model/layer.py (Layer.TreeInfo),
11604     Thuban/Model/extension.py (Extension.TreeInfo),
11605     Thuban/Model/map.py (Map.TreeInfo),
11606 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11607 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11608    
11609 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11610    
11611     * Thuban/UI/application.py: Don't use "import from" for the
11612     MainWindow. It can't always be resolved.
11613     (ThubanApplication.OnInit): change reference to MainWindow
11614     accordingly.
11615    
11616     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11617     completely
11618    
11619 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11620    
11621     * setup.py (create_init_module): New configurable variable whose
11622     default depends on the platform we're running on.
11623     (ThubanInstall.initialize_options): Initialize
11624     self.create_init_module from the global create_init_module
11625     (ThubanInstall.user_options): indictate that the options
11626     create-init-module and init-module-dir have arguments.
11627    
11628     * setup.py: In the setup call change the version number to include
11629     cvs.
11630    
11631     * MANIFEST.in: Add the files in Examples
11632    
11633 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11634    
11635 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11636     value of the url parameter.
11637    
11638 bh 208 * Examples: New subdirectory for examples.
11639    
11640     * Examples/simple_extensions/simple_tool.xpm,
11641     Examples/simple_extensions/simple_tool.py,
11642     Examples/simple_extensions/simple_command.py,
11643     Examples/simple_extensions/README: Simple examples showing how to
11644     add new commands and tools.
11645    
11646 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11647     bdist_rpm that we also have an install script.
11648     (bdist_inno): Add 2002 to the copyright notice.
11649    
11650 bh 205 * setup.py: Create a file in python's site-packages directory to
11651     make installation of Thuban as a library easier.
11652     (ThubanInstall.user_options): Add two new options,
11653     create-init-module and init-module-dir
11654     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11655     filenames for installation in the default directories.
11656     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11657     the inherited methods to capture some filenames before they're
11658     transformed too much by distutils.
11659     (ThubanInstall.run): Create the init module if requested.
11660     (ThubanInstall.thuban_init_filename): New method to return the
11661     full name of the init module.
11662     (ThubanInstall.get_outputs): Append the filename of the init
11663     module.
11664    
11665 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11666    
11667 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11668     handle the prefix properly which means that the default for the
11669     installation prefix should be /usr for RPMs and /usr/local when
11670     doing a normal source install.
11671     (bdist_rpm_install_script): Script to override the default install
11672     commands in the specfile generated by the bdist_rpm command.
11673     (thuban_bdist_rpm.user_options): Add a prefix option
11674     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11675     Create the script files for the spec files as empty files here
11676     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11677     to fill the script files with content.
11678    
11679 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11680     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11681     argument. save_session now automatically uses this version,
11682     solving a problem when saving to a relative filename.
11683    
11684     * setup.py: In the setup call, make sure that the library
11685     directories are under $prefix/lib not directly under $prefix.
11686    
11687 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11688 jan 199
11689     * Thuban/Model/extension.py: new module to handle extension objects.
11690     * Thuban/Model/messages.py: new messages for extensions.
11691     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11692     Session.AddExtension): new for handling extensions.
11693     Also some other minor changes to round up extension handling.
11694     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11695     of Extension titles and title and names of its objects.
11696    
11697 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11698    
11699     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11700 bh 202 the events for a command.
11701 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11702     Call bind_command_events to bind the events. add_toolbar_command
11703     can now bind events too so that it's possible to have commands
11704     that are only available through the toolbar.
11705     (MainWindow.init_ids): New instance variable events_bound to keep
11706     track of for which commands events have been bound.
11707    
11708 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11709    
11710     * Thuban/UI/menu.py: New module to build and manage menus.
11711    
11712     * Thuban/UI/mainwindow.py: Remove some unused imports.
11713     (MainWindow.__init__, main_menu): move the definition of the main
11714     menu from __init__ to the Menu instance main_menu.
11715     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11716     build the menu bar and sub-menus from a menu description.
11717    
11718     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11719     startup file
11720     (ThubanApplication.read_startup_files): New method to run
11721     ~/.thuban/thubanstart.py
11722    
11723 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11724     Move the toolbar definition to the Menu instance main_toolbar.
11725     (MainWindow.build_toolbar): New method to build the toolbar
11726     similar to the build_menu methods
11727    
11728 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11729    
11730 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11731     layer_outline_color. Fix it in the definition of the command too.
11732    
11733 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11734    
11735 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11736    
11737     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11738     in the docstring
11739    
11740 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11741    
11742 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11743     when the shapefile is empty.
11744     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11745     now return None for empty shapefiles. Update doc-strings.
11746    
11747     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11748     the layer's bbox being None.
11749    
11750     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11751     layer's bbox being None.
11752    
11753 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11754     necessary.
11755     (MapCanvas.__init__): New instance variables, last_selected_layer
11756     and last_selected_shape to determine how the selection has
11757     changed.
11758    
11759     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11760     AutoSizeColumns because it will cause a traversal of the entire
11761     table which for large .dbf files will take a very long time.
11762    
11763 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11764    
11765     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11766     maximum depth for the tree than shapelib does by default.
11767    
11768 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11769    
11770     * setup.py (py_modules): The shptree modules doesn't have a
11771     wrapper, so don't include it in the py_modules
11772    
11773 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11774    
11775     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11776     const void * as in the qsort prototype
11777     (SHPTreeFindLikelyShapes): Remove some unused variables.
11778    
11779     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11780     maintains to redraw the window during a drag.
11781     (MapCanvas.unprojected_rect_around_point): New method to determine
11782     a small region around a point for hit-testing.
11783     (MapCanvas.find_shape_at): Only test the shapes in a small region
11784     around the point.
11785    
11786     * setup.py: Increment the version to 0.1.2
11787    
11788     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11789     debug print and set session to None after unsubscribing
11790    
11791 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11792    
11793 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11794     the file to have a .thuban extension.
11795    
11796 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11797     all the session channels to subscribe to to update the tree
11798     (SessionTreeCtrl.session_changed): Remember the session so that we
11799     can unsubscribe properly. Use the new class constant to
11800     unsubscribe from the old session and subscribe to the new one.
11801     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11802     subscriptions of the SessionTreeCtrl.
11803     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11804    
11805     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11806     Session Tree" command to the file menu.
11807    
11808     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11809     as update_region to the renderer.
11810    
11811     * Thuban/UI/renderer.py
11812     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11813     update box is now directly a tuple, not a wxRect anymore.
11814    
11815     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11816     prints.
11817    
11818     2002-05-07 Bernhard Herzog <[email protected]>
11819    
11820 bh 146 * setup.py: Add the shptree extension module. See
11821     extensions/pyshapelib/ChangeLog for more details.
11822    
11823     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11824     extensions/shapelib/dbfopen.c: Really update to the versions of
11825     shapelib 1.2.9. For some reason it wasn't really done on
11826     2002-04-11.
11827    
11828     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11829     shapelib 1.2.9. The only real difference is the use of qsort
11830     instead of a bubble sort implementation
11831    
11832     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11833     shapetree to hold the shapelib quadtree for the shapefile
11834     (Layer.open_shapefile): Create the quad tree.
11835     (Layer.ShapesInRegion): New method to return the ids of shapes in
11836     a given region using the quad tree.
11837    
11838     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11839     comment
11840     (draw_polygon_shape): Accept both arcs and polygons.
11841     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11842     the api.
11843    
11844     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11845     return the shape ids to be rendered in a given layer.
11846     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11847     ids. Use draw_polygon_shape to draw arc shapes as well.
11848     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11849     has to be updated
11850     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11851     calling it's ShapesInRegion method.
11852    
11853     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11854     update_region for the update region.
11855     (MapCanvas.OnPaint): Maintain the update region
11856     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11857     to the renderer when drawing the bitmap. Reset the update_region.
11858    
11859 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11860    
11861 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11862     MainWindow.OpenSession): Change the file extension of the session
11863     files to .thuban
11864    
11865 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11866     Move the map channels to be forwarded by the session into the
11867 bh 146 class constant with forwarded_channels. Also add
11868     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11869     forwarded_channels
11870 bh 129
11871     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11872     typo and some rewording).
11873    
11874 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
11875    
11876     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11877     around to speed up most redraws:
11878     (MapCanvas.__init__): New instance variable bitmap which holds the
11879     bitmap
11880     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11881     self.bitmap to draw.
11882     (MapCanvas.full_redraw): New method to force a full redraw
11883     including the bitmap
11884     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11885     make sure the bitmap is redrawn.
11886     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11887     MapCanvas.shape_selected): Call full_redraw instead of readraw to
11888     make sure the bitmap is redrawn.
11889     (MapCanvas.OnSize): New method to handle size events so that the
11890     bitmap can be redrawn.
11891    
11892 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
11893    
11894     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11895     canvas' VIEW_POSITION event
11896     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11897     Update the text in the status-bar accordingly.
11898    
11899     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11900     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11901     called.
11902     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11903     current_position
11904     (MapCanvas.set_current_position): New method to set
11905     current_position. Issue a VIEW_POSITION event
11906     (MapCanvas.CurrentPosition): New public method to return the value
11907     of current_position. Should be called when the VIEW_POSITION event
11908     is processed.
11909     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11910     Update the position.
11911     (MapCanvas.OnLeaveWindow): Set the position to None.
11912    
11913     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11914     position in the statusbar
11915    
11916 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
11917 frank 120
11918     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11919    
11920 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
11921    
11922 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
11923    
11924     * Resources/Bitmaps/fullextent.xpm: new
11925 jan 116
11926 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
11927 jan 116
11928 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11929     box
11930 jan 114
11931 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
11932    
11933 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11934    
11935     * Thuban/UI/tree.py (update_tree): added added map extent
11936    
11937     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11938 tkoester 403 icon; added map_full_extend as tool
11939 jan 114
11940 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
11941 jan 107
11942     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11943     saving _new_ sessions
11944    
11945     * Thuban/Model/session.py (create_empty_session): new session
11946     don't have a filename (set to None)
11947    
11948     * Thuban/UI/tree.py (update_tree): added filename and modified flag
11949    
11950     * Thuban/Model/load.py (ProcessSession): convert projection
11951     parameters from unicode to regular string
11952    
11953     * Data/iceland_sample.session: Added UTM Zone 26 projection.
11954    
11955 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
11956    
11957     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11958     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11959     1.2.9
11960    
11961     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11962     the pyshapelib directoy into the list of include dirs, so that
11963     pyshapelib_api.h can be found.
11964    
11965     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11966     holds the pyshapelib C-API
11967     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11968     pyshapelib_api to access the shapelib functions.
11969     (initwxproj): Import the c_api from the shapelib module and
11970     initialize pyshapelib_api.
11971    
11972 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
11973    
11974 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
11975     initialize_options to create the scripts for the rpm.
11976    
11977 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11978    
11979 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
11980    
11981 bh 87 * setup.py: Increment version to 0.1.1
11982    
11983 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11984     Layer" and "Remove Layer" commands from the layer menu to the map
11985     menu
11986    
11987 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
11988    
11989     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11990     argument (python <= 1.5.2 erroneously accepted multiuple
11991     arguments)
11992    
11993 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
11994    
11995     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11996     RecordGrid in the identifyview.
11997     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11998     IdentifyListCtrl. The grid allows editing of the values.
11999    
12000     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
12001     implementing a grid for a single row of a thuban table.
12002    
12003     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
12004     layers by default. Easier to use than the previous default of only
12005     searching through the select layer which meant that if no layer
12006     was selected, you couldn't select a shape.
12007    
12008     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
12009    
12010     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
12011     stroke_width attribute
12012    
12013     * Thuban/Model/save.py (save_session): Write the new stroke_width
12014     attribute
12015    
12016     * Thuban/Model/load.py (ProcessSession.startElement): Read the
12017     stroke_width attribute
12018    
12019     * Thuban/Model/layer.py (Layer.__init__): New parameter and
12020     instance variable stroke_width
12021     (Layer.SetStrokeWidth): Set the stroke_width.
12022    
12023 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
12024    
12025     * extensions/thuban/wxproj.cpp (project_points): Fix two
12026     off-by-one errors in the last loop that joins the various parts
12027     together.
12028    
12029 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12030    
12031     * setup.py (data_dist.make_distribution): Fix some typos
12032    
12033 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12034    
12035     * README: Slight tweaking in preparation for the 0.1 release
12036    
12037     * setup.cfg: Add section for sdist to create both tgz and zip
12038     archives
12039    
12040     * setup.py: increase version number to 0.1
12041     (data_dist): New command class for data distribution
12042    
12043 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12044    
12045 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12046     Handle the case of no layer (i.e. layer is None) properly.
12047    
12048 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12049 bh 70 Set the initial selection of the combo boxes to reflect the
12050     projection we're starting with in a way that works on windows,
12051     too.
12052    
12053 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12054     puiblisher's ids in hex to make it easier to compare them to the
12055     standard repr of python methods
12056    
12057     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12058     messages
12059    
12060 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12061    
12062 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12063     deselect the layer if no layer is selected
12064    
12065 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12066     idle time when there actually is something to draw. If there's
12067     nothing to draw simply clear the window
12068     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12069     (MapCanvas.SetMap): force a redraw in all cases because
12070     FitMapToWindow doesn't always do it.
12071     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12072     specify the point to move into the center of the window
12073     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12074     dragged, zoon in/out by a factor of 2
12075 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12076     index, i.e. reversed drawing order) so that objects appearing to
12077     be in from of others are selected first. This is probably mostly
12078     relevant for point shapes where the symbols used may overlap
12079 bh 59
12080     * Thuban/Model/session.py (create_empty_session): Unset the
12081     modified bit before returning it
12082    
12083     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12084     create_empty_session session to create the new, empty session.
12085    
12086     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12087     the tool bitmaps.
12088     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12089     the code that asks whether the session should be saved into the
12090     new method save_modified_session.
12091     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12092     method to save modified session here too.
12093    
12094 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12095    
12096     * setup.py (InnoIconItem): fix typo
12097    
12098     (thuban_bdist_inno.run):
12099     (bdist_inno.run): Move the decision not to create symlinks on
12100     non-nt platforms to thuban_bdist_inno and do it unconditinally
12101     since we never want to create the symlinks here
12102    
12103 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12104    
12105 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12106     identify view immediately
12107    
12108     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12109     and SelectableRecordListCtrl that implement the code shared by the
12110     identify view and the label dialog
12111    
12112     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12113     new class RecordListCtrl
12114    
12115     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12116     return value of GetValue is None instead of using it as a boolean
12117     directly so that Zero numbers are handled properly.
12118     (LabelListCtrl): Derive from the new class
12119     SelectableRecordListCtrl
12120    
12121 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12122     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12123     size of the text control explicitly to make the sizers work on
12124     both Windows and X.
12125    
12126 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12127    
12128     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12129     that can limit the search to the currently selected layer.
12130     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12131     layer stays selected even when no shape is found
12132 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12133     height do nothing (avoids zero division errors)
12134 bh 44
12135 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12136    
12137 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12138     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12139     convenient :-)
12140     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12141     a new instvar layer_to_item to map layers to tree items
12142     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12143     to match the current selection in the interactor
12144    
12145 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12146     (Interactor.HasSelectedLayer): New methods to query the current
12147     selection
12148    
12149     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12150     (MainWindow.has_selected_layer): Simply call the appropriate
12151     interactor method
12152    
12153     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12154     (MainWindow.LayerShowTable):
12155     (MainWindow.identify_view_on_demand): Store the interactor in an
12156     instvar and use that reference instead of going through main.app
12157    
12158 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12159     * Thuban/UI/application.py (ThubanApplication.OnInit):
12160 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12161     with the new mainwindow method ShowSessionTree and not directly
12162     the application's OnInit method
12163    
12164     * Thuban/UI/tree.py (myTreeCtrlPanel):
12165     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12166     TreeCtrl isntead of a panel. This affects most method since we now
12167     refer to self instead of self.tree
12168     (SessionTreeView): New class implementing a non-modal dialog
12169     showing the session tree.
12170    
12171 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12172     layer to the tableview dialog.
12173    
12174     * Thuban/UI/tableview.py: Add some doc-strings
12175 tkoester 403 (TableGrid):
12176 bh 35 (TableGrid.OnRangeSelect):
12177     (TableGrid.OnSelectCell):
12178     (TableFrame.__init__):
12179     (TableFrame.row_selected):
12180     Selecting rows in the grid view now updates the selected shapes
12181     through the TableFrame. To achieve this we derive TableGrid from
12182     Publisher and introduce the message type ROW_SELECTED which the
12183     TableFrame subscribes to and which is issued by OnRangeSelect and
12184     OnSelectCell
12185    
12186     (DataTable.SelectRow): Removed because it's no longer needed in
12187     the row/shape selection scheme
12188    
12189 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12190     dialogs
12191    
12192     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12193     the SELECTED_SHAPE message anymore. This is now handled by the
12194     parent.
12195     (TableGrid.select_shape): Only update the selection if the shape
12196     is not None.
12197     (TableFrame): Inherit from the new NonModalDialog class.
12198     (TableFrame.__init__, TableFrame.select_shape): Handle the
12199     SELECT_SHAPE message.
12200     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12201     SELECT_SHAPE
12202    
12203     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12204     (MainWindow.add_dialog):
12205     (MainWindow.dialog_open):
12206     (MainWindow.remove_dialog):
12207     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12208     of opened non-modal dialogs.
12209    
12210     (MainWindow.__init__): Initialize the new non-modal dictionary
12211     management code
12212     (MainWindow.LayerShowTable): maintain separate dialogs for each
12213     table using the non-modal dialog management code to only open a
12214     view once for each table.
12215    
12216     (MainWindow.IdentifyTool):
12217     (MainWindow.__init__):
12218     (MainWindow.identify_view_on_demand): Don't open the identify view
12219     in IdentifyTool anymore. This will be done automatically by the
12220     new method identify_view_on_demand which handles the
12221     SELECTED_SHAPE message so that the identify view will be opened on
12222     demand
12223    
12224     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12225     the interactor argument. The SELECTED_SHAPE message is now handled
12226     by the parent.
12227     (IdentifyView.__init__): Add the interactor argument so that we
12228     can handle the SELECTED_SHAPE message here
12229     (IdentifyView.selected_shape): New method to handle the
12230     SELECTED_SHAPE messages
12231    
12232     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12233     NonModalDialog class
12234     (IdentifyView.OnClose): Extend the inherited version to
12235     unsubscribe SELECT_SHAPE
12236    
12237     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12238    
12239 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12240    
12241     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12242 tkoester 403
12243 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12244     interactor to pass through to the MapCanvas
12245 tkoester 403
12246 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12247     argument to the MainWindow constructor to get rid of the ugly hack
12248     that made main.app available early just so that the mapcanvas
12249     could access the interactor object.
12250    
12251 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12252    
12253 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12254     that runs a modal message box
12255     (MainWindow.OnClose): Use the new method
12256     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12257     selected. The command should be grayed out anyway, so there's no
12258     need to pop up a message box.
12259     (MainWindow.AddLayer): Pop up a message box with an error message
12260     if the shape file can't be opened
12261    
12262     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12263     immediately. This will cause an exception in case the file can't
12264     be opened and we can display an appropriate message.
12265    
12266 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12267    
12268     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12269     specific bdist_rpm command.
12270    
12271     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12272     the locale module because it may not be available on some
12273     installations.
12274    
12275     * extensions/pyprojection/LICENSE: Copy of the license text in
12276     Projection.i. Having it in a separate file makes it easier to
12277     refer to license text in e.g. RPMs
12278    
12279 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12280    
12281 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12282     more generic
12283    
12284     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12285     <prefix>/bin to the outputs
12286     (ThubanInstall.link_file): New method to link files. We need this
12287     because the standard copy_files refuses to link non-existing
12288     files.
12289     (ThubanInstall.run): Remove the leading install root from the
12290     script filename if an install root was specified and use the new
12291     link_file method
12292 tkoester 403
12293 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12294     the window when the first layer is added to the map.
12295    
12296     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12297     when linking thuban.py to <prefix>/bin
12298    
12299 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12300    
12301     * setup.py: In the setup call, the install parameters shouldn't
12302     have trailing slashes because distutils on non-posix platforms
12303     doesn't like that. The same applies to other directories like
12304     "Resources/Bitmaps"
12305    
12306     In the configuration section for nt, move the wxWindows directory
12307     optins into the part clearly marked as editable.
12308    
12309     (InstallLocal.initialize_options):
12310     (InstallLocal.user_options): remove the currently unused debug
12311     flag
12312     (thuban_build_py.find_all_modules): Add this method so that it
12313     works for our case of having packages and modules in one
12314     distribution as well.
12315     (ThubanInstall.initialize_options):
12316     (ThubanInstall.finalize_options):
12317     (ThubanInstall.user_options):
12318     (ThubanInstall.boolean_options): Add new options, do-symlink and
12319     extra files. Since these are the first ThubanInstall specific
12320     options, override user_options and boolean_options
12321     (ThubanInstall.run): Honor the new do-symlink and extra-files
12322     options.
12323     (ThubanInstall.get_outputs): Add to override the base-class's
12324     version and add the extra-files to the outputs
12325     (bdist_inno): New class for windows distributions with Inno Setup
12326     (InnoIconItem): Helper class for bdist_inno
12327     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12328     this together with the appropriate parameters, to the setup call.
12329 tkoester 403
12330 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12331     installer
12332    
12333     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12334     changing_selection to avoid recursive selection events when
12335     modifying the selection in response to a selection event.
12336     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12337     changing the tree's selection.
12338     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12339     we're not being called indirectly from normalize_selection.
12340    
12341     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12342     event.Check only if the command is actuall checkable.
12343     (MainWindow.__init__): Call the toolbar's Realize method to make
12344     sure that the items are actually shown
12345    
12346 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12347    
12348 bh 9 * setup.py: Fix some doc strings
12349    
12350 bh 7 * ChangeLog: started
12351    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26