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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2711 - (hide annotations)
Tue Oct 10 10:30:54 2006 UTC (18 years, 4 months ago) by dpinte
Original Path: trunk/thuban/ChangeLog
File size: 474498 byte(s)
2006-10-10 Didrik Pinte <dpinte@itae.be>

    Win32 build updates 

        * setup.py : 
            - update to the latest libs for win32 setup tasks
            - added gdal and Lib content to the inno setup build task
            - added stable and experimental extensions to setup packages

        * thuban.py :
            - gdal support for win32 inno installation

1 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
2 dpinte 2711
3     Win32 build updates
4    
5     * setup.py :
6     - update to the latest libs for win32 setup tasks
7     - added gdal and Lib content to the inno setup build task
8     - added stable and experimental extensions to setup packages
9    
10     * thuban.py :
11     - gdal support for win32 inno installation
12    
13     2006-10-10 Didrik Pinte <[email protected]>
14    
15 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
16     extracted from Thuban/UI/viewport.py
17     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
18    
19 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
20    
21     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
22    
23     * Thuban/UI/view.py: removed non needed declaration
24    
25     * Thuban/UI/selection.py : typo correction
26    
27 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
28    
29 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
30     Making the test more robust for observed python 2.3 problems
31     with setlocale().
32    
33 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
34     to run all tests with an LC_NUMERIC that uses comma as decimal_point.
35     Minor: Added (c) year 2006. Fixed typo in a docstring.
36    
37     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
38     a docstring.
39    
40 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
41    
42     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
43     and added it to TestOGRTable.setUp() so that all tests get skipped
44     if ogr cannot be imported. Added (c) year 2006.
45    
46 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
47    
48     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
49    
50 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
51    
52 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
53    
54 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
55    
56     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
57     Bernhard Reiter and new copyright year 2006.
58    
59 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
60     and Projection.assuregoodlocale(), Projection.assureinitlocale().
61     Added author Bernhard Reiter and (c) 2006.
62    
63 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
64 bernhard 2692
65     * README: added RXP and pyRXP as optional for tests.
66 bernhard 2697
67 bernhard 2694 * test/localessupport.py: New. Contains a helper function
68     to find a locale with comma used as decimal_point.
69 bernhard 2692
70 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
71 bernhard 2691
72 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
73 bernhard 2697
74 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
75     copyright range to include 2006.
76 bernhard 2690
77 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
78    
79     * Thuban/UI/main.py: circular import fix.
80    
81 frank 2688 2006-06-27 Frank Koormann <[email protected]>
82    
83     New Classification "Pattern": Classify text attributes by regexp.
84    
85     * Thuban/Model/classification.py (class ClassGroupPattern):
86     New, group is associated with a regular expression.
87     (Classification._compile_classification): Store compiled regexp and
88     original group for pattern.
89     (Classification.FindGroup): Added pattern.
90    
91     * Thuban/UI/classifier.py
92     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
93     New, add popup to select singleton/pattern.
94     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
95     ClassTable.SetValueAsCustom): Added pattern.
96     (ClassTable.__ParseInput): Autodetect singleton/pattern.
97    
98     * Thuban/Model/save.py (SessionSaver.write_classification):
99     Added pattern.
100    
101     * Thuban/Model/load.py (SessionLoader.start_clpattern,
102     SessionLoader.end_clpattern): New, process pattern elements.
103    
104     * test/test_classification.py (class TestClassGroupPattern): New.
105     (TestClassification.test_add_pattern,
106     TestClassification.test_multiple_groups_textual,
107     TestClassification.test_deepcopy_textual): New.
108     (TestClassification.test_multiple_groups_numerical):
109     Renamed test_multiple_groups.
110     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
111    
112     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
113     Added pattern.
114    
115     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
116     Added pattern.
117    
118     * test/test_layer.py
119     (TestLayerModification.test_set_classification_textual): New
120     (TestLayerModification.test_set_classification_numerical):
121     Renamed test_set_classification.
122    
123     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
124     description.
125    
126     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
127    
128 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
129    
130     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
131    
132 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
133    
134 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
135     extensions
136    
137     2006-06-28 Didrik Pinte <[email protected]>
138    
139 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
140     systems (support pysqlite1 and pysqlite2)
141    
142 frank 2684 2006-06-27 Frank Koormann <[email protected]>
143    
144     * Thuban/version.py: Bugfix determination of SQLite on old systems.
145    
146 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
147     * Extensions/ogr/__init__.py : updated test for win32 and correct
148     imports
149    
150 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
151 dpinte 2682 Ashamed ... still some tabs in the files
152    
153     * Thuban/version.py : tabs removed
154     * Thuban/Model/transientdb.py : tabs removed
155    
156     2006-05-15 Didrik Pinte <[email protected]>
157    
158 dpinte 2681 * Thuban/version.py : coding style correction
159 dpinte 2682 * Thuban/Model/transientdb.py : coding style correction
160 dpinte 2681
161     2006-05-15 Didrik Pinte <[email protected]>
162 dpinte 2682
163 dpinte 2680 * Thuban/version.py : Updated imports to support pysqlite2
164 dpinte 2682
165     * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
166 dpinte 2680 Patched the querying system to support the param style of pysqlite2
167    
168 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
169 bernhard 2690 * Extensions/svgexport/__init__.py: The extension now works on win32
170 dpinte 2679 architecture. Bug #87 corrected.
171    
172 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
173     * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
174     Removed emacs specific hint and replaced it with a general hint
175     that editors might support writing changelogs.
176    
177 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
178 bernhard 2678
179 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
180     instead of "cvs".
181    
182 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
183    
184     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
185     projects.h now. According the Frank Warmerdam and man pj_init
186     this is the public interface to proj. Thus I have changed PJ to projPJ.
187     And I could remove the hack to avoid clashes with typedef PVALUE
188     and #define LP in projects.h clashing with symbols when trying to
189     build on windows. The file is cleaner and nicer now.
190    
191 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
192 bernhard 2678
193 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
194     trying to build with mingw.
195    
196 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
197    
198 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
199     Added display of internal encoding to the about dialog text.
200    
201     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
202    
203     2005-10-18 Bernhard Reiter <[email protected]>
204    
205 bernhard 2673 Startup improved: We fail right away if the internal encoding could
206     not be determined.
207    
208     * Thuban/__init__.py (get_internal_encoding): new.
209    
210     * test/test_stringrepresentation.py (class TestInternalEncoding):
211     Preserve the internal encoding for the tests in this class.
212    
213 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
214    
215 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
216     that set_internal_coding() is throwing an exception for bad exceptions.
217    
218     * Thuban/__init__.py (set_internal_encoding): added a forwards
219     and backward translation, so that we fail early if the
220     internal_encoding is bad.
221    
222     2005-10-17 Bernhard Reiter <[email protected]>
223    
224 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
225     You could actually get polylines with filling in between,
226     when the classification for the lines had a fill color.
227     E.g. this happens when you generate a classification from a ramp.
228    
229     * Extensions/svgexport/test/test_svgmapwriter.py:
230     New test_export_arc_no_fill(). Extend copyright notice to 2005.
231    
232     * Extensions/svgexport/svgmapwriter.py
233     (SVGRenderer.draw_shape_layer_incrementally()):
234     Setting TRANSPARENT_BRUSH for shaptype ARC.
235     Extend copyright notice to 2005.
236    
237     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
238    
239 frank 2670 2005-09-08 Frank Koormann <[email protected]>
240    
241     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
242     by Erik (sigra.at.home.se)
243    
244 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
245    
246     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
247     Call the right method for the default size.
248    
249 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
250    
251     * Extensions/export_shapefile: New.
252    
253     * Extensions/export_shapefile/__init__.py: New. Initialize
254     the export_shapefile extension.
255    
256     * Extensions/export_shapefile/export_shapefile.py: New.
257     Exports a layer as a Shapefile.
258    
259 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
260    
261     * po/de.po: String fixes. This fixes Debian bug #313843.
262    
263 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
264    
265     Remove the attributes from the layer element in
266     .thuban files for the save routine.
267     This also solves RT bug #3149,
268     https://intevation.de/rt/webrt?serial_num=3149
269    
270     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
271     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
272     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
273     attributes from layer element to classification clnull element.
274    
275     * test/test_save.py (SaveSessionTest.testSingleLayer,
276     SaveSessionTest.testLayerProjection,
277     SaveSessionTest.testClassifiedLayer,
278     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
279     Removed attributes from layer element to classification clnull element.
280     (test_save_postgis.NonConnectionStore._fetch_table_information):
281     added pretending to have a shape_type.
282    
283     * Resources/XML/thuban-1.1.dtd: Make the attributes field
284     and field_type of classification optional.
285    
286     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
287     Added output of size.
288    
289     * Thuban/Model/load.py (SessionLoader.start_classification):
290     Change attribute 'field' and 'field_type' from obligatory to
291     optional to allow empty classes (ie. only with a default=clnull).
292    
293     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
294     any attributes anymore for the layer element.
295     (SessionSaver.write_classification): Even if there is no
296     classification field, still write the classification because
297     the clnull (default) symbol will not be defined anymore as
298     part of the layer element.
299    
300 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
301    
302 bh 2652 * setup.py (setup call): Version 1.1.0
303    
304     * NEWS: Update for 1.1.0
305    
306     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
307     technores won't be included
308    
309     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
310     2005
311    
312     * po/de.po: Updated.
313    
314     2005-07-05 Bernhard Herzog <[email protected]>
315    
316 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
317    
318     2005-07-05 Bernhard Herzog <[email protected]>
319    
320 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
321     masktype attributes.
322    
323     2005-07-05 Bernhard Herzog <[email protected]>
324    
325 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
326     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
327     __mangle_bounding_box. See the comments in the code and RT #2845
328    
329     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
330     Remove the explicit test of ClipBoundingBox. The method isn't
331     public anymore and the direct call in the test wasn't necessary in
332     the first place. If ClipBoundingBox (now __mangle_bounding_box)
333     isn't called, the return value of ShapesInRegion will be
334     different.
335    
336     2005-07-05 Bernhard Herzog <[email protected]>
337    
338 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
339     ZeroDivisionError exceptions. I don't know when they happen
340     exactly. It probably happens when the projections aren't set
341     properly.
342    
343 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
344    
345     First step towards unicode. With this roughly we're at step 1
346     string_representation.txt
347    
348     * Doc/technotes/string_representation.txt: New. Document how
349     strings are represented in Thuban and how to get to a Unicode
350     Thuban.
351    
352     * Thuban/__init__.py (set_internal_encoding)
353     (unicode_from_internal, internal_from_unicode): New. The first few
354     functions for the internal string representation
355    
356     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
357     internal_from_unicode instead.
358    
359     * Thuban/UI/__init__.py (install_wx_translation): Determine the
360     encoding to use for the internal string representation. Also,
361     change the translation function to return strings in internal
362     representation even on unicode builds of wxPython
363    
364     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
365     filenames too.
366     (SessionLoader.start_clrange): Use check_attrs to decode and check
367     the attributes.
368    
369     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
370     internal_from_unicode to convert unicode strings.
371    
372     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
373     unicode_from_internal when applicable
374    
375     * test/runtests.py (main): New command line option:
376     internal-encoding to specify the internal string encoding to use
377     in the tests.
378    
379     * test/support.py (initthuban): Set the internal encoding to
380     latin-1
381    
382     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
383     (TestLabelLayer.test): Use the internal string representation when
384     dealing with non-ascii characters
385    
386     * test/test_load_1_0.py (TestSingleLayer.test)
387     (TestClassification.test, TestLabelLayer.test): Use the internal
388     string representation when dealing with non-ascii characters
389    
390     * test/test_load_0_9.py (TestSingleLayer.test)
391     (TestClassification.test): Use the internal string representation
392     when dealing with non-ascii characters
393    
394     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
395     internal string representation when dealing with non-ascii
396     characters
397    
398     * test/test_save.py (XMLWriterTest.testEncode)
399     (SaveSessionTest.testClassifiedLayer): Use the internal string
400     representation when dealing with non-ascii characters where
401     applicable
402    
403 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
404    
405 bh 2641 * test/runtests.py: Untabify.
406    
407     2005-06-30 Bernhard Herzog <[email protected]>
408    
409 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
410     untabify.
411    
412     2005-06-30 Bernhard Herzog <[email protected]>
413    
414 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
415    
416 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
417    
418 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
419     Use the default size for rendering selected items of default type.
420     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
421    
422     2005-06-28 Jan-Oliver Wagner <[email protected]>
423    
424 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
425     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
426     Thanks to Frank Koormann who identified this problem.
427    
428     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
429     another symbol identified.
430    
431 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
432    
433     * Doc/manual/thuban-manual-de.xml: More translations.
434    
435 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
436    
437     * Thuban/UI/projdialog.py: Add missing import, which led to an
438     exception when opening a layer's projection.
439    
440 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
441    
442 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
443    
444     2005-05-09 Bernhard Herzog <[email protected]>
445    
446 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
447     connection to autoconnect. Fixes RT#3148.
448    
449     * test/test_postgis_db.py
450     (TestPostGISSpecialCases.test_simple_error_handling): New test
451     that attempts to reproduce RT#3148.
452    
453 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
454    
455     Add support for saving and loading the opacity and mask type
456     properties of RasterLayers. Also add support for proper use
457     of alpha information while drawing images not in 'RAW' format.
458     If transparency in an image format (e.g, PNG) is supported by
459     wxWidgets then the image would previously have been draw with
460     transparent regions, but the opaque regions would have been
461     unaffected by a change in the layer's opacity. This patch
462     corrects the problem.
463    
464     * Thuban/Model/layer.py (RasterLayer): Added opacity and
465     masktype parameters to the constructor, and set the
466     appropriate variables to those values.
467    
468     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
469     code to read the opacity and mask type of the layer and construct
470     a new layer with the additional parameters.
471    
472     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
473     to save the opacity and mask type of a layer.
474    
475     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
476     the opacity of the layer to draw_raster_data rather than the layer.
477     (BaseRenderer.draw_raster_data): Remove the layer parameter because
478     the function doesn't need to know about the layer. Add the optional
479     opacity parameter whose default is 1.0. Add 'PNG' as a supported
480     graphics format.
481    
482     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
483     signature to match that in BaseRenderer. Use the new opacity argument
484     in place of calling layer.Opacity(). In the case where the
485     format is not 'RAW', alpha_data is None and the loaded image has
486     alpha information, use the file's alpha information. This is
487     still subject to the layer's opacity setting.
488    
489     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
490     Fixed signature to match that in BaseRenderer.
491    
492     * test/test_load.py (TestRasterLayer): Change file_contents to
493     include opacity and masktype variables.
494     (TestRasterLayer.test): Include tests for opacity and masktype
495     changes.
496    
497     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
498     test to cover a variety of combinations of masktype and opacity
499     settings.
500    
501 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
502    
503     * debian/rules: add --use-wx-python-swig-hack
504     to the build command.
505     Thanks to Moritz Lennert for pointing this out.
506    
507 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
508    
509     Introduce OGRFileShapeStore in ogr extension.
510     This allows at least that loaded shapefile shape stores
511     can be saved correctly in the thuban session file
512     and reloaded again (reload is via core shapefile
513     routine, not OGR). For other types, .thuban files
514     can not be reloaded for the time being.
515    
516     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
517     class ist to be used for any file-based shape stores
518     accessed through OGR.
519    
520     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
521     forgotten _ for i18n. Adapted call OpenFileShapestore
522     regarding new parameter.
523     (OpenFileShapestore): Use OGRFileShapeStore instead of
524     OGRShapeStore. Fix return value (None instead of null).
525     Add new parameter "mainwindow" to avoid accessing global
526     context.
527    
528 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
529    
530     Introduce FileShapeStore as generalization for
531     file-based shape stores. In a first instance
532     this allows additional modules to handle shapefile
533     format as well, namely the OGR extension.
534    
535     * Thuban/Model/data.py: Various small fixes in doc-strings.
536     (FileShapeStore): New class.
537     (ShapefileStore): Derive from FileShapeStore.
538     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
539     rename self.table to self._table, initialize self._bbox
540     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
541     and self.FileName() instead of self.filename.
542     (ShapefileStore.Table): Use self._table instead of self.table.
543     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
544     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
545    
546     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
547     (SessionSaver.write_data_containers): Only use methods of the
548     base class FileShapeStore.
549    
550 joey 2604 2005-04-26 Martin Schulze <[email protected]>
551    
552     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
553     function to the modified render engine
554    
555     2005-04-25 Martin Schulze <[email protected]>
556    
557     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
558     Added a description according to the CVS log message
559    
560     2005-04-23 Martin Schulze <[email protected]>
561    
562     * Thuban/UI/renderer.py: Added a missing import
563    
564 russell 2600 2005-04-23 Russell Nelson <[email protected]>
565    
566 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
567     way the previous tool is remembered, so that middle-button
568     panning works even if you haven't selected a tool.
569 russell 2600
570 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
571    
572     * libraries/thuban/wxproj.cpp: Move the compatibility code that
573     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
574     branch that includes wxPython.h because it's only needed when
575     wxPython.h is used. Also, it won't compile when
576     USE_WX_PYTHON_SWIG_HACK is set otherwise.
577    
578 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
579    
580     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
581     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
582     ClassGrid.__init__ and it's value is outside of the valid
583     range (must be < 32768). wxPython 2.5 complains about it with an
584     exception.
585    
586 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
587    
588     * Doc/manual/thuban-manual-de.xml: More translations.
589    
590 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
591    
592 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
593     wxPython 2.4 as well. Also, remove a now obsolete comment.
594    
595     2005-04-05 Bernhard Herzog <[email protected]>
596    
597 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
598     available.
599    
600     * setup.py (wxproj_extension): New variable. Assign the Extension
601     instance for Lib.wxproj to this variable instead of putting it
602     directly into the listso that it can be accessed by other code
603     later.
604     (thuban_build_ext.user_options): Added boolean option
605     --use-wx-python-swig-hack.
606     (thuban_build_ext.initialize_options): Initialize the new option
607     to False.
608     (thuban_build_ext.finalize_options): If the new option was given,
609     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
610     (thuban_build_ext): Update the doc-string
611    
612     * libraries/thuban/wxproj.cpp: Normally we use
613     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
614     defined, use swigPtrConvertHack.h instead.
615    
616     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
617     copied over from wxPython.h.
618     (decode_pointer_new): New. Equivalent of decode_pointer for
619     wxPython 2.5.
620     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
621    
622     * README: Add section on potential build problems which explains
623     how the work-around for a missing wxPython.h is activated.
624    
625 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
626    
627 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
628     potential location for (lw)postgis.sql because the file has moved
629     again in postgis 1.0.0 rc4.
630    
631     2005-03-29 Bernhard Herzog <[email protected]>
632    
633 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
634     match the site of the legend_icon_layer icon. Otherwise wxpython
635     2.5 complains when the legend is created with the error:
636    
637     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
638     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
639     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
640     in wxImageList: this might work on this platform but definitely
641     won't under Windows.
642    
643 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
644    
645     These changes add support for adjusting the opacity of a raster layer.
646    
647     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
648     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
649     a LAYER_CHANGED event if the opacity actually changes.
650    
651     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
652     layer parameter needed in the implementation of this method in
653     renderer.py.
654    
655     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
656     typo 00 -> 0.
657    
658     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
659     control to adjust opacity.
660    
661     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
662     alpha data based on the opacity level of the layer.
663    
664     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
665     accepts a layer parameter.
666    
667     * test/test_layer.py (TestLayerModification.test_raster_layer):
668     Rename opacity method calls and add test for LAYER_CHANGED.
669    
670 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
671    
672     * test/test_connector.py (DeletionTestMixin.check_deletions)
673     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
674     update the callers.
675    
676 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
677    
678     * Doc/manual/thuban-manual-de.xml: More translations.
679    
680 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
681    
682     Introducing initialization callbacks for extensions.
683    
684     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
685     optional parameter init_callback.
686     (ExtensionDesc.init_ext): New. Executes the callback and sets
687     a status.
688    
689     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
690     initialization of the extensions.
691     (ThubanApplication.init_extensions): Init all extensions.
692    
693     * Thuban/UI/about.py (About.__init__): Added status of the extensions
694     to the about text.
695    
696     * Extensions/gns2shp/__init__.py: Added init method for Extension
697     description.
698     (init): New. Contains the initialization of the module.
699    
700 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
701    
702     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
703     OGRConnection to open a datasource. Removed dialog to display all
704     available drivers. Added some doc strings.
705    
706     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
707     OGRDatasource with a string. Added two opening methods which return an
708     OGRDatasource (either data from file or from DB).
709    
710     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
711     represents a geometry reference of an OGRFeature. OGRShape now has a
712     list of referenced geometry objects (important for geometry
713     collections).
714     For OGRShapeStores loaded from a DB an ID column can be specified now.
715    
716 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
717    
718     * test/test_map.py (TestMapWithContents.test_tree_info):
719     Added label layer for comparison.
720    
721 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
722    
723     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
724     which builds a mask. Handle the majority of an image in a loop,
725     creating 8 bits at a time. Later, handle the edge case where less
726     than 8 bits are packed.
727    
728 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
729    
730     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
731     doc-string
732    
733 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
734    
735 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
736    
737     2005-02-18 Jonathan Coles <[email protected]>
738    
739 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
740     dependencies on wxPython. Added a new method projected_raster_layer()
741     that returns a raster layer image in projected space. This must be
742     implemented in classes derived from BaseRenderer. This also eliminates
743     the dependency on gdal in baserenderer.py.
744    
745     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
746     new projected_raster_layer() to get projected raster image instead
747     of directly calling ProjectRasterFile().
748     (BaseRenderer.projected_raster_layer): New. This must be implemented
749     by derived classes. It takes almost the same arguments as ProjectRasterFile
750     did and returns a projected image with mask and alpha data (if requested).
751     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
752     that check will be done in MapRenderer.projected_raster_layer(). This
753     also allows other implementations to use different projection code.
754    
755     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
756     Implementation of BaseRenderer.projected_raster_layer. Checks for
757     gdal support and wxPython version. Also handles exceptions from
758     ProjectRasterFile.
759    
760     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
761     and added a variable which can be set through the options argument
762     of ProjectRasterFile.
763    
764     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
765     Calls ProjectRasterFile and returns the result.
766     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
767     of calling projected_raster_layer() with different options.
768     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
769     wxPython version and all tests of masks and alpha channels. These are
770     now in test_projected_raster_layer().
771    
772 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
773    
774 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
775     doc-strings to comply with coding_guidelines.
776    
777     2005-02-17 Jan-Oliver Wagner <[email protected]>
778    
779 jan 2565 Docstring improvements and minor fixes for labellayer.
780    
781     * Thuban/Model/map.py:
782     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
783     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
784     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
785     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
786     doc string.
787     (Map.BoundingBox): Removed superfluous test for label_layer
788     and improved doc string.
789     (Map.TreeInfo): Added label_layer and improved sdo string.
790    
791     * Thuban/Model/label.py: Added import of _.
792     (Label, Label.__init__): Improved/added doc string.
793     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
794     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
795     Improved/added doc string.
796     (LabelLayer.AddLabel): Use already defined names for
797     align strings and improved doc string.
798     (LabelLayer.TreeInfo): New. Return the object data for
799     the tree view.
800    
801 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
802    
803     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
804     so that that wxproj doesn't crash. Added GUI support for selecting
805     alpha channel (opacity can't be selected yet).
806    
807     NOTE: If wxPython.h is including in future distribution packages
808     then it will not be necessary to have the files swigPtrConvertHack.h
809     and wxPython_int.h included with Thuban. This is hopefully
810     a temporary workaround.
811    
812     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
813     access to the macro wxCHECK_VERSION so that it will properly
814     generate a bit mask. There was a problem between wx2.4 and wx2.5
815     that this works around.
816    
817     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
818     of RasterLayer.MaskType.
819     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
820     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
821     specify none, a bitmap, or an alpha channel.
822     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
823    
824     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
825     Set the raster warping options for the mask based on the value
826     of RasterLayer.MaskType.
827    
828     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
829     deprecated calls to SetItemSelectedImage in favor of SetItemImage
830     with wxTreeItemIcon_Selected.
831    
832     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
833     an alpha channel for the mask.
834    
835     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
836     data if it is available and an alpha channel is supported under
837     the current version of wxPython.
838    
839     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
840     to select whether 1's or 0's select the desired portion of an image
841     in the bit mask. wx2.4 has a bug where the documentation is the opposite
842     from behavior.
843     (ProjectRasterFile): Only generate an alpha channel if the version
844     of wxPython is >= 2.5.3.
845    
846     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
847     When wxPython >= 2.5.3 use the special swig functions to decode an
848     object's address.
849    
850     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
851     based on the version of wxPython. If >= 2.5.3 use the special swig
852     functions from wxPython to decode wxPython objects, otherwise use
853     the old method of retrieving the address from the object __repr__ string.
854    
855     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
856     Unnecessary code was removed to make it smaller.
857    
858     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
859     Add tests for returning an alpha channel.
860    
861     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
862     tests that used removed functions UseMask and SetUseMask
863    
864    
865 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
866    
867 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
868     Daniel Calvelo Aros.
869    
870     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
871     (QueryTableFrame.__init__): Pass the size of a spacer as a single
872     item.
873    
874     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
875     (ProjFrame.build_dialog): Pass the size of a spacer as a single
876     item.
877    
878     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
879     size of a spacer as a single item.
880    
881     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
882     size of a spacer as a single item.
883    
884     2005-02-08 Bernhard Herzog <[email protected]>
885    
886 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
887     better with 2.5 while still keeping compatibility with 2.4. There
888     are still problems with 2.5, though.
889    
890     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
891     of a spacer as a single item.
892    
893     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
894     from wxControl
895    
896     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
897     2.5, add an implementation of the GetFirstChild method that does
898     not require the second parameter.
899     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
900     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
901     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
902     pass the second parameter to GetFirstChild
903    
904 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
905    
906     * Extensions/ogr/ogrshapes.py: Removed some print commands.
907    
908     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
909     additional menu but appears as a possibility in the menu Map.
910    
911 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
912     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
913     and PYTHON_ERRF since they were no longer necessary.
914    
915 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
916     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
917     Enable translation for message string.
918    
919 joey 2555 2005-02-06 Martin Schulze <[email protected]>
920    
921     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
922     the arguments of the contstructor to fit the global scheme
923    
924 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
925    
926     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
927     some dialogs needed to start ogr.
928    
929     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
930     warnings.
931    
932     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
933     encoding warnings.
934    
935 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
936    
937 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
938     mask is packed into a bit array. It's now slightly faster.
939    
940     2005-01-28 Jonathan Coles <[email protected]>
941    
942 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
943     default to true.
944    
945     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
946     code that loads the state of the layer's use_mask flag. Its
947     usefulness is still being debated.
948    
949     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
950     code that saves the state of the layer's use_mask flag. Its
951     usefulness is still being debated.
952    
953     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
954     options to ProjectRasterFile based on the state of layer.UseMask().
955     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
956     quit is there is a problem projecting.
957     (BaseRenderer.draw_raster_data): Change the documentation to
958     describe the new format (XBM) that the mask data will be in.
959    
960     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
961     data is in XBM format when format='RAW' which means it doesn't
962     need to be converted to a wxImage before being used as a mask
963     for a wxBitmap. Assume that if format != 'RAW' that the image
964     data and mask data are in the same format.
965    
966     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
967     and a mask is requested, convert the alpha band to a bit array in
968     XBM format. if an alpha channel is requested, simply return the
969     data in the alpha band. Provide better error handling by returning
970     python error messages (also fixes RT #2947).
971     (ProjectRasterFile): Support multiple mask options, rather than simply
972     a flag indicating that a mask should or should not be used. Provide
973     better error handling by returning python error messages.
974    
975     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
976     Add mask data to test.
977    
978     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
979     should use the mask by default.
980     (TestLayerModificaton.test_raster_layer): Test that a layer should use
981     the mask by default.
982    
983     * test/test_load.py (TestRasterLayer.test): Remove testing for
984     use_mask flag in file.
985    
986     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
987     for use_mask in file.
988    
989     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
990    
991 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
992    
993     Add a new dialog box for raster layers. The dialog box allows
994     the user to toggle a mask that is generated by ProjectRasterFile
995     and is used to only draw the real parts of the projected image.
996    
997     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
998     Instruct the warping code to generate a mask if the raster layer
999     requests one.
1000     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1001    
1002     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1003     obsolete optional mask argument.
1004    
1005     * Thuban/UI/classifier.py (Classifier): Change the parent class
1006     to LayerProperties and rework the code to support layout calls
1007     from the parent.
1008     (Classifier.dialog_layout): New. Layout the dialog box.
1009     (Classifier.map_layers_removed): Removed. Moved to parent class.
1010     (Classifier.map_replaced): Removed. Moved to parent class.
1011     (Classifier._OnTry): Renamed to OnTry to support parent class.
1012     (Classifier.OnClose): Removed. Supplied in parent class.
1013     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1014     (Classifier._OnOK): Renamed to OnOK to support parent class.
1015     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1016    
1017     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1018     dialog boxes.
1019    
1020     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1021     raster layer properties.
1022    
1023     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1024     with the non-simple version supplied with gdal. This allows added
1025     features such as creating an alpha band.
1026     (GetImageData): Generate a mask array from the alpha band that is
1027     generated by gdal if the user has selected it. Try to support images
1028     that have more than three bands, such as images with RGB plus an
1029     alpha band.
1030     (ProjectRasterFile): Convert python argument for mask and tell
1031     gdal to enable or disable an alpha band.
1032    
1033     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1034     describing what kind of layer the class is. Defaults to "Unknown",
1035     but should be overridden by subclasses.
1036     (Layer.Type): New. Override base class method.
1037     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1038     data from gdal for display in the properties dialog.
1039     (RasterLayer.Type): New. Override base class method.
1040     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1041     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1042     (RasterLayer.ImageInfo): New. Return extra information about the image.
1043    
1044     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1045     the mask information.
1046    
1047     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1048    
1049     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1050     Classifier classes as dialogs to use with the proper layer types.
1051    
1052     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1053     Fix test.
1054    
1055     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1056     (TestLayerModification.build_path): New. Support function.
1057     (TestLayerModification.test_raster_layer): New. Test new methods.
1058    
1059     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1060    
1061     * test/test_load.py (TestRasterLayer): Add tests for mask.
1062    
1063     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1064    
1065     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1066     obsolete optional mask argument.
1067    
1068 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1069    
1070     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1071     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1072     RowOrdinalToId() and ReadRowAsDict().
1073    
1074     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1075     layers for existing database connections.
1076    
1077     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1078    
1079    
1080 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1081    
1082     * Doc/manual/thuban-manual-de.xml: More translations.
1083    
1084 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1085    
1086     Rework the status bar updates a bit to make sure the message about
1087     the projections is produced at the right times.
1088    
1089     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1090     New class variable with messages that may require a status bar
1091     update.
1092     (MainWindow.view_position_changed)
1093     (MainWindow.update_status_bar): Rename from view_position_changed
1094     to update_status_bar. It's meaning has changed now that it may
1095     also generate messages about problems with projection settings.
1096     (MainWindow.__init__): Use the new update_status_bar_messages
1097     class variable to subscribe update_status_bar
1098     (MainWindow.set_position_text): Update doc-string. This method
1099     has to be renamed at some point. See doc-string and comments.
1100     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1101     messages in update_status_bar_messages
1102    
1103     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1104     class attribute. map messages to be forwarded by the viewport.
1105     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1106     the messages in forwarded_map_messages
1107    
1108 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1109    
1110     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1111     doc-string
1112     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1113     different name for the initialization SQL file.
1114    
1115 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1116 jan 2542
1117     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1118     a projection and returns a formatted string representing the
1119     parameters to feed to gdalwarp. This function eliminates
1120     redundancy in draw_raster_layer().
1121     (BaseRenderer.render_map_incrementally): Removed the optimization which
1122     drew the top most raster layer first and then only those vector-
1123     based layers that are above it. With the support for transparency
1124     this optimization breaks correct behaviour.
1125     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1126     future enhancements to raster layer bounding box. The old behaviour has
1127     not changed. Also, change calling parameters to draw_raster_data()
1128     to specify new RAW data format and mask.
1129     (BaseRenderer.draw_raster_data): Change signature to include an optional
1130     parameter for mask information. Change documentation to mention
1131     support for new parameter and added option for RAW data format.
1132     The data argument is now a list of [width, height, data].
1133    
1134     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1135     mask parameter. Add new condition for RAW format, which
1136     significantly reduces rendering time. Add condition for
1137     mask parameter.
1138    
1139     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1140 jonathan 2537 data array of RGB values from the projected image returned from
1141     the gdal warping functions. In the case of palette based images, it
1142 jan 2542 converts the NO_DATA index to the mask color.
1143     (ProjectRasterFile): Removed all custom memory driver references
1144     and replaced it with the standard in-memory dataset provided
1145     by gdal. The return data is no longer a BMP file, but an array
1146     of RGB values, one set triple per pixel.
1147 jonathan 2537
1148     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1149     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1150     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1151    
1152 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1153     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1154     files. These are obsolete with the new version of gdalwarp.cpp
1155    
1156     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1157     Updated signature.
1158     (TestBaseRenderer.test_raster_no_projection): Changed the test
1159     data to be data in the uncompressed RAW format returned from
1160     ProjectRasterFile.
1161    
1162 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1163    
1164 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1165     string available for i18n.
1166 jan 2535
1167 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1168    
1169     * Resources/Projections/defaults.proj: Ruin the speling of the
1170 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1171     It's the wrong thing to do in the long run, but it's necessary for
1172     those users until that bug is fixed. Otherwise the projection
1173     dialog segfaults. Better to annoy some Lambert-93 users with a
1174     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1175 russell 2532
1176 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1177    
1178 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1179     docstring and comment that the warning code here is a hack.
1180 bernhard 2531
1181 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1182    
1183 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1184     user about misprojected layers when their lat/lon bounding
1185 russell 2529 box exceeds rational lat/lon values.
1186    
1187 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1188    
1189 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1190 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1191     when getdefaultlocale returns None. Thanks to Bernhard H. .
1192 jan 2542
1193 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1194    
1195 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1196 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1197 jan 2542
1198 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1199    
1200 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1201     OnRangeText(0) to work around a different in wx Behaviour noticed
1202     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1203    
1204 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1205    
1206     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1207 bernhard 2525 None. (Fixes rt#2910.)
1208    
1209 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1210    
1211     New Extension: mouseposition
1212     Tool to collect mouse click positions (map coordinates) in a dialog.
1213    
1214     * Extensions/mouseposition/__init__.py: New, extension registration
1215    
1216     * Extensions/mouseposition/mouseposition.py: New, implements the
1217     dialog and adds a tool to Thuban mainwindow.
1218    
1219     * Extensions/mouseposition/position.xpm: New, icon for tool.
1220    
1221 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1222    
1223     * Doc/manual/thuban-manual-de.xml: More translations.
1224    
1225 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1226    
1227     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1228     Fix indention bug.
1229    
1230 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1231    
1232     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1233 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1234 frank 2517 is not part of the layers Classification.
1235    
1236 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1237    
1238 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1239     BugFix 2883: Former implementation only worked on classified point
1240     layers: KeyError was raised, now use the default size if field is None.
1241 frank 2515
1242 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1243    
1244     svgexport 1.0.0cvs: Fixed label export.
1245    
1246     * Extensions/svgexport/test/test_svgmapwriter.py:
1247     class TestSVGRenderer(): New class; new test test_label_font().
1248    
1249     * Extensions/svgexport/svgmapwriter.py
1250     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1251     makes test_label_font happy.
1252    
1253     * Extensions/svgexport/TODO: crossed out fixed label export item.
1254     Added item for options.
1255    
1256     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1257    
1258 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1259    
1260 jan 2512 Middle mouse button pans.
1261 russell 2511
1262 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1263     OnMiddleDown and OnMiddleUp events.
1264     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1265     previously used tool.
1266     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1267     pressing the middle mouse button.
1268    
1269 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1270    
1271     * Doc/manual/thuban-manual-de.xml: More translations.
1272    
1273 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1274    
1275     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1276     \n to stderr after the warnings. Thanks to Russell Nelson.
1277    
1278 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1279    
1280     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1281     Bernhard (coding guidelines etc.). Additionally it is now possible to
1282     display shapefiles containing feature collections (e.g.polygons
1283     with holes). Works with gdal 1.2.1 now.
1284    
1285     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1286     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1287     tests are skipped now.
1288    
1289     * Extensions/ogr/ogrstart.py: Fixed some typings.
1290    
1291 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1292    
1293     * Extensions/svgexport/TODO: updated to add support for
1294     raster layers and labels for 1.0.1.
1295    
1296     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1297     Issue a warning now.
1298    
1299 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1300    
1301 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1302     the application down the pipe.
1303    
1304     2004-12-19 Bernhard Reiter <[email protected]>
1305    
1306 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1307    
1308     * Extensions/svgexport/svgmapwriter.py:
1309     DrawPath() renamed to DrawPolygonPath(),
1310     added documentation, improved comments and variable names.
1311    
1312     * Extensions/svgexport/svgmapwriter.py,
1313     Extensions/svgexport/test/test_svgmapwriter.py:
1314     All using DrawPolygonPath() now, the default parameter closed=True
1315     omitted.
1316    
1317     * Extensions/svgexport/test/test_svgmapwriter.py:
1318     renamed test_polygon_opened() to test_polyline()
1319     renamed test_transparent_polygon() to test_transparent_polyline()
1320    
1321 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1322    
1323     Some fixes of gns2shp extension.
1324    
1325     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1326     package.
1327    
1328     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1329     dynamically.
1330    
1331     * Extensions/gns2shp/test/README: Simplified description how to test.
1332    
1333     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1334     fixed some dimensions of fields according to the GNS documentation
1335     which seems to change undocumented.
1336     Now killing trailing \n and/or \r from MODIFY_DATE.
1337     This fixes RT#2453.
1338    
1339 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1340 bernhard 2480
1341 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1342    
1343     * Extensions/svgexport/test/test_svgmapwriter.py:
1344     Added new tests: test_export_polygon_with_hole()
1345     and test_polygon_with_hole().
1346    
1347     * Extensions/svgexport/svgmapwriter.py
1348     (draw_polygon_shape()): Uses DrawPath correctly now.
1349    
1350     * Doc/manual/thuban-manual.xml: Added documentation for stable
1351     extention svgexport.
1352     * Doc/manual/thuban-manual-de.xml: Copied English section about
1353     svexport over.
1354    
1355 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1356 bernhard 2482
1357     * Extensions/svgexport/svgsaver.py,maplegend.py:
1358     Moved from experimental to stable extension menu.
1359    
1360     * Extensions/svgexport/TODO: updated.
1361    
1362    
1363     2004-12-18 Bernhard Reiter <[email protected]>
1364    
1365 bernhard 2481 Added Extensions/svgexport/TODO
1366    
1367     2004-12-18 Bernhard Reiter <[email protected]>
1368    
1369 bernhard 2480 Refactored in svgexport:
1370     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1371    
1372     * Extensions/svgexport/svgmapwriter.py
1373     Added verbosity level 3 to print out polygon points.
1374     (class Point): added __repr__
1375     (class Brush, __str__()): Added space after ,.
1376     (DrawPolygon): Renamed to DrawPath()
1377     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1378     (DrawLines): Using DrawPath now.
1379    
1380     * Extensions/svgexport/test/test_svgmapwriter.py:
1381     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1382     inside another list. Adapted test data with a newline before "M".
1383    
1384     2004-12-18 Bernhard Reiter <[email protected]>
1385 bernhard 2479
1386     Refactored svgexport tests: 9 double tests runs eliminated;
1387     code size reduced by 8 lines.
1388    
1389     * Extensions/svgexport/test/test_svgmapwriter.py:
1390     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1391     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1392     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1393     this fixed the double running of the nine tests of TestVirtualDC.
1394     (class TestVirtualDC): Using self.dc and self.file from setUp().
1395    
1396 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1397    
1398     Two windows specific fixes ported from thuban-1­0-branch:
1399    
1400     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1401     instead of getlocale because getlocale doesn't return a usable
1402     encoding name on a german windows 2000
1403    
1404     * setup.py: windows build: Removed the absolute path names and
1405     made all prfixes relative to the directory containing setup.py.
1406     Makes it a little easier to adapt to a different system.
1407    
1408 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1409    
1410 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1411 bh 2472 Fixes RT#2299
1412    
1413     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1414    
1415     * test/postgissupport.py
1416     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1417     table to "roads-multi" because it now uses MULTILINESTRING
1418     geometries and introduce a new "roads" table that uses LINESTRING
1419     (coords_to_multilinestring): Make the doc string more precise
1420     (coords_to_linestring): New. Create a LINESTRING WKT
1421     representatin
1422     (wkt_converter): Add coords_to_linestring
1423     (upload_shapefile): Rephrase the doc-string a bit.
1424    
1425     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1426     (LineStringTests)
1427     (TestPostGISShapestoreLineString)
1428     (TestPostGISShapestoreMultiLineString): Split
1429     TestPostGISShapestoreArc into a base class LineStringTests and two
1430     derived classes TestPostGISShapestoreLineString for LINESTRING
1431     geometries and TestPostGISShapestoreMultiLineString for
1432     MULTILINESTRING geometries. Most test methods are in the base
1433     class with the exception of tests that explicitly check the raw
1434     format.
1435    
1436     2004-12-16 Bernhard Herzog <[email protected]>
1437    
1438 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1439    
1440     * test/postgissupport.py (find_postgis_sql): Different postgis
1441     versions put the postgis.sql file into slightly different places
1442     so we have to look in both. The updated doc string describes this
1443     is more detail.
1444    
1445     * test/test_postgis_db.py
1446     (TestPostGISSpecialCases.test_column_name_quoting): The return
1447     value of UniqueValues is unsorted, so it has to be sorted for
1448     comparison.
1449    
1450     2004-12-16 Bernhard Herzog <[email protected]>
1451    
1452 bh 2470 Fix for RT#2237
1453    
1454     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1455     panel to be shown is the UnknownProjPanel disable the OK and Try
1456     buttons. Otherwise enable them.
1457     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1458     the parameters. In that case __GetProjection also returns None
1459     now.
1460    
1461 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1462    
1463 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1464     minimum number of classes to 2. The calculate_quantiles needs at
1465     least two and raises an exception otherwise.
1466     Fixes RT#2549
1467    
1468     2004-12-15 Bernhard Herzog <[email protected]>
1469    
1470 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1471     so that it returns a result for select statements.
1472     (PostgreSQLServer.server_version): New. Return the version of the
1473     server software.
1474     (PostgreSQLServer.require_authentication): The format of
1475     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1476     server version and generate the file in the correct format
1477    
1478     2004-12-15 Bernhard Herzog <[email protected]>
1479    
1480 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1481     in the doc string and rephrase it a little.
1482    
1483 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1484    
1485     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1486     session has been loaded successfully. The check is called by the relevant
1487     tests after executing load_session().
1488    
1489 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1490    
1491 bh 2454 Make sure the region used to determine which shapes are visible
1492     actually matches the region on the printed page. If this isn't
1493     done properly some shapes might not be printed.
1494     Fixes RT #2692
1495    
1496     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1497     renderer has to be at the same position as the mapregion
1498    
1499     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1500     has to be moved by (self.shiftx, self.shifty) too.
1501    
1502     2004-12-13 Bernhard Herzog <[email protected]>
1503    
1504 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1505     generated python code which leads to exception in the __del__
1506     method when the constructor fails. See the comments in the code
1507     for more details.
1508    
1509     * libraries/pyprojection/Projection.py: Updated from Projection.i
1510     with SWIG.
1511    
1512     2004-12-13 Bernhard Herzog <[email protected]>
1513    
1514 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1515     (TestAltPath.test_02_path_error_fix_from_list)
1516     (TestAltPath.test_05_path_error_fix_from_list_changed)
1517     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1518     is destroyed in tearDown, so there's no need to do it in a test
1519     case.
1520    
1521     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1522     debug print
1523    
1524     2004-12-13 Bernhard Herzog <[email protected]>
1525    
1526 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1527     (TestDrawSplines.setUp): Do not use super with the unittest
1528     classes because in Python 2.2 they're still old-style classes.
1529    
1530 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1531    
1532     Alternative Path feature: When loading a (moved) session where
1533     shapefiles cannot be found, ask the user. Use the specified path
1534     if further shapefiles are missing. However, ask the usr for confirmation
1535     in such cases.
1536    
1537     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1538     in load_session()
1539     (Shapefile_CallBack): Helper, implements controllable callback.
1540    
1541     * Thuban/UI/application.py (ThubanApplication.OnInit):
1542     Added "alt_path" to self.path
1543     (ThubanApplication.OpenSession): Added shapefile_callback as second
1544     callback similar to db_connection_callback.
1545     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1546     shapefile_callback. In addition to raising the dialog the control of
1547     self.path('alt_path') is implemented here.
1548    
1549     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1550     (SessionLoader.open_shapefile): Open shapefile, eventually with
1551     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1552     formerly used in start_fileshapesource()/start_layer().
1553     (SessionLoader.start_fileshapesource): Call open_shapefile().
1554     (SessionLoader.start_layer): Call open_shapefile().
1555     (load_session): Added shapefile_callback.
1556    
1557     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1558     feature (search / check).
1559    
1560     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1561    
1562 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1563    
1564 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1565    
1566     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1567     (def draw_point_shape): new parameter size defaults to 2 as before.
1568     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1569     Added draw_func call with size when dealing with a point layer.
1570    
1571     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1572    
1573     2004-12-11 Bernhard Reiter <[email protected]>
1574    
1575 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1576     to raise the chance that the line length will be below 255 characters,
1577     as recommended by REC SVG 1.1 in section 8.3.1.
1578    
1579     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1580     Adding \n before L's and changed whitespace handling.
1581    
1582     * Extensions/svgexport/test/test_svgmapwriter.py:
1583     Adapted tests to new whitespace handling of DrawPolygon.
1584    
1585     2004-12-11 Bernhard Reiter <[email protected]>
1586    
1587 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1588    
1589     * Extensions/svgexport/test/test_svgmapwriter.py:
1590     Removed test_drawbezier in favour of new test_drawspline3 and
1591     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1592     All only to test DrawSpline.
1593    
1594     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1595     New implementation now really using the strange algorithm of
1596     xfig 3.1's approximated splines and its conversion to postscript
1597     with one twist: SVG can do quadratic beziers, so skipped translation
1598     to cubic beziers.
1599     (TestWithDC): Typo in comment fixed.
1600    
1601 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1602    
1603     * Thuban/Model/classgen.py: Added missing character encoding
1604    
1605     * Extensions/wms/properties.py (OpenWMSProperties): removed
1606    
1607     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1608     support for get_srs_discrepancies() since there are no
1609     discrepancies anymore (was a thinko)
1610    
1611     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1612     format priority now that more formats are supported globally by
1613     the render engine.
1614    
1615 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1616     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1617     because it is not available in all versions of ogr
1618    
1619 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1620     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1621     global tests until a real one is commited.
1622    
1623 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1624    
1625     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1626     ogr. It is planned to add other vector formats.
1627    
1628     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1629    
1630 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1631    
1632     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1633     part of a (non-)fix to renable that the tests are always
1634     executed.
1635    
1636 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1637    
1638     * Extensions/svgexport/test/test_svgmapwriter.py:
1639     Added test_drawbezier() to test DrawSpline().
1640    
1641     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1642     Really implemented bezier drawing.
1643    
1644     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1645     to 0.9.1 because now the legend examples lines styles
1646     will be drawing with beziers.
1647    
1648 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1649    
1650     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1651     GIF as supported bitmap image formats (helpful for the WMS extension)
1652    
1653 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1654    
1655     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1656     Improved the test for the internal compare method
1657    
1658 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1659    
1660     * Thuban/UI/about.py (About.__init__): Added
1661     Norbert Solymosi for hungarian translation and Ole Rahn
1662     as contrbutor. Moved Bernhard Reiter from Contributor
1663     to Developer.
1664    
1665 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1666    
1667     * Extensions/svgexport/test/test_svgmapwriter.py:
1668     Removed Jan from author list as he did not change enough significant
1669     lines yet.
1670    
1671     * Extensions/svgexport/__init__.py: Added Bernhard as author
1672     of the Extension.
1673    
1674 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1675    
1676     * po/hu.po: New. Hungarian translation. Contributed
1677     by Norbert Solymosi.
1678    
1679 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1680    
1681     * Extensions/svgexport/test/test_svgmapwriter.py
1682     (Testobjectexport.test_transparent_polygon): Commented out some
1683     debug prints
1684    
1685 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1686    
1687     Fix broken tests for svg extension and added svg legend
1688     to Experimental menu.
1689    
1690     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1691     the test run correctly even if the extension is a package.
1692     Also removed the "import Thuban" which makes no sense.
1693    
1694     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1695     test module also be executed from the global test routine.
1696     This is done by looking for the absense of the DISPLAY variable.
1697    
1698     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1699     to Experimental menu since this module has yet not reached a stable
1700     status (ie. 1.0).
1701    
1702 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1703    
1704     * Extensions/svgexport/svgmapwriter.py:
1705     Added verbose variable and some logging depending on it.
1706     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1707     because counting i is not necessary.
1708     (class Pen, class Brush): Added simple __str__ methods.
1709     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1710     not exported to svg file) Note: holes still unhandled.
1711    
1712     * Extensions/svgexport/test/test_svgmapwriter.py:
1713     Made a baseclass TestWithDC for test needed a DC.
1714     Added tests for bug #2698 (transparent polygons are not
1715     exported to svg file):
1716     Testobjectexport.test_transparent_polygon()
1717    
1718     * Thuban/Model/base.py (UnsetModified):
1719     Fixed some typos in docstring.
1720    
1721     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1722     Added hints on the used algorithm for handling holes.
1723    
1724 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1725    
1726 jan 2412 Some face lifting for the examples.
1727    
1728     * Examples/__init__.py: Make this directory a package.
1729    
1730     * Examples/simple_extensions/__init__.py: Make this directory a package.
1731    
1732     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1733     menu to Examples menu.
1734    
1735     * Examples/simple_extensions/simple_command.py: Some more comments,
1736     minor changes.
1737    
1738     * Examples/simple_extensions/simple_tool.py: Minor changes.
1739    
1740     2004-11-20 Jan-Oliver Wagner <[email protected]>
1741    
1742 jan 2407 Changed way of extension registry for wms and added extension
1743     registry for umn_mapserver extension.
1744    
1745     * Extensions/wms/__init__.py: Added registry entry and the importing
1746     of the actual wms module. Included a test for the required PyOGCLib.
1747    
1748     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1749    
1750     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1751     importing of the actual umn mapserver management modules.
1752     Included a test for the required Python MapScript.
1753    
1754     2004-11-20 Jan-Oliver Wagner <[email protected]>
1755    
1756 jan 2403 Changed way of extension registry for importAPR, bboxdump
1757     and added extension registry for svgexport.extension registry for
1758     svgexport.
1759    
1760     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1761     of the actual importAPR module.
1762    
1763     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1764     __init__.py).
1765    
1766     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1767     »···of the actual bboxdump module.
1768    
1769     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1770     »···__init__.py).
1771    
1772     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1773     of the svgsaver module.
1774    
1775     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1776     to Experimental menu since this module has yet not reached a stable
1777     status (ie. 1.0).
1778    
1779 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1780    
1781     Now the hit test considers the size of point symbols.
1782    
1783     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1784     'size' defaulting to the previously fixed value 5.
1785     Extended doc-string.
1786     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1787     for symbols.
1788     Now the size of the largest point symbol is determined to find out
1789     about whether the point has been hit.
1790     This fixes the problem that only clicks inside a fixed distance of
1791     5 where found.
1792    
1793 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1794    
1795 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1796 jan 2395 selected symbols.
1797    
1798     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1799     Added consideration of the specific size of point symbols.
1800     The property for each point symbol is retrieved and the size applied
1801     for the rendering method.
1802     Added doc-string.
1803    
1804 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1805    
1806     Changed way of Extension Registry for gns2shp and profiling.
1807    
1808     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1809     __init__.py).
1810    
1811     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1812     of the actual gns2shp module.
1813    
1814     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1815     __init__.py).
1816    
1817     * Extensions/profiling/__init__.py: Added registry entry and the importing
1818     of the actual profiling module.
1819    
1820 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1821    
1822     * Extensions/svgexport/: Minor improvements to doc strings.
1823    
1824 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1825    
1826     Further elements for sizable point objects now
1827     making this feature usable though not yet complete.
1828    
1829     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1830     attribute 'size' for cldata when the shape layer is of point type.
1831     This also now make the test_load.py tests happy.
1832    
1833     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1834     gradient.
1835    
1836     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1837     ID_SELPROP_SPINCTRL_LINEWIDTH.
1838     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1839     (ID_SELPROP_SPINCTRL_SIZE): New Id.
1840     (SelectPropertiesDialog.__init__): Added a second spin control
1841     for the size in case the corresponding layer is of point type.
1842     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1843     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1844     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1845     and refresh preview.
1846    
1847    
1848    
1849 joey 2381 2004-10-04 Martin Schulze <[email protected]>
1850    
1851     * Extensions/wms/test/test_parser.py
1852     (TestWMSCapabilitiesParser.test_compareLists): Added missing
1853     self-test for compareLists()
1854     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1855     self-test for compareDicts()
1856 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1857     to verify the test routine fails with non-equal arguments
1858     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1859     to verify the test routine fails with non-equal arguments
1860 joey 2381
1861 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
1862    
1863 jan 2380 First elements for sizeable point objects.
1864    
1865     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1866    
1867     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1868    
1869     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1870     of a corresponding argument is given.
1871     (TestSymbolSize): New. Test the size attribute of cldata.
1872    
1873     * Thuban/Model/classification.py: Removed some trailing whitespaces.
1874     (ClassGroupProperties.__init__): Set default size.
1875     (ClassGroupProperties.SetProperties): Set the size.
1876     (ClassGroupProperties.GetSize): New. Return the size.
1877     (ClassGroupProperties.SetSize): New. Set the size.
1878     (ClassGroupProperties__eq__): Compare also size.
1879     (ClassGroupProperties__repr__): Print also size.
1880    
1881     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1882     the size attribute.
1883    
1884     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1885     Also, now there is a return value that indicates whether the drawing
1886     size exceeded the given rect extent and if so the new extent.
1887     Finally, point objects are drawn depending on the size. If either
1888     the width or height is exceeded, the new extent is returned.
1889     (ClassRenderer.Draw): Now when calling the previewer drawing function,
1890     evaluate the return value and, if not None, adapt the grid widget size
1891     accordingly and redraw again.
1892    
1893     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1894     If the draw function is for points, call it with the size as additional
1895     parameter.
1896     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1897     the size. Compute the radius using the size.
1898    
1899     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1900     that Thuban supports size, apply this correctly.
1901    
1902     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1903    
1904     2004-10-03 Jan-Oliver Wagner <[email protected]>
1905    
1906 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
1907     Map chapter.
1908    
1909 joey 2368 2004-10-01 Martin Schulze <[email protected]>
1910    
1911     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1912     argument for general use through properties-dialog selector
1913    
1914     * Thuban/UI/classifier.py: Register properties dialog classes for
1915     both provided layer classes/types.
1916    
1917     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1918     map can be retrieved through the parent which is passed to the
1919     constructor anyway and doesn't require an argument of its own,
1920     required for the unification of arguments for general use through
1921     properties-dialog selector.
1922     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1923     whether a dialog is already opened (and raising it to the users
1924     attention) and creating a new dialog into a function of its own
1925     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1926     method
1927     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1928     global registration of properties dialog classes (which are indeed
1929     layer-specific).
1930    
1931     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1932     for general use through properties-dialog selector, the map can be
1933     retrieved through the parent and doesn't require an argument of
1934     its own.
1935    
1936     * Extensions/wms/wms.py: Register the properties dialog class for
1937     the provided WMS layer
1938    
1939 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
1940    
1941     New feature: Registry for Extensions.
1942    
1943     * Thuban/UI/extensionregistry.py: This module defines a registry for
1944     Extensions.
1945    
1946     * Thuban/UI/about.py (About.__init__): Added description
1947     of the registered extensions with all of the information.
1948    
1949     * Thuban/Model/extension.py (Extension): Improved doc-string.
1950    
1951     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1952     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1953     Extensions/wms/wms.py: Added registration of the extension.
1954    
1955 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
1956    
1957     More fixes to svgexport to make used ids unique and
1958     conforming to XML's Name production.
1959    
1960     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1961     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1962     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1963     Added Bernhard R. as author.
1964     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1965     concatenation char now (makes test_make_ide_nosetbaseid() valid).
1966     Also transform second id part with "%d" and catch the TypeError
1967     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1968     Corrected typo inBernhard's author line.
1969     (SetBaseID): Return the transformed base id. Transform characters
1970     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1971     import binascii. If to be set string starts with "xml" or so, add "t".
1972     (draw_shape_layer_incrementally): use the returned value of SetBaseID
1973     for used_baseids checks.
1974    
1975 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
1976    
1977     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1978     Remove a debug print and some tab characters.
1979    
1980 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
1981    
1982     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1983     (SetBaseID, SetID, make_id): Improved docstring comments to explain
1984     the interaction of the three functions and the XML id contrains.
1985    
1986 bernhard 2352
1987 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
1988    
1989 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1990     Module.
1991    
1992     * Doc/README: Added info on ThubanModel.xmi.
1993    
1994     2004-09-23 Jan-Oliver Wagner <[email protected]>
1995    
1996 jan 2346 * Doc/README: New. Some info about how to generate technical
1997     documentation from the source code.
1998     This text was send to the Thuban developer mailing list on
1999     September 21st 2004 by Bernhard Reiter.
2000    
2001 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2002    
2003     Improved the svgexport to only use unique ids. Will issues
2004     an error message dialoge when two layer names are the same.
2005     ShapeIDs are now added with a dash within the svg ids.
2006    
2007     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2008     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2009     (TestSVGRenderer): New test class with test_make_in() and
2010     test_check_for_layer_name_clash()
2011     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2012     and draw_shape_layer_incrementally() to not use a baseid twice,
2013     satisfying test_check_for_layer_name_clash()
2014     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2015     test_make_in().
2016     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2017     and wxICON_HAND.
2018     (write_to_svg): Put dc and rendering in a try statement and on
2019     catching SVGmapWriterError notify the user and delete the target file.
2020    
2021 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2022    
2023     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2024    
2025 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2026    
2027     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2028     small bug with the line color. Now the line color will now only set
2029     if it is set in Thuban an not Transparent.
2030    
2031     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2032     deleting the layers from mapfile. Now all layers will delete backwards
2033     from the last.
2034    
2035 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2036 silke 2338
2037 silke 2339 * Thuban/Model/layer.py:
2038     Fixes bug in projection handling: Otherwise very large region might not
2039     have valid values in the layer's projection.
2040    
2041     2004-08-20 Silke Reimer <[email protected]>
2042    
2043 silke 2338 * Thuban/UI/about.py:
2044     small changes to be consistent with coding style.
2045    
2046 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2047    
2048     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2049     Adjusted a comment
2050    
2051 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2052 silke 2334
2053 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2054     too many and too enhanced imports of locale
2055    
2056 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2057    
2058     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2059 silke 2339 function unicodeToLocale() to convert special characters to users
2060     locale encoding
2061 silke 2334
2062 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2063    
2064     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2065     lower case letter'
2066    
2067 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2068    
2069     * ChangeLog: Rewrite the last ChangeLog entry to follow
2070     the standard way.
2071    
2072     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2073     the function where it is needed, because it don't works if it stands
2074     at the beginning.
2075     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2076     numclasses from the mapscript will be used.
2077     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2078     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2079     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2080     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2081     (MF_Map.create_new_layer): New. A new Layer is created and associated
2082     with the mapscript object.
2083     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2084     the mapscript.
2085     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2086     linked to the layer in thuban, else the layerobject linked to the
2087     thubanlayer will be used.
2088     AnnotationLayer will now store the filename of the shapefile.
2089     (MF_Map.remove_layer): If a layer is removed the associated object
2090     must be set new.
2091    
2092     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2093     layers which are exists in thuban to the mapobj. All removed Layers
2094     will be removed from the mapobj.
2095     Added comments to all functions.
2096     (thuban_to_map): No layer will be removed here.
2097    
2098     * Extensions/umn_mapserver/mf_handle.py
2099     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2100     Layersettings for the mapserver kann be edited.
2101    
2102     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2103     imported, will be linked with the associated MF_Layer.
2104     (import_mapfile): All layers, which are not selected, will be removed.
2105     Disable the "import layer from mapfile" menu option.
2106    
2107     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2108     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2109     layer on permanently.
2110    
2111 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2112    
2113 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2114     New. This function removes all metadata
2115     (MF_Layer.set_group): New. Set the group setting.
2116     (MF_Layer.get_group): New. Get the group setting.
2117     (MF_Map): Removed the extra numlayers variable, used the mapscript
2118     parameter instead.
2119     (MF_Map.get_numlayers): New. This get numlayers.
2120     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2121 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2122     if the object is an instance. Also added the annotation layer here to
2123     export, but only the layer is created in the mapfile.
2124    
2125 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2126     the check if a mapobj exist, because its not needed anymore. The
2127     export function is only available if a mapobj exist.
2128     Use the new function to remove all layers.
2129 jschuengel 2323
2130 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2131     option and the metadata button. The layer dialog is temporary disabled.
2132     (Metadata_CustomDataTable): Added some functions to show the grid
2133 jschuengel 2323 correct.
2134    
2135 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2136     the number of layer from import_mapfile to this function.
2137     (AnnotationLayer): New. This Class shows the Annotation layer in
2138     thuban. The layer don't do anything. It's only to show the layer
2139     and to save the layer order.
2140     (add_annotationlayer): New. Import an annotation layer to thuban.
2141     (select_layer2import): New. Import only layers to thuban and not
2142     the other settings like projection or scalebar.
2143     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2144     create_new_mapfile functions from mf_handle.py to mf_import.py.
2145 jschuengel 2323
2146     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2147     parameter to the roads and cultural layers. Also added a new
2148     Annotation Layer for the cultural points.
2149    
2150     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2151     option for the annotation layer.
2152    
2153     * Extensions/umn_mapserver/sample/index.html: Added the start
2154     parameter for the annotation layer.
2155    
2156 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2157    
2158     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2159     translation completed.
2160    
2161     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2162     Fixed unprecise description for Save Session.
2163    
2164 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2165    
2166     Started translation of Users Manual into german.
2167    
2168     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2169    
2170     * Doc/manual/Makefile: Added build instructions for german
2171     users manual.
2172    
2173     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2174    
2175 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2176    
2177     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2178     functions. Now all metadata will handle by the function and its not
2179     needed to initialize it from outside. Therefor the associated mapobj
2180     will be stored in the Metadata Object. So we can use the special
2181     functions from the associated mapobj to get the Metadata.
2182     Therefor all initialization code for the metadata is removed from the
2183     other classes.
2184     (MF_Layer): Added a function to get the metadata object.
2185     (MF_Map): Added a function to set the mappath, the path where
2186     the mapfile ist stored.
2187    
2188     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2189     to set the extent in the mapfile. Now the code is set by the displayed
2190     data in the Thuban-view.
2191     (export_mapfile): The shapepath is now set empty, until relative
2192     pathnames are supported.
2193    
2194     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2195     metadata. Yet only mapfile metadata are supported. Layer and class
2196     supported are not implemented.
2197     Added a dialog to handle layer informations. The dialog only shows the
2198     selected layer at the moment.
2199    
2200     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2201     code for setting the extent in thuban. Now the extent is set to the
2202     given extent from the mapfile.
2203     Fixed a logical mistake. Now the extent is set when realy a layer is
2204     loaded, and not if one is selected to load.
2205    
2206     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2207     move the shown map in the browser.
2208    
2209     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2210     line to the mapobj and added metadata to the political layer.
2211    
2212     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2213     for Metadata.
2214    
2215 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2216    
2217     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2218     ClassMapper
2219    
2220     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2221     case for the new ClassMapper
2222    
2223    
2224 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2225    
2226 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2227     visible extent of the map in projected coordinates
2228    
2229     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2230     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2231     tests.
2232     (SimpleViewPortTest.test_visible_extent): New. The real test for
2233     VisibleExtent()
2234    
2235     2004-07-22 Bernhard Herzog <[email protected]>
2236    
2237 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2238     function when running asa script.
2239    
2240 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2241    
2242     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2243     Removed the old "import Thuban.UI.mainwindow" code.
2244     (tbextent_to_map): Removed the extra function and at the code direct
2245     to "thuban_to_map" function.
2246     (write_creatorcomment): Added. Now a short comment is added to the
2247     beginning of an generated mapfile.
2248     (export_mapfile): Now the Path and filename are saved in to variables,
2249     and not together in one variable. This is needed for the new
2250     write_creatorcomment function.
2251    
2252     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2253     import module "re". Also added Range and the ClassGroupRange import
2254     from Thuban. Both are needed for the new range expression import.
2255     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2256     style from a given mapfile expression.
2257     (added_rasterlayer): Make some small code changes. The shapepath is
2258     now stored in an extra variable and the clazz_name is set empty if no
2259     class name set in the mapfile.
2260     Changed the Error message for Range Expressions, becaus the new
2261     function create a error string which will be shown in the dialog.
2262    
2263     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2264     range expression import.
2265 jan 2312
2266 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2267    
2268     * Extensions/umn_mapserver/README: Added hint that
2269     installation as root can be avoided. Removed all tabs.
2270    
2271 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2272    
2273     * test/test_viewport.py
2274     (ViewPortTest.test_changing_map_projection): Check that changing
2275     the projection of an empty map shown in a viewport doesn't lead to
2276     exceptions in the viewport's handler for the
2277     MAP_PROJECTION_CHANGED messages
2278    
2279     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2280     try to keep the same region visible when the map actually contains
2281     something
2282    
2283 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2284    
2285     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2286     mappath directly from the mapobj. Is needed because of the changes
2287     in mf_import.py.
2288     (MF_Layer.add_thubanclass): Added a new comment.
2289     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2290     mapobj is empty there is no extent get from thuban an so no one can
2291     set to th mapobj.
2292    
2293     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2294     the discription.
2295     Split the funktion in to three smaller ones. The new functions are
2296     add_rasterlayer, add_polygonlayer and select_layer2import.
2297     Removed the mapfilepath and filepath initialisation, because its know
2298     include in the new functions.
2299     Now nothing will be imported if cancel is pressed in the
2300     layer choice dialog.
2301    
2302 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2303    
2304     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2305     import.
2306     (MF_Symbolset): Removed the extra variable for numsymbols.
2307     (MF_Class.__init__): Added a comment to the exception clause.
2308     Removed the extent init, because it was not needed anymore.
2309     (MF_Layer.add_thubanclass): Added the code to set the class name to
2310     the expression value from thuban if no label is defined.
2311     Added the code to export Range expressions from thuban to the mapfile.
2312     (MF_Map.set_extent): Removed the exception and replace it by some if
2313     code. If the size of a map is not defined the size will be set to 1,1.
2314     This is necessary because if the extent is set, mapscript checks if
2315     the size is greater than zero.
2316     (MF_Web): Added the get and set function for the template.
2317    
2318     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2319     if a mapobject exists and used it to set the status of the menu items.
2320     If no mapfile exists the settings could not be edditied.
2321     Define after which menuitem the exportitem will include.
2322    
2323     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2324     Thuban.UI.mainwindow clause, because it is not needed.
2325     Added the command Refresh() to all "OnChangeColor()" functions,
2326     because the color preview window was not updated on a color change.
2327     Added the function to check if a mapobject exists and used it to set the
2328     status of the menu items. If no mapobject exists the settings could not
2329     be edditied.
2330     (Map_Dialog): Moved the imagetype selector from the
2331     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2332     (Web_Dialog): Removed the name label and added the template textbox.
2333    
2334     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2335     the exception handling on loading the layers by an if statement. It
2336     is not necessary to us the exception there.
2337     The Filepath creation now use os.path.join to build the path.
2338    
2339     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2340     definition from global to the setUp function. Now the testMap will
2341     initialize new on each test.
2342    
2343     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2344     classes in the Line Layer, to test logical Expressions.
2345     Set the status of the class "Point9" in the Point Layer to off
2346    
2347 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2348    
2349     * Thuban/UI/baserenderer.py
2350     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2351     optimization that tries not to draw layers under a raster layer.
2352     The bug was harmless. All it effectively did was to produce The a
2353     strange messages about not being able to draw Layer instances for
2354     all vector layers below a raster layer which would be invisible
2355     anyway because the raster layer currently always covers the entire
2356     window
2357    
2358 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2359    
2360     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2361     a list of supported outputformats. This formats are not alle supported
2362     because there is no possibility to get the outputformat without the
2363     name known. Make some formal changes to the code.
2364     (MF_Map.set_name()): Fixed a bug if the name is None.
2365    
2366     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2367     statement, because its not needed anymore. The Outputformat is now
2368     given as string from the object. Make some formal changes to the code.
2369    
2370     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2371     most of the new setting which were added during the last changes.
2372     Removed the MF_Size Test.
2373    
2374     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2375     cultural Layer to test expressions and the the status of that layer
2376     from on to default.
2377     Changed the data path the the correct Thuban Data
2378     Added the Outputformat Object and Symbol Object
2379    
2380 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2381    
2382     * Extensions/umn_mapserver/mapfile.py: Added some new
2383     settings to edit (outputformat, label, imagetype)
2384    
2385     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2386     the Label Dialog and add the OutputDialog.
2387     Make some changes to the code order.
2388    
2389 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2390    
2391     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2392     and line Obj and add the scalebar_status_type, scalebar_style_type and
2393     scalebar_position_type.
2394     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2395     are only used to create a Symbol like the circle in Thuban.
2396     Added the scalebarObject (MF_Scalebar)
2397     (MF_Class): Added set_status and get_status.
2398     (MF_Layer.add_thubanclass): Added code to set the class status
2399     (MF_Map): Added code to handle the symbols and scalebar
2400     (MF_Label): Added the set_partials and get_partials functions
2401    
2402     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2403     from mapfile. Added a function to create a circle object like the one
2404     from thuban if no one exists.
2405    
2406     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2407     press ok in the assosiated dialog and not at the end of the
2408     colordialog.
2409     Added the Dialog for the Scalebar.
2410     (Label_Dialog): Added the offset option
2411    
2412     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2413     status of the Classes.
2414     Fixed a bug with the projection. Now the to_meter parameter will be
2415     added to the Projection only if it doesn't exists.
2416    
2417 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2418    
2419     Added the functionality to handle the content thuban is not
2420     able to handle directly.
2421    
2422     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2423     Thuban with the possibility to edit the mapfile content.
2424    
2425     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2426     to import mapfiles without any layer selected. So it is possible
2427     to edit the other settings in a mapfile.
2428     (import_mapfile): Added code to use the editing functions.
2429     Added the possibility to import the projection to a layer if one
2430     is defined.
2431     Status settings (On,Off) will now set in thuban (visible, invisible).
2432     fixed a bug with with classnames. If no classname is set in mapfile
2433     the value in Thuban will set to the expression.
2434    
2435     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2436     possibility to save a new mapfile or use the old one which is
2437     imported or new created.
2438     Added code to use the editing functions.
2439     Remove some not needed import statements
2440    
2441     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2442     need for the editing functions.
2443     Added needed set-functions for the editing functions.
2444     Added the possibility to export rasterimages.
2445     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2446     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2447     moment.
2448     (MF_Class.set_thubanstyle): Now point layers will set to a default
2449     symbol to show a circle in mapserver and not only a 1px dot.
2450     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2451     correct before.
2452     (MF_Size): Removed, because it is not needed.
2453    
2454     * Extensions/umn_mapserver/README: Added the hints to use the
2455     export and editing functions, too.
2456    
2457     * Extensions/umn_mapserver/sample/iceland.map: Added the
2458     new parameter "UNITS METERS".
2459     Change the political layer to status OFF.
2460    
2461     * Extensions/umn_mapserver/sample/README: Added some
2462     more details to setup the sample in the MapServer.
2463    
2464 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2465    
2466     * Extensions/svgexport/test/test_svgmapwriter.py:
2467     Removed class VFile and used standard StringIO instead.
2468    
2469 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2470    
2471     Add the export function to the umn_mapserver extension.
2472    
2473     * Extension/umn_mapserver/mf_export.py: New. This module extents
2474     Thuban with the possibility to export the Thuban content.
2475    
2476     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2477     with the export module. Especially added the possibility to
2478     add thuban objects directly to the map objects.
2479    
2480     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2481     because of the hint from Bernhard Herzog.
2482     Corrected the handling of absolute pathnames.
2483     Changed the Text of the Menu-Item, now the beginning is upper case.
2484    
2485     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2486    
2487 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2488 jschuengel 2242
2489 jschuengel 2250 Add a sample and make some changes.
2490    
2491     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2492     import from * to explicit used statements. Changed the
2493     Thuban.UI.mainwindow import phrase, too.
2494     (import_mapfile):Corrected a clerical mistake.
2495     Added wxCHANGE_DIR in OpenFile Dialog.
2496     Added a MultipleChoiceDialog, to select the layers to load from
2497     mapfile into thuban. Thereby the projection is only set if one layer
2498     is selected.
2499     Added the possibility to handle relative pathnames which uses
2500     up-level references.
2501     Removed some doubled code.
2502     Corrected an error with integer values used as label in thuban
2503     ClassGroup.
2504    
2505     * Extensions/umn_mapserver/sample: New.
2506    
2507     * Extensions/umn_mapserver/sample/README: New. Describes the
2508     usage of the sample files.
2509    
2510     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2511     a suitable .map-file for the iceland data.
2512    
2513     * Extensions/umn_mapserver/sample/index.html: New. The template
2514     for the mapfile.
2515    
2516     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2517     file for the Iceland Application on web.
2518    
2519     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2520     some details.
2521    
2522     * Extensions/umn_mapserver/test/test_mapserver
2523     (mapserver_import_Test_generalClasses.test_MF_Color):
2524     Corrected the thubancolor test.
2525    
2526     2004-06-15 Jan Schüngel <[email protected]>
2527    
2528 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2529    
2530 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2531    
2532     * libraries/thuban/cpl_mfile.h: Added copyright header.
2533    
2534     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2535     Free Software License so that it is most useful with gdalwarp
2536     and bmpdataset.
2537    
2538 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2539    
2540     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2541     import of wxPython.wx itself (as opposed to the contents of
2542     wxPython.wx). For some reason wxPython.wx is available as
2543     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2544     wrt. wxPython 2.4.
2545    
2546 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2547    
2548     Initial version of new extension "umn_mapserver". This extension aims
2549     to manage configuration for the UMN MapServer application. This
2550     inital version just imports the .map-files and displays all, Thuban is
2551     capable of.
2552    
2553     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2554    
2555     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2556     tests.
2557    
2558     * Extensions/umn_mapserver/test/test.map: New. This is a test
2559     .map-file for automated tests of the umn_mapserver extension of
2560     Thuban.
2561    
2562     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2563     UMN Mapserver classes.
2564    
2565     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2566     directory a package.
2567    
2568     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2569     '.map'-file objects.
2570    
2571     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2572     Thuban with the possibility to handle UMN MapServer mapfiles.
2573    
2574 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2575    
2576     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2577     to a tuple before using it as arguments to the % operator. This
2578     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2579     reported today on thuban-list by Jan Schüngel
2580    
2581     * test/test_layer.py (TestLayerModification.setUp): Save the
2582     filename as an instance variable so we can refer to it in tests
2583     (TestLayerModification.test_tree_info): Uncomment this method
2584     again and make it work. This tests for the formatting issue
2585     filed in RT#2239 on 2004-01-13
2586    
2587 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2588    
2589     * Thuban/UI/baserenderer.py: Fix some typos.
2590    
2591 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2592    
2593     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2594     by increasing a field size.
2595    
2596 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2597    
2598     Update to newest shapelib and get rid of Thuban specific
2599     extensions, i.e. use the new DBFUpdateHeader instead of our
2600     DBFCommit kludge
2601    
2602     * libraries/shapelib/shpopen.c: Update to version from current
2603     shapelib CVS.
2604    
2605     * libraries/shapelib/shapefil.h: Update to version from current
2606     shapelib CVS.
2607    
2608     * libraries/shapelib/dbfopen.c: Update to version from current
2609     shapelib CVS.
2610     (DBFCommit): Effectively removed since shapelib itself has
2611     DBFUpdateHeader now which is better for what DBFCommit wanted to
2612     achieve.
2613     We're now using an unmodified version of dbfopen.
2614    
2615     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2616     value '1' to the Lib.dbflibc extension. This simply reflects the
2617     shapelib and pyshapelib updates
2618    
2619 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2620    
2621     Finished introduction of Menu.FindOrInsertMenu.
2622    
2623     * Extensions/drawshape/drawshape.py: Add the command
2624     to the experimental menu additionally to the toolbar.
2625    
2626     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2627     finding menu on its own.
2628    
2629     * Doc/manual/thuban-manual.xml: updated sample file
2630     to use FindOrInsertMenu().
2631    
2632     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2633     instead of finding menu on its own.
2634    
2635 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2636    
2637     * test/test_menu.py (MenuTest.test): Added testing
2638     of method Menu.FindOrInsertMenu.
2639    
2640 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2641    
2642     Introduce and use Menu.FindOrInsertMenu.
2643    
2644     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2645     given menu or, if not found, insert it.
2646    
2647     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2648     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2649     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2650     menu on its own.
2651    
2652 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2653    
2654     Introduce a abstract ColorDialog class and remove
2655     and outdated file.
2656    
2657     * Thuban/UI/proj4dialog.py: Removed. It is has been
2658     replaced by projdialog for quite a while and is not used
2659     anymore.
2660    
2661     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2662     dialog(s).
2663    
2664     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2665     Now calls the abstract ColorDialog instead of wxColourDialog.
2666     This also removed the dependency to Color class conversion
2667     from this function.
2668    
2669 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2670    
2671     * Extensions/bboxdump/__init__.py: Fixed string left over from
2672     copying.
2673    
2674     * Extensions/bboxdump/bboxdump.py (bboxdump):
2675     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2676     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2677     of formatted outputs (string.join) instead of appending to the
2678     message. Two progress bar dialogs to report progress on the sometimes
2679     lenghty processing.
2680    
2681 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2682    
2683     New Extension to dump bounding boxes of all shapes of the selected
2684     layer. An optional column can be specified to group the objects,
2685     in this case the bounding box is a union of the separate boxes.
2686     Dump can be displayed in a ScrolledMessageDialog or written to file.
2687     The Extension is simply a combination of available and well tested
2688     Thuban functionality.
2689    
2690     * Extensions/bboxdump/__init__.py: New: Init to make this
2691     directory a package.
2692    
2693     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2694     all shapes of the selected layer.
2695    
2696 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2697    
2698     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2699     strings to be i18n now.
2700    
2701 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2702    
2703     Changing popup menu of legend from direct building
2704     to using the Menu construction as used for the mainwindow.
2705    
2706     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2707     layer_to_bottom, layer_visibility
2708     (MainWindow.LayerToTop): New. Put current layer to the top.
2709     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2710     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2711     Replace 1,0 by True, False.
2712     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2713     current layer.
2714     (MainWindow.LayerShowTable): Removed raising of dialog.
2715     (_has_selected_layer_visible): New. Support function.
2716    
2717     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2718     (LegendPanel.__init__): Removed EVT_MENU bindings.
2719     (LegendTree._OnRightClick): Replace direct creation of
2720     menu via wx Classes by applying the menu definition
2721     as of Menu class of menu.py.
2722    
2723 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2724    
2725     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2726     button string to stronger clearify that Thuban will be closed when hitting
2727     the button.
2728    
2729     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2730     Now for layers without a ShapeStore a corresponding message is given
2731     to the user, that this layer has no table to show.
2732    
2733 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2734    
2735     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2736     recalculate the format for the internal render engine as well.
2737    
2738     * Extensions/wms/properties.py (wmsProperties): First start for a
2739     properties dialog. It's functional for a first selection of
2740     layers, but still has some weired wxWidgets/GTK problems but
2741     beautification can be done later.
2742    
2743     * Extensions/wms/layer.py: Added more documentation
2744     (WMSLayer.getFormats): New: Return list of supported image formats
2745     by the WMS server
2746     (WMSLayer.getLayers): New: Return the list of layer names
2747     supported by the WMS server
2748     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2749     (WMSLayer.getWMSFormat): New: Return the image format that is used
2750     for WMS GetMap requests
2751     (WMSLayer.setWMSFormat): New: Set the image format that is used
2752     for WMS GetMap requests
2753     (WMSLayer.__init__): Move away from using only one layer to using
2754     a list of layers (unsorted at the moment, though).
2755     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2756     visible layers
2757     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2758     visible layers
2759    
2760     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2761     order to establish a clean structure.
2762    
2763     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2764     own in order to establish a clean structure.
2765    
2766 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2767    
2768     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2769     support for oldstyle (WMS 1.0 apparently) image format
2770     specification.
2771    
2772     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2773     supported graphic formats back to JPEG and BMP, PNG and others are
2774     too *cough* experimental... Sorry, I meant to filter this out
2775     before I committed this part. This should make the WMS extension
2776     run from CVS again.
2777     (wms_dialog): Reset an empty URL to None so that the subsequent
2778     program can depend on this, since the dialog will indeed return an
2779     empty URL, causing another declaration of love by Python.
2780    
2781     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2782     Whenever a native BoundingBox request cannot be fulfilled, check
2783     whether the requested SRS is EPSG:3426, in which case return the
2784     LatLonBoundingBox values.
2785    
2786     * Extensions/wms/test/test_parser.py
2787     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2788     ignoring AUTO:* SRS.
2789     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2790     Added another test method to test whether the LatLonBoundingBox
2791     values will be returned if BoundingBox values are requested with
2792     SRS set to EPSG:3426.
2793    
2794     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2795     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2796     the moment by placing them into a variable which is currently
2797     unused. Also test whether the EPSG SRS is numerical as it should
2798     be and add an error message if it is not.
2799    
2800     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2801     appear in the real world as well. Since we cannot handle them yet
2802     (OGCLib can't either), we will ignore them for the moment.
2803    
2804     * Extensions/wms/parser.py: Use a variable for denoting the sample
2805     filename
2806     (WMSCapabilitiesParser.peekLayers): Added support for error
2807     messages during grok(). They will be aggregated in an array and
2808     may be displayed later. We may have to add a classification
2809     "Warning" and "Error" to this. That requires more experience,
2810     though, since not every error may be lethal.
2811    
2812     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2813     ShowTable() dialog/frame when the user attempts to display it
2814     while it has been opened before already and not closed again.
2815    
2816 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2817    
2818     * Extensions/wms/infodialog.py: Adjusted the class documentation
2819    
2820     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2821     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2822     wxWidgets variants.
2823     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2824    
2825     * Extensions/wms/infodialog.py: Added an information dialog that
2826     will display various information about the WMS current resource,
2827     so that additional information such as the title, the abstract,
2828     fees and access constraints can be displayed for the user if they
2829     are documented in the WMS XML.
2830    
2831 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2832    
2833     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2834     string handling. It's "foo".lower() and not lower(foo) without
2835     lower imported from strings or something.
2836    
2837     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2838     from capabilities.py and parser.py. Implement priority list for
2839     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2840     and GIF are supported here, but not yet by main Thuban. Hence,
2841     support for them may be removed later. Special contribution to
2842     usability: get wxWidgets to change the cursor when we're waiting
2843     for data from the network so the user won't start to worry. This
2844     causes a redrawing error/warning, though.
2845    
2846     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2847     the DOM object.
2848    
2849     2004-04-01 Martin Schulze <[email protected]>
2850    
2851     * Extensions/wms/capabilities.py: Adjusted documentation
2852     (WMSCapabilities.__init__): Improved documentation, fixed syntax
2853     (WMSCapabilities.saveCapabilities): Only catch IOError when
2854     handling files
2855     (WMSCapabilities.loadCapabilities): Only catch IOError when
2856     handling files
2857     __main__: corrected variable naming
2858     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2859     class a specialisation of WMSCapabilitiesParser as well. Also
2860     execute grok() after loading or fetching capabilities, if that
2861     went well, so that subsequent calls can already access the data.
2862     (WMSCapabilities.getVersion): Export the used version of the
2863     GetCapabilities request, so we can use it for subsequent calls,
2864     i.e. for GetMap requests.
2865     (WMSCapabilities.fetchCapabilities): Added proper error handling
2866     when the GetCapabilities request failed, so that the surrounding
2867     program can act accordingly.
2868    
2869 joey 2146 2004-03-30 Martin Schulze <[email protected]>
2870    
2871     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2872     Adjusted the getLayerSRS method to return the list of SRSes
2873     extracted from <SRS> elements instead of <BoundingBox> elements.
2874     Added a bit of documentation as well.
2875     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2876     since it was only implemented due to a misunderstanding.
2877    
2878     * Extensions/wms/test/test_parser.py
2879     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2880     reflect the corrected interpretation of the standard: i.e. a layer
2881     does not have to define a BoundingBox for all SRSes it supports.
2882     Hence the <SRS></SRS> specification is authoritative, not the list
2883     of BoundingBoxes.
2884     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2885     to ensure None is returned for a non-existing SRS.
2886     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2887     since it is not applicable anymore. Listing more SRSes in <SRS>
2888     elements is valid according to the specs.
2889    
2890 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
2891 joey 2146
2892 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
2893     Reflected wxWidgets name change.
2894    
2895     * Thuban/UI/about.py: Extended copyright to 2004 and added
2896     information about the thuban-devel mailinglist.
2897    
2898 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2899 joey 2120
2900 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
2901     'WMS', also added a linebreak where required
2902    
2903     * Extensions/wms/parser.py: Finally added the XML parser for the
2904     GetCapabilities response.
2905    
2906     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2907     <SRS> elements match the <BoundingBox> elements, except for the
2908     layer 'beschriftung'.
2909    
2910     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2911     since Python uses unicode strings internally, otherwise
2912     comparisons will fail. Removed tests for getLayerBBoxSRS() since
2913     the SRS will be calculated anyway and this method is obsoleted by
2914     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2915     Move loading the sample file into the setUp method. Added a test
2916     for finding the integrity problem in the sample response.
2917     Improved formatting.
2918    
2919     * Extensions/wms/domutils.py: Added convenience routines for
2920     handling of Document Object Model (DOM) nodes.
2921    
2922     * Extensions/wms/test/test_domutils.py: Added a test for the
2923     domutils module
2924    
2925     2004-03-19 Martin Schulze <[email protected]>
2926    
2927 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2928     Moved path detection and adding into a module of its own,
2929     adjustpath, which exports thubandir as main Thuban directory.
2930    
2931     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2932     detection and adding into a module of its own, adjustpath, which
2933     exports thubandir as main Thuban directory. Reorganised the
2934     module in order to support the SkipTest feature for Thuban test
2935     cases.
2936    
2937     * Extensions/wms/test/adjustpath.py: Moved path detection and
2938     adding into a module of its own.
2939    
2940 joey 2115 2004-03-18 Martin Schulze <[email protected]>
2941    
2942     * Extensions/wms/test/test_parser.py: Added another test for
2943     checking whether the WMS XML parser (to be implemented) returns
2944     the information we expect. This requires a sample WMS WML file
2945     (sample.xml) which has been extracted from the frida server and
2946     "improved" manually.
2947    
2948     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2949     main Thuban directory to the path in order to be able to import
2950     random modules. Adjusted the PyOGCLib detection to reuse the
2951     information gathered. Also added a note about the PYTHONPATH
2952     environment variable.
2953    
2954     * Extensions/wms/test/test_ogclib.py: The format specification is
2955     a mime-type, not a graphic format, hence image/jpeg wou ld be the
2956     proper format and not JPEG. We'll also have to take care of the
2957     encoding of / as %2F.
2958    
2959 joey 2111 2004-03-16 Martin Schulze <[email protected]>
2960    
2961     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2962     comprehensive test for the getMapURL method, built compare URLs
2963     according to the documentation in OGC 01-068r3
2964    
2965     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2966     class WMSCapabilities to manage capabilites, will incorporate
2967     parsing the capabilities response and provide details for other
2968     classes.
2969    
2970 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
2971    
2972 bh 2107 Support views in addition to normal tables in the postgis
2973     shapestore
2974    
2975     * Thuban/Model/postgisdb.py
2976     (PostGISShapeStore._fetch_table_information): Add a fallback for
2977     the case where the table name is not in the geometry_columns
2978     table. This is usually the case for views. Also, set
2979     self.shapestore here.
2980     (PostGISShapeStore.ShapeType): No need to query the database all
2981     the time. The shape type is now determined in
2982     _fetch_table_information
2983    
2984     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2985     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2986     New parameter to specify views.
2987     (PostGISDatabase.has_data): Also compare the views. New views
2988     parameter
2989     (PostGISDatabase.initdb): Create the views.
2990     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2991     view
2992    
2993     * test/test_postgis_db.py
2994     (TestPostGISShapestorePointFromViews): New. Test a
2995     PostGISShapeStore with a view
2996     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2997     the geometry_column explicitly to test whether that works
2998    
2999     2004-03-12 Bernhard Herzog <[email protected]>
3000    
3001 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3002    
3003     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3004     with the following changes:
3005     (dbshapesource): Two new attributes id_column and geometry_column
3006    
3007     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3008     (SessionSaver.write_session): Use the new namespace
3009     (SessionSaver.write_data_containers): Write the new dbshapesource
3010     parameters
3011    
3012     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3013     the new file format version
3014     (SessionLoader.start_dbshapesource): Handle the new db parameters
3015    
3016     * test/test_save.py: Update to the new dtd and namespace
3017     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3018     mock object to provide a working IDColumn method.
3019    
3020     * test/test_load_1_0.py: New. Copy of the test_load.py before
3021     today's changes but with the round-trip tests removed.
3022    
3023     * test/test_load_0_9.py: Update doc-string.
3024    
3025     * test/test_load.py: Update all .thuban files to the new dtd and
3026     namespace.
3027     (TestPostGISLayer.file_contents): Add the new dbshapesource
3028     paramters
3029    
3030 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3031    
3032 bh 2103 Next step for explicit id/geometry columns: User interaction
3033    
3034     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3035     the dialog is constructed. Add combo boxes to select id and
3036     geometry column. Rename some instance variables.
3037     (ChooseDBTableDialog.GetTable): Return id and geometry column
3038     names
3039     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3040     selections in the table list
3041    
3042     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3043     and geometry_column
3044    
3045     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3046     parameters for id_column and geometry column of PostGISShapeStore
3047     here as well.
3048    
3049     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3050     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3051     (PostGISConnection.GeometryTables): Use a better query to
3052     determine which relations in the database might be usable for
3053     shapestores. Now supports views as well but is more PostgreSQL
3054     specific
3055     (PostGISConnection.table_columns): New. Somewhat experimental
3056     method to let the db dialogs provide lists of columns to users so
3057     that they can select id and geometry columns.
3058     (PostGISTable.__init__): The default value of the id_column
3059     parameter is now None it still means "gid" effectively, though.
3060     (PostGISTable.IDColumn): New introspection method to return a
3061     column object for the id column
3062     (PostGISShapeStore.GeometryColumn): New introspection method to
3063     return a column object for the geometry column
3064    
3065     * test/test_postgis_db.py
3066     (TestPostGISConnection.test_gis_tables_non_empty):
3067     Removed. Subsumed by the new:
3068     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3069     New. Tes the GeometryTables and table_columns methods with actual
3070     tables and views.
3071     (PointTests.test_id_column, PointTests.test_geometry_column):
3072     New. tests for the new methods.
3073     (TestPostGISShapestorePoint.setUp)
3074     (TestPostGISShapestorePointSRID.setUp)
3075     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3076     instance variables needed by the new tests
3077    
3078     2004-03-11 Bernhard Herzog <[email protected]>
3079    
3080 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3081     numbers given to ReadValue are ordinals.
3082    
3083     2004-03-11 Bernhard Herzog <[email protected]>
3084    
3085     Elimiate the requirement for PostGIS tables to have a column
3086     called "gid".
3087    
3088     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3089     id_column to specify which column to use to identify rows. Also
3090     new instance variables id_column and quoted_id_column
3091     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3092     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3093     (PostGISTable.SimpleQuery): Use the id column name provided to the
3094     constructor instead of "gid"
3095     (PostGISShapeStore.__init__): New parameter id_column analogously
3096     to PostGISTable.__init__. This parameter is simply passed through
3097     to the base class constructor
3098     (PostGISShapeStore._create_col_from_description): Fix typo in
3099     doc-string
3100     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3101     (PostGISShapeStore.ShapesInRegion): Use the id column name
3102     provided to the constructor instead of "gid"
3103    
3104     * test/postgissupport.py
3105     (PostgreSQLServer.get_default_static_data_db): New static table
3106     landmarks_point_id with an id column != "gid. Update the comments
3107     a bit.
3108     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3109     doc-
3110     (upload_shapefile): New parameter gid_column to use a name other
3111     than "gid" for the column to store the shape ids
3112    
3113     * test/test_postgis_db.py (TableTests): New. Mixin-class
3114     containing all tests previously in TestPostGISTable. The actual
3115     tests are the same but the code is a bit more configurable to
3116     allow for different id columns etc.
3117     (TestPostGISTable): Derive from TableTests now for the actual
3118     tests.
3119     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3120     except that it the landmarks_point_id table to test the id_column
3121     parameter
3122     (PointTests): Extend the doc-string
3123     (TestPostGISShapestorePointExplicitGIDColumn)
3124     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3125     from PointTests to test the explicit id_column parameter. One
3126     tests with the name of the column holding the shape ids, the other
3127     uses PostgreSQL's OID column. For the latter a number of methods
3128     have to be overwritten to make them independent of the actual id
3129     values.
3130    
3131 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3132    
3133     Update debian directory:
3134    
3135     * debian/changelog: Added new version.
3136     * deiban/rules: Updated management of patches (with cbds)
3137     * debian/control: Added cbds to dependencies
3138     * debian/patches/*: New. Adds better support for patches of thuban in
3139     debian
3140     * debian/menu: Syntax of menu changed slightly
3141     * debian/setup.py.patch: removed because it has been moved to
3142     debian/patechs/setup.py.patch
3143    
3144    
3145 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3146    
3147     Create the Doc/technotes directory for text files with information
3148     for developers
3149    
3150     * Doc/technotes/README: New. README for the technotes
3151    
3152     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3153     Thuban
3154    
3155     * Doc/technotes/release_process.txt: New. Used to be
3156     HOWTO-Release. Now slightly adapted to technote formatting style.
3157    
3158     * HOWTO-Release: Removed. It's contents are now in
3159     Doc/technotes/release_process.txt
3160    
3161 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3162    
3163     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3164     version of wxWindows the module was compiled with so we can check
3165     that against the wxPython version.
3166    
3167     * Thuban/version.py (thuban_branch, thuban_release): New variables
3168     controlling which and how Thuban versions are shown. See the
3169     comments for details.
3170     (verify_versions): Also check that the wx version that wxproj is
3171     compiled against matches that of the wxPython we use at runtime
3172    
3173 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3174    
3175 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3176     get_system_proj_file to read the epsg projections. The old way
3177     depended on the current directory being the top Thuban directory.
3178    
3179     2004-02-20 Bernhard Herzog <[email protected]>
3180    
3181 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3182     (TestVirtualDC.test_clippath): Remove a debug print
3183    
3184     2004-02-20 Bernhard Herzog <[email protected]>
3185    
3186 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3187     Extensions/svgexport into a package.
3188    
3189     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3190     doc-string a bit. The doc-string must come first, otherwise it's
3191     not a doc-string. The __future__ import must be the first thing
3192     after the doc-string. Use only double quotes in doc-strings.
3193     Single quotes trip up emacs syntax highlighting if the text
3194     contains apostrophes.
3195    
3196     2004-02-20 Bernhard Herzog <[email protected]>
3197    
3198 bh 2080 * Extensions/svgexport/test/__init__.py,
3199     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3200     suite for svgexport
3201    
3202     * test/runtests.py (find_test_modules): New. Function with the
3203     module finding code from main.
3204     (main): Use find_test_modules to figure out the default test
3205     modules and take modules from Extensions.svgexport.test too.
3206    
3207 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3208    
3209 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3210     the mainwindow has a reference to the map of the initial session.
3211     This fixes a bug introduced with the fix for RT#2245
3212    
3213     2004-02-19 Bernhard Herzog <[email protected]>
3214    
3215 bh 2075 * Extensions/svgexport/svgsaver.py,
3216     Extensions/svgexport/svgmapwriter.py,
3217     Extensions/svgexport/maplegend.py: Added again. This time in the
3218     correct place.
3219    
3220 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3221    
3222 bh 2073 Fix for RT#2245
3223    
3224     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3225     instance variables before trying to create any windows. Creating
3226     windows can start an event loop if e.g. message boxes are popped
3227     up for some reason, and event handlers, especially EVT_UPDATE_UI
3228     may want to access things from the application.
3229     (ThubanApplication.maps_changed): The mainwindow may not have been
3230     created yet, so check whether it has been created before calling
3231     its methods
3232    
3233     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3234     have a map
3235    
3236     2004-02-17 Bernhard Herzog <[email protected]>
3237    
3238 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3239     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3240     extensions/svgexport/svgsaver.py,
3241     extensions/svgexport/svgmapwriter.py,
3242     extensions/svgexport/maplegend.py: Removed. These files were in
3243     the wrong places or didn't work at all.
3244    
3245 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3246    
3247 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3248     line
3249    
3250     2004-02-16 Bernhard Herzog <[email protected]>
3251    
3252 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3253    
3254 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3255    
3256     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3257     to write a session to a file in SVG format.
3258     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3259     to write a SVG map of a session.
3260     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3261     in SVG format for the current session.
3262    
3263 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3264    
3265     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3266     can't be created, return immediately after displaying the error
3267     message.
3268    
3269 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3270    
3271     Handle postgis tables with more than one geometry column.
3272    
3273     * Thuban/Model/postgisdb.py
3274     (PostGISTable._fetch_table_information): Delegate the creation of
3275     column objects to a different method so that we can extend that in
3276     derived classes
3277     (PostGISTable._create_col_from_description): New. Column object
3278     creation part of _fetch_table_information
3279     (PostGISShapeStore._create_col_from_description): New. Extend
3280     inherited method to handle geometry columns
3281     (PostGISShapeStore.__init__): New parameter geometry_column to
3282     specify which geometry column to use. Optional but mandatory for
3283     tables with more than one geometry column
3284     (PostGISShapeStore._fetch_table_information): Also use the name of
3285     the geometry column when looking for the srid
3286     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3287     column when looking for the shape type
3288    
3289     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3290     NonConnectionStore to changes in the PostGISShapeStore
3291    
3292     * test/test_postgis_db.py
3293     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3294     PostGISShapeStore with tables having two geometry columns.
3295    
3296 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3297    
3298     Fix some postgis problems. What remains to be done is real
3299     handling of SRIDs as they affect how reprojection is done
3300    
3301     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3302     doc-string
3303     (PostGISShapeStore._fetch_table_information): New. Extend
3304     inherited method to retrieve srid
3305     (PostGISShapeStore.BoundingBox): Handle tables without data.
3306     extent yields NULL for those
3307     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3308    
3309     * test/test_postgis_db.py
3310     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3311     for the special case of a table without any data
3312     (TestPostGISShapestorePointSRID): New class with tests for a table
3313     that uses srids
3314     (PolygonTests): Fix a doc-string typo
3315    
3316     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3317     reference_systems with a specification of spacial reference
3318     systems to create in the new db.
3319     (PostgreSQLServer.new_postgis_db)
3320     (PostgreSQLServer.get_static_data_db): New parameter
3321     reference_systems to be passed through ultimately to
3322     PostGISDatabase. In new_postgis_db also check whether an existing
3323     db already has the right srids
3324     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3325     table that uses srids
3326     (PostGISDatabase.initdb): Create the entries for the reference
3327     systems
3328     (PostGISDatabase.has_data): Add reference_systems parameter to
3329     check for those too
3330     (upload_shapefile): New parameter srid to create tables with a
3331     specific srid
3332    
3333 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3334    
3335     * po/pt_BR.po: Fixed charset
3336    
3337 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3338    
3339     * po/pt_BR.po: Fixed format string for error message, missing %s
3340     added (Thuban/UI/application.py:273)
3341    
3342 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3343    
3344     First version of Portuguese (Brazilian) translation
3345    
3346     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3347     Brazilian Portuguese by Eduardo Patto Kanegae.
3348    
3349     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3350     translators.
3351    
3352    
3353 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3354    
3355     * Doc/manual/thuban-manual.xml: Added section on installation of
3356     Thuban under Win32 systems. Fixed image path references in the postgis
3357     section. Some minor source formattings.
3358    
3359 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3360    
3361     Make Thuban remember path selections (at least for one application run).
3362    
3363     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3364     attribute of application object. Path is a dictionary of
3365     strings, currently with the items "data" and "projection".
3366     (Application.SetPath): New, stores path for the specified item.
3367     (Application.Path): New, return path for the specified item.
3368    
3369     * Thuban/UI/mainwindow.py
3370     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3371     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3372     MainWindow.TableOpen): Access "data" path information of the
3373     application.
3374    
3375     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3376     Access "projection" path information of the application.
3377    
3378 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3379    
3380 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3381    
3382     2004-01-05 Bernhard Herzog <[email protected]>
3383    
3384 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3385     the translation statistics to the README.
3386    
3387 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3388    
3389 bh 2045 * NEWS: Update for 1.0.0
3390    
3391     * po/it.po: Another update from Maurizio Napolitano
3392    
3393     2003-12-23 Bernhard Herzog <[email protected]>
3394    
3395 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3396    
3397     2003-12-23 Bernhard Herzog <[email protected]>
3398    
3399     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3400     for translation
3401    
3402     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3403     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3404     strings for translation
3405    
3406     * po/de.po: Update with the newly marked strings.
3407    
3408 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3409    
3410 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3411     updated
3412    
3413     2003-12-22 Bernhard Herzog <[email protected]>
3414    
3415 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3416    
3417     * Thuban/version.py (longversion): 1.0.0, yeah!
3418    
3419     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3420     1.0.0 namespace too
3421    
3422     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3423     1.0.0 namespace
3424    
3425     * test/test_load.py (LoadSessionTest.dtd)
3426     (TestSingleLayer.file_contents)
3427     (TestNonAsciiColumnName.file_contents)
3428     (TestLayerVisibility.file_contents)
3429     (TestClassification.file_contents, TestLabels.file_contents)
3430     (TestLayerProjection.file_contents)
3431     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3432     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3433     (TestPostGISLayerPassword.file_contents)
3434     (TestLoadError.file_contents, TestLoadError.test): Update for
3435     1.0.0 namespace
3436    
3437     * test/test_save.py (SaveSessionTest.dtd)
3438     (SaveSessionTest.testEmptySession)
3439     (SaveSessionTest.testSingleLayer)
3440     (SaveSessionTest.testLayerProjection)
3441     (SaveSessionTest.testRasterLayer)
3442     (SaveSessionTest.testClassifiedLayer)
3443     (SaveSessionTest.test_dbf_table)
3444     (SaveSessionTest.test_joined_table)
3445     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3446    
3447     2003-12-22 Bernhard Herzog <[email protected]>
3448    
3449 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3450     alignment flags are byte strings not unicode and that they have
3451     valid values
3452    
3453     * test/test_load.py (TestLabelLayer): New. Test loading (and
3454     indirectly saving) of maps with labels.
3455    
3456     2003-12-22 Bernhard Herzog <[email protected]>
3457    
3458 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3459     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3460     unsubscribe all subscribers.
3461     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3462     self.grid since it may already have been destroyed.
3463     Fixes RT #2256
3464    
3465 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3466    
3467     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3468    
3469 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3470 silke 2029
3471     * debian/bitmappath.patch, debian/setup.py.patch:
3472     added to ensure compliance with FHS for debian
3473     * debian/rules, debian/changelog:
3474     added patches in rules to ensure compliance with FHS for debian
3475 bh 2028
3476 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3477    
3478 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3479     statistics about the translations. Add a comment how produce even
3480     nicer statistics with sed.
3481    
3482 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3483    
3484     * Resources/Projections/defaults.proj:
3485     French projection sample with correct accents (UNICODE).
3486    
3487 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3488    
3489     * MANIFEST.in: Add the devtools directory
3490    
3491     * setup.py (setup call): Use license instead of licence. This
3492     silences a deprecation warning on Python 2.3
3493    
3494 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3495    
3496 frank 2023 Documentation synced with 1.0rc1
3497    
3498     * Doc/manual/thuban-manual.xml:
3499     Minor formatting changes and references to database layers .
3500     Introduction.Internationalization: New section on i18n.
3501     MapManagement.AddingandRemovingLayers: Added item on database layers.
3502     MapManagement.TheLegend: Added section and screenshot on popup menu.
3503     ProjectionManagement: Updated screenshot and sentence on EPSG.
3504     Appendix.SupportedDataSources: Added PostGIS.
3505     Appendix.WorkingwithPostGIS: New section.
3506    
3507     * Doc/manual/images/6_projection.png: Updated screenshot including
3508     EPSG checkboxes.
3509    
3510     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3511    
3512     * Doc/manual/images/app_postgis_add_layer.png,
3513     Doc/manual/images/app_postgis_db_add.png,
3514     Doc/manual/images/app_postgis_db_management.png:
3515     New screenshots focussing on database layers
3516    
3517     2003-12-05 Frank Koormann <[email protected]>
3518    
3519 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3520     write warning to stderr instead of rising a warning dialog
3521    
3522 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3523    
3524 bh 2021 Fix for RT #2243
3525    
3526 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3527     New. Like has_selected_layer but for shape layers only
3528     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3529     shape layers only
3530     (layer_show_table command, layer_jointable command): Use these
3531     commands should only be available for shape layers
3532    
3533     2003-12-03 Bernhard Herzog <[email protected]>
3534    
3535 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3536     publishers that are wx objects and may have been destroyed by wx
3537     already. Fixes RT #2242.
3538    
3539     2003-12-03 Bernhard Herzog <[email protected]>
3540    
3541 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3542    
3543 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3544    
3545     * debian/control, debian/changelog: Added gdal-support to
3546     debian package, updated to new thuban version
3547    
3548    
3549 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3550    
3551     * Thuban/Lib/version.py: New. Module for version number
3552     manipulations. The version of make_tuple here also deals better
3553     with more unusual version number strings, such as e.g.
3554     "1.2+cvs20031111"
3555    
3556     * Thuban/version.py (make_tuple): Removed. It's now in
3557     Thuban.Lib.version. Use that implementation instead.
3558    
3559     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3560    
3561 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3562    
3563 bh 2010 * MANIFEST.in: Add debian files
3564    
3565 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3566     they're installed too
3567     (data_files): Add READMEs and sample data from some Extensions
3568    
3569     * NEWS: Add note about the extensions in binary packages
3570    
3571     2003-12-02 Bernhard Herzog <[email protected]>
3572    
3573 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3574     with the thuban-1.0rc1
3575    
3576     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3577     thuban-1.0rc1 namespace too
3578    
3579     * test/test_save.py (SaveSessionTest.dtd)
3580     (SaveSessionTest.testEmptySession)
3581     (SaveSessionTest.testSingleLayer)
3582     (SaveSessionTest.testLayerProjection)
3583     (SaveSessionTest.testRasterLayer)
3584     (SaveSessionTest.testClassifiedLayer)
3585     (SaveSessionTest.test_dbf_table)
3586     (SaveSessionTest.test_joined_table)
3587     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3588     namespace
3589    
3590     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3591     namespace
3592     (TestSingleLayer.file_contents)
3593     (TestNonAsciiColumnName.file_contents)
3594     (TestLayerVisibility.file_contents)
3595     (TestClassification.file_contents, TestLabels.file_contents)
3596     (TestLayerProjection.file_contents)
3597     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3598     (TestPostGISLayer.file_contents)
3599     (TestPostGISLayerPassword.file_contents)
3600     (TestLoadError.file_contents, TestLoadError.test): Update to
3601     thuban-1.0rc1 namespace
3602    
3603 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3604    
3605 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3606     nt to better match Intevation's current w32 setup
3607    
3608 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3609    
3610     * MANIFEST.in: Add the Extensions
3611    
3612 bh 1998 * NEWS: Update for 1.0rc1
3613    
3614     2003-12-01 Bernhard Herzog <[email protected]>
3615    
3616 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3617     cards for the dialog so that shapefiles ending in all uppercase
3618     SHP are listed too
3619    
3620 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3621    
3622 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3623    
3624     * setup.py (setup call): Update version to 1.0rc1. Use the
3625     [email protected] email address as author email instead of my
3626     personal one.
3627    
3628     2003-11-28 Bernhard Herzog <[email protected]>
3629    
3630 bh 1992 * po/de.po: Update german translation.
3631    
3632     2003-11-28 Bernhard Herzog <[email protected]>
3633    
3634 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3635     files are more platform independend
3636    
3637     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3638     that they can be used on both windows and unix
3639     (SessionSaver.prepare_filename): New. Handle all filename
3640     transformations for filenames stored in the thuban file
3641     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3642     Use prepare_filename
3643    
3644     * test/test_save.py (SaveSessionTest.testSingleLayer)
3645     (SaveSessionTest.testLayerProjection)
3646     (SaveSessionTest.testRasterLayer)
3647     (SaveSessionTest.testClassifiedLayer)
3648     (SaveSessionTest.test_dbf_table)
3649     (SaveSessionTest.test_joined_table): Filenames are always stored
3650     with slashes on all currently supported platforms so adapt all
3651     tests to this
3652    
3653     * test/test_load.py (LoadSessionTest.filenames): With the new
3654     filename scheme the filenames in the tests should be
3655     understandable on all currently supported platforms so we turn
3656     this into an empty list because we don't have to normalize them
3657     anymore
3658    
3659     2003-11-28 Bernhard Herzog <[email protected]>
3660    
3661 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3662     Add the ellipsoid to the projection since some Proj versions
3663     complain if it's missing.
3664    
3665 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3666    
3667     Corect some bounding box projection problems
3668    
3669     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3670     version of ForwardBBox
3671     (Projection._transform_bbox): New. common implementation of
3672     ForwardBBox and InverseBBox
3673     (Projection.ForwardBBox): Use _transform_bbox.
3674    
3675     * test/test_proj.py (TestProjection.test): Add test for
3676     InverseBBox
3677    
3678     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3679     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3680     new InverseBBox method to determine the unprojected bounding box
3681     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3682     bbox.
3683    
3684     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3685     Removed.
3686     (TestLayer.test_arc_layer_with_projection): New. This test is
3687     better able to test whether bounding boxes are projected correctly
3688     than test_point_layer_with_projection
3689    
3690 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3691     InverseBBox to unproject bboxes
3692    
3693 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3694    
3695 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3696     source code.
3697    
3698     2003-11-25 Bernhard Herzog <[email protected]>
3699    
3700 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3701     there for backwards compatibility and all code relying on that
3702     should have been updated by now.
3703    
3704     2003-11-25 Bernhard Herzog <[email protected]>
3705    
3706 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3707     round trip test.
3708     (TestClassification.file_contents): Update to the newest file
3709     format
3710    
3711     2003-11-25 Bernhard Herzog <[email protected]>
3712    
3713 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3714     polygons:
3715    
3716     * Extensions/drawshape/README: New. Brief installation
3717     instructions
3718    
3719     * Extensions/drawshape/drawshape.py: New. Implementation of the
3720     drawshape extensions
3721    
3722     * Extensions/drawshape/patch.diff: Patch to apply before the
3723     extension can be used.
3724    
3725 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3726    
3727 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3728     (ShapefileStore.__init__): Factor opening the shapefile into a
3729     separate method (the new _open_shapefile). This makes the code a
3730     bit more readable but the real reason is that it makes some evil
3731     hacks easier. :-)
3732    
3733     2003-11-24 Bernhard Herzog <[email protected]>
3734    
3735 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3736     converter is specified for an attribute assume it's a string
3737     containing only Latin1 characters. Update doc-string accordingly.
3738     This change should fix many places where unicode objects might
3739     accidentally enter Thuban.
3740    
3741     * test/test_load.py (TestNonAsciiColumnName): New test to check
3742     what happens with column names in DBF files that contain non-ascii
3743     characters
3744    
3745 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3746    
3747     Enable the experimental attribute editing again and introduce a
3748     command line switch to actually activate it
3749    
3750     * Thuban/UI/main.py (options): New. Container for options set on
3751     the commmand line
3752     (main): Add the --enable-attribute-editing flag.
3753    
3754     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3755     editing is enabled use the grid ctrl which allows editing of the
3756     values
3757    
3758     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3759     New. Just delegate this to the underlying table.
3760    
3761 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3762    
3763     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3764     Skip this test if run under non-posix systems since it only works
3765     there
3766    
3767 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3768    
3769 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3770     determined so that we can give a reason in the about why gdal is
3771     not supported.
3772     (gdal_support_status): New. Variable holding a string with the
3773     reason for no gdal support
3774    
3775     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3776     not supported to the message
3777    
3778     2003-11-19 Bernhard Herzog <[email protected]>
3779    
3780 bh 1963 Remove the old table interface and its test cases
3781    
3782     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3783     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3784     anymore
3785    
3786     * Thuban/Model/transientdb.py (TransientTableBase)
3787     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3788     anymore
3789    
3790     * test/test_table.py: Removed since the old interface it tests is
3791     gone.
3792    
3793     * test/runtests.py (main): The old table interface is gone and
3794     with it the deprecation warnings so remove the code that turns
3795     these warnings into errors
3796    
3797     2003-11-19 Bernhard Herzog <[email protected]>
3798    
3799 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3800     tests to use the new table interface is completely wrong since the
3801     whole purpose of the tests in this module is to test the old
3802     interface.
3803    
3804 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3805    
3806 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3807     New. Test whether the connection matches a set of connection
3808     parameters
3809    
3810     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3811     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3812     for existing connections with the same parameters and break out of
3813     the loop correctly.
3814    
3815     * test/test_postgis_db.py (TestBriefDescription)
3816     (TestPostGISSimple.test_brief_description): Rename
3817     TestBriefDescription to TestPostGISSimple and the test method to
3818     test_brief_description so that we can add more test methods.
3819     (TestPostGISSimple.test_matches_parameters): New. Test the new
3820     MatchesParameters method
3821    
3822     2003-11-18 Bernhard Herzog <[email protected]>
3823    
3824 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3825 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3826     already been destroyed.
3827     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3828     been destroyed yet.
3829     (Publisher.Destroy): Set the _was_destroyed flag to true.
3830    
3831     * test/test_connector.py
3832     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3833     calling Unsubscribe after Destroy doesn't raise an exception
3834    
3835 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3836    
3837     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3838     typo in doc-string
3839    
3840 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
3841    
3842     Quote table and column names properly for postgis.
3843    
3844     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3845     quote an identifier for use in an sql statement
3846     (PostGISColumn.__init__): Add the quoted_name attribute
3847     (PostGISTable.__init__): New instance variable quoted_tablename
3848     (PostGISTable._fetch_table_information): Use the quoted table
3849     name. New isntance variable quoted_geo_col with a quoted version
3850     of geometry_column
3851     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3852     (PostGISTable.RowOrdinalToId): Use the quoted table name
3853     (PostGISTable.ReadValue, PostGISTable.ValueRange)
3854     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3855     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3856     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3857     Use quoted table and column names
3858    
3859     * test/test_postgis_db.py (TestPostGISSpecialCases)
3860     (TestPostGISIgnoredColumns): Rename the class to
3861     TestPostGISSpecialCases because that better describes the new
3862     cases
3863     (TestPostGISSpecialCases.test_unsupported_types)
3864     (TestPostGISSpecialCases.test): Rename the method to
3865     test_unsupported_types because we need a more descriptive name now
3866     that there are more methods
3867     (TestPostGISSpecialCases.test_table_name_quoting)
3868     (TestPostGISSpecialCases.test_column_name_quoting)
3869     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3870     cases to test quoting of table and column names in PostGISTable
3871     and PostGISShapeStore
3872    
3873     * test/postgissupport.py
3874     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3875     AddGeometryColumn desn't support table or column names with sapces
3876     or double quotes
3877    
3878 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
3879    
3880     * Extensions/wms/__init__.py: New: Init to make this
3881     directory a package.
3882    
3883     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3884    
3885 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
3886    
3887 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3888     Constant for the file woth deprecated epsg projections
3889     (get_system_proj_file): Update doc-string
3890    
3891     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3892     above the EPS widgets, introduce a check box for the deprecated
3893     eps projections and a label for the epsg widgets
3894     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3895     too
3896    
3897     2003-11-11 Bernhard Herzog <[email protected]>
3898    
3899 bh 1939 Avoid warnings when run under Python 2.3
3900    
3901     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3902     (BaseRenderer.draw_label_layer): Coordinates must be ints.
3903    
3904     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3905     real method so that we can convert to int.
3906     (MapRenderer.label_font): The font size mist be an int.
3907    
3908     * Thuban/UI/common.py (Color2wxColour): The color values must be
3909     ints. Also, remove the unnecessary asserts.
3910    
3911     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3912     (TestUnicodeStrings.test): Python source code should not contain
3913     non-ascii characters unless an encoding is specified in the file.
3914     Therefore use \x escapes in the string literals for non-ascii
3915     characters.
3916    
3917     2003-11-11 Bernhard Herzog <[email protected]>
3918    
3919 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3920     parameter so that this function can be used for all proj files in
3921     Resource/Projections
3922     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3923     get_system_proj_file
3924    
3925     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3926     ProjFile self.__sysProjFile use a dictionary of system ProjFile
3927     objects self._sys_proj_files
3928     (ProjFrame.build_dialog): Adapt to the new changes in the
3929     ProjectionList constructor. Add a check button to toggle whether
3930     EPSG projections are shown
3931     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3932     events.
3933     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3934     the busy cursor if the files have not yet been loaded by the
3935     dialog.
3936     (ProjFrame.load_system_proj): Add a parameter for the name of the
3937     proj file. Maintain the dictionary of system projections
3938     self._sys_proj_files
3939    
3940     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3941     user_projs parameters into one parameter proj_files which is a
3942     list of proj files.
3943     (ProjectionList._subscribe_proj_files)
3944     (ProjectionList._unsubscribe_proj_files): New. Move
3945     subscription/unsubscription of projfile messages to separate
3946     methods
3947     (ProjectionList.Destroy): The unsubscribe is now done in
3948     _unsubscribe_proj_files
3949     (ProjectionList.update_projections): We now have a list of proj
3950     file objects
3951     (ProjectionList.SetProjFiles): New method to set a new list of
3952     proj file objects
3953    
3954     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3955     Specify explicitly which system proj file to load.
3956    
3957     2003-11-11 Bernhard Herzog <[email protected]>
3958    
3959 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3960     instance variables to cut cyclic references. The GC would have
3961     collected the loader eventually but it can happen that it doesn't
3962     run at all until thuban is closed (2.3 but not 2.2 tries a bit
3963     harder and forces a collection when the interpreter terminates)
3964     (load_session): Call the handler's Destroy method to make sure
3965     that it gets garbage collected early. Otherwise it will be
3966     collected very late if at all and it holds some references to e.g.
3967     shapestores and the session which can lead to leaks (of e.g. the
3968     temporary files)
3969    
3970     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3971     resource leak in load_session
3972    
3973 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
3974    
3975     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3976     extensions are to be rendered.
3977     (_renderer_extensions): New. List with renderer for layers in
3978     extensions
3979     (add_renderer_extension): New. Add a renderer extension
3980     (init_renderer_extensions): New. Init the renderer extensions
3981     (BaseRenderer.render_map_incrementally): Search
3982     _renderer_extensions for how to draw unknown layer types
3983     (BaseRenderer.draw_raster_data): Add format parameter so that
3984     formats other than BMP can be drawn
3985     (BaseRenderer.draw_raster_layer): Pass an explicit format to
3986     draw_raster_data
3987    
3988     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3989     strings of the format parameter of draw_raster_data method to wx
3990     constants
3991     (MapRenderer.draw_raster_data): Add the format parameter and use
3992     raster_format_map to map it to the right wxwindows constant for
3993     wxImageFromStream
3994    
3995     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3996     the format parameter and record it
3997     (TestBaseRenderer.test_raster_no_projection): check the format
3998     paramter of the draw_raster_data method
3999     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4000     extension facility
4001    
4002 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4003    
4004     Tweak the usage of the sqlite database to make common use cases
4005     more responsive. In most cases copying the data to the sqlite
4006     database takes so long that using sqlite doesn't have enough
4007     advantages.
4008    
4009     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4010     comments about performance and query the min and max in separate
4011     statements because only that way will indexes be used.
4012     (TransientTableBase.UniqueValues): Add some comments about
4013     performance.
4014     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4015     Do not copy the data to the transient DB but use the transient
4016     copy if it exists. See the new comments for the performance trade
4017     offs
4018    
4019     * test/test_transientdb.py
4020     (TestTransientTable.test_auto_transient_table): Make sure that the
4021     data is copied to the transient database at some point.
4022    
4023 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4024    
4025 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4026     globals to locals so that it's a bit faster
4027    
4028     2003-11-03 Bernhard Herzog <[email protected]>
4029    
4030 bh 1920 * Thuban/UI/baserenderer.py
4031     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4032     method. ReadValue is faster than ReadRowAsDict since it only reads
4033     one cell especially now that the dbf file objects actually
4034     implement it.
4035    
4036     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4037     read_attribute method of the dbf objects
4038    
4039     2003-11-03 Bernhard Herzog <[email protected]>
4040    
4041 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4042     variable to indicate whether the result should be shown in a
4043     dialog box
4044     (profile_screen_renderer, time_screen_renderer): Only show a
4045     dialog box if popup_dialog_box is true.
4046     (profile_screen_renderer): Flush stdout after the printing the
4047     first part of the "profiling..." message
4048    
4049     * Thuban/UI/baserenderer.py
4050     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4051     brushes for the groups so that they're not created over and over
4052     again
4053    
4054 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4055     (Classification._compile_classification)
4056     (Classification._clear_compiled_classification): New. Methods to
4057     manage a 'compiled' representation of the classification groups
4058     which is created on demand
4059     (Classification.InsertGroup, Classification.RemoveGroup)
4060     (Classification.ReplaceGroup): reset the compiled representation
4061     (Classification.FindGroup): Use the compiled representation to
4062     find the matching group
4063     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4064    
4065 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4066    
4067 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4068     Send a CLASS_CHANGED message
4069     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4070     not return the removed group since it wasn't used.
4071    
4072     * test/test_classification.py
4073     (TestClassification.test_set_default_group): New. Test the
4074     SetDefaultGroup method
4075     (TestClassification.test_insert_group): New. Test the InsertGroup
4076     method
4077     (TestClassification.test_remove_group): New. Test the RemoveGroup
4078     method
4079     (TestClassification.test_replace_group): New. Test the
4080     ReplaceGroup method
4081    
4082     2003-10-31 Bernhard Herzog <[email protected]>
4083    
4084 bh 1908 * test/test_classification.py (TestClassification.setUp):
4085     Subscribe to the CLASS_CHANGED messages
4086     (TestClassification.tearDown): New. Destroy the classification
4087     properly
4088     (TestClassification.test_defaults): Add tests for the default line
4089     width and whether no messages were sent yet
4090     (TestClassification.test_set_default_properties): Add tests for
4091     messages and setting the default line width
4092     (TestClassification.test_add_singleton)
4093     (TestClassification.test_add_range)
4094     (TestClassification.test_multiple_groups): Add tests for messages
4095    
4096     2003-10-31 Bernhard Herzog <[email protected]>
4097    
4098 bh 1906 Some more refactoring in preparation for new tests:
4099    
4100     * test/test_classification.py (TestClassification.setUp): New.
4101     Instantiate the classification here. Update the test methods
4102     accordingly.
4103     (TestClassification.test_multiple_groups): Make sure that the two
4104     singletons matching 1 are considered different.
4105    
4106     2003-10-31 Bernhard Herzog <[email protected]>
4107    
4108 bh 1904 * test/test_classification.py (red, green, blue): New. These
4109     constants were used in several cases. Update the relevant methods.
4110     (TestClassification.test_defaults)
4111     (TestClassification.test_set_default_properties)
4112     (TestClassification.test_add_singleton)
4113     (TestClassification.test_add_range)
4114     (TestClassification.test_multiple_groups)
4115     (TestClassification.test_deepcopy): New. These were formerly all
4116     part of the single method test.
4117     (TestClassification.test_deepcopy): Removed.
4118     (TestClassIterator): Removed. The test case is now a method of
4119     TestClassification since it tests part of the public interface of
4120     Classification
4121     (TestClassification.test_iterator): New. Used to be
4122     TestClassIterator effectively
4123    
4124 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4125    
4126     GUIfied the functions of the profiling extension.
4127    
4128     * /Extensions/profiling/__init__.py: New: Init to make this
4129     directory a package.
4130    
4131     * Extensions/profiling/profiling.py: Moved menu entries to
4132     the Extensions menu. Applied _() for strings.
4133     (profile_screen_renderer): Catch the detailed printout and present
4134     it in a dialog.
4135 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4136 jan 1902 of printing it to stdout.
4137    
4138 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4139    
4140 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4141     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4142     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4143     Split TestClassification into several classes, one for each class
4144     being tested. TestClassification itself now only tests
4145     Classification. This split makes changes to the tests a bit easier
4146    
4147     2003-10-31 Bernhard Herzog <[email protected]>
4148    
4149 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4150     Thuban performance
4151    
4152 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4153    
4154     Added two items to legend popup menu: Remove Layer and Show Layer Table
4155    
4156     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4157     LegendPanel._OnShowTable): New event handlers, call the corresponding
4158     mainwindow methods.
4159     (LegendTree._OnRightClick): Added items to popup menu.
4160    
4161 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4162    
4163     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4164     EVT_WINDOW_DESTROY
4165     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4166     nothing but is convenient for the derived classes.
4167    
4168     * Thuban/UI/tableview.py
4169     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4170     Unsubscribe the messages here not in OnClose because that might
4171     get called multiple times. Fixes RT #2196
4172     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4173     anymore.
4174    
4175     * README: Update the minimum requirement for wxPython. Since we
4176     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4177     the version in which that was introduced for all platforms
4178    
4179 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4180    
4181     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4182     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4183     frame.
4184    
4185 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4186    
4187     Improved APR import extension, added further EPSG definitions
4188     and some cleanup regarding string class.
4189    
4190     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4191     Added test for alias 'longlat'.
4192    
4193     * Resources/Projections/epsg-deprecated.proj: New. Contains
4194     deprecated EPSG definitions.
4195    
4196     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4197     the variable names for objects.
4198    
4199     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4200     Copied from importAPR and provided with documentation.
4201    
4202     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4203     Moved to apr.py.
4204     (APR_View): Added object ref 'ITheme'.
4205    
4206     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4207     split function by corresponding use of the string class method.
4208    
4209     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4210     corresponding string method.
4211    
4212 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4213    
4214     * Thuban/UI/baserenderer.py
4215     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4216     special case of a classification that only has the default group
4217    
4218 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4219    
4220 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4221    
4222 bh 1876 * po/de.po: Update.
4223    
4224     * Thuban/UI/application.py
4225     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4226     dialog message properly
4227    
4228     2003-10-27 Bernhard Herzog <[email protected]>
4229    
4230 bh 1873 Rework how localization works so that we use wx's translation
4231     functions when running Thuban as a normal application but not when
4232     we don't need any UI, such as in the test suite. See the comment
4233     in Thuban/__init__.py for details
4234    
4235     * Thuban/__init__.py (_): Add one level of indirection to make the
4236     translation handling more flexible and to make it possible to use
4237     either wx's translation services or not.
4238     (gettext_identity, translation_function_installed)
4239     (install_translation_function): New function to help with this
4240    
4241     * Thuban/UI/__init__.py: Install the wx specific translation
4242     function if it's OK to do that
4243    
4244     * test/support.py (initthuban): Install a dummy translation
4245     function so that importing Thuban.UI doesn't install a wx specific
4246     one for which would need to import wxPython
4247    
4248     2003-10-27 Bernhard Herzog <[email protected]>
4249    
4250 bh 1870 * HOWTO-Release: Source archives should be created first and the
4251     binary packages should be created from the source archives.
4252     There's an official debian package now so there's no need to test
4253     the rpm on debian anymore
4254    
4255     2003-10-27 Bernhard Herzog <[email protected]>
4256    
4257 bh 1868 Several rendering changes:
4258    
4259     - Render the selection into a separate bitmap so that only that
4260     bitmap needs to be redrawn when the selection changes
4261    
4262     - Render incrementally showing previews and allowing interaction
4263     before rendering is complete
4264    
4265     - Update the renderer interface a bit. Most parameters of
4266     RenderMap are now parameters of the constructor
4267    
4268     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4269     and the update region as parameters. Update the doc-string
4270     (BaseRenderer.render_map_incrementally): New. Generator function
4271     to renders the map incrementally
4272     (BaseRenderer.render_map): Remove the map argument (it's now in
4273     the constructor) and simply iterate over the
4274     render_map_incrementally generator to draw the map.
4275     (BaseRenderer.draw_shape_layer_incrementally)
4276     (BaseRenderer.draw_shape_layer): Renamed to
4277     draw_shape_layer_incrementally and changed into a generator that
4278     yields True every 500 shapes. Used by render_map_incrementally to
4279     render shape layers incrementally
4280    
4281     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4282     map and region parameters which are now in the constructor
4283     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4284     the inherited render_map_incrementally.
4285     (BaseRenderer.draw_shape_layer): Removed.
4286     (ScreenRenderer.draw_selection_incrementally): New. The selection
4287     drawing part of the removed draw_shape_layer as a generator
4288     (ScreenRenderer.layer_shapes): Update because of the region
4289     parameter change
4290     (ExportRenderer.__init__): New. Extend the inherited constructor
4291     with the destination region for the drawing
4292     (ExportRenderer.RenderMap): Removed the map and region parameters
4293     which are now in the constructor
4294    
4295     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4296     bitmap suitable for a preview in a tool
4297     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4298     bitmap
4299     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4300     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4301     exists
4302     (MapCanvas.OnIdle): Update the logic to deal with incremental
4303     rendering and the selection bitmap
4304     (MapCanvas._do_redraw): Handle the instantiation of the render
4305     iterator and the redraws during rendering
4306     (MapCanvas._render_iterator): New. Generator to incrementally
4307     redraw both bitmaps
4308     (MapCanvas.Export): Adapt to new renderer interface.
4309     (MapCanvas.full_redraw): Reset the selection bitmap and the
4310     renderer iterator too
4311     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4312     bitmap
4313     (MapCanvas.shape_selected): Only redraw the selection bitmap
4314    
4315     * test/test_baserenderer.py
4316     (TestBaseRenderer.test_polygon_no_projection)
4317     (TestBaseRenderer.test_raster_no_projection)
4318     (TestBaseRenderer.test_point_map_projection)
4319     (TestBaseRenderer.test_point_layer_and_map_projection)
4320     (TestBaseRenderer.test_point_layer_projection)
4321     (TestBaseRenderer.test_point_with_classification): Adapt to new
4322     renderer interface
4323    
4324 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4325    
4326     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4327     (point_in_polygon_shape, shape_centroid): Raise an exception if
4328     the shape can't be read. Previously invalid shape ids would lead
4329     to a segfault.
4330    
4331     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4332     New. test whether an exception is raised for invalid shape ids
4333    
4334 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4335    
4336 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4337     as alias for 'latlong'.
4338    
4339     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4340     as alias for 'latlong'.
4341    
4342     2003-10-24 Jan-Oliver Wagner <[email protected]>
4343    
4344 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4345     the projection even for the UnknownPanel.
4346     (UnknownProjPanel.__init__): Define the text and create the textctrl
4347     widget.
4348     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4349     textctrl created in __init__.
4350     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4351     including the parameters of the projection.
4352    
4353     2003-10-24 Jan-Oliver Wagner <[email protected]>
4354    
4355 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4356     EPSG codes with parameters for proj. The list has been
4357     generated using devtools/create_epsg.py based on the
4358     file nad/epsg of the proj 4.4.7 package. Four projection
4359     definitions have been deleted as they are not accepted by proj:
4360     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4361     and "HD72 / EOV".
4362    
4363 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4364    
4365     Some more tweaks to the projection dialog which should fix RT
4366     #1886.
4367    
4368     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4369     the ProjFile's messages and call the base class methods correctly
4370     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4371     flag on the newly selected item too. Otherwise some other item is
4372     focused and the first time the focus is moved with the keyboard
4373     the selection moves in unexpected ways.
4374    
4375     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4376     focus on the OK button, only on the projection list. That way the
4377     list really has the focus initially
4378     (ProjFrame.OnClose): Call the projection list's Destroy method to
4379     make it unsubscribe all messages
4380    
4381 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4382    
4383 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4384     and most of 2168
4385    
4386     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4387     special wxListCtrl to show a list of projections in a more MVC
4388     fashion
4389    
4390     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4391     throughout the class. The main change is to use the ProjectionList
4392     class instead of a normal wxListBox. Also, add an explicit
4393     "Unknown" projection to the projection choice control.
4394     (ProjPanel.__init__): Add an "unknown" ellipsoid
4395     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4396     instantiation of the panel's controls to make the tab-order more
4397     natural
4398    
4399     2003-10-21 Bernhard Herzog <[email protected]>
4400    
4401 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4402     (TestSingleLayer.test): Add non-ascii characters to the titles of
4403     session, map and layer. This is effectively a port of the
4404     TestUnicodeStrings test in test_load_0_8.py which for some reason
4405     was only added there.
4406    
4407     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4408     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4409     characters to the titles of session, map and layer,.
4410    
4411     2003-10-21 Bernhard Herzog <[email protected]>
4412    
4413 bh 1847 Add EPSG projection handling to .thuban files
4414    
4415     * test/test_save.py (SaveSessionTest.dtd)
4416     (SaveSessionTest.testEmptySession)
4417     (SaveSessionTest.testLayerProjection)
4418     (SaveSessionTest.testRasterLayer)
4419     (SaveSessionTest.testClassifiedLayer)
4420     (SaveSessionTest.test_dbf_table)
4421     (SaveSessionTest.test_joined_table)
4422     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4423     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4424     use a and epsg projection to test saving them
4425    
4426     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4427     namespace
4428     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4429     (TestLayerProjection.file_contents)
4430     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4431     (TestPostGISLayer.file_contents)
4432     (TestPostGISLayerPassword.file_contents)
4433     (TestLoadError.file_contents, TestLoadError.test): Update to use
4434     1.0-dev namespace
4435     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4436     use 1.0-dev namespace and use an EPSG projection to test whether
4437     loading it works
4438    
4439     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4440     as of Thuban 0.9. These are now tests to determine whether Thuban
4441     can still read files generated by Thuban 0.9
4442    
4443     * Thuban/Model/save.py (SessionSaver.write)
4444     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4445     namespace
4446     (SessionSaver.write_projection): Write the projection's epsg
4447     attribute
4448    
4449     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4450     thuban-1.0-dev.dtd namespace
4451     (SessionLoader.check_attrs): Allow a callable object as conversion
4452     too
4453     (SessionLoader.start_projection, SessionLoader.end_projection)
4454     (SessionLoader.start_parameter): Handle the epsg attribute and
4455     rename a few instance variables to lower case
4456    
4457     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4458     thuban-0.9.dtd is the epsg attribute for projections.
4459    
4460     2003-10-21 Bernhard Herzog <[email protected]>
4461    
4462 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4463     on the command line
4464    
4465     * test/support.py (ThubanTestResult.getDescription): Override to
4466     give a better short description. The description can be used as a
4467     parameter to run_tests to run that particular test in isolation.
4468    
4469 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4470    
4471     Popup menu for legend. Scheduled for the 1.2 release this was too
4472     simple to implement: The popup menu is bound to the legend tree, while
4473     the events are hanlded by its anchestor, the legend panel. This
4474     allows reuse of all the event handlers already implemented for the
4475     legend toolbar buttons.
4476    
4477     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4478     to add handlers for the events issued by the popup menu.
4479     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4480     visibility event
4481     (LegendPanel._OnProjection): Handler for layer projection event.
4482     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4483     (LegendTree._OnRightClick): Event handler for right click, select item
4484     and pop up menu.
4485     (LegendTree.ToggleVisibility): Toggle layer visibility
4486     (LegendTree.LayerProjection): Raise layer projection dialog for
4487     current layer.
4488    
4489 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4490    
4491     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4492     declaration. The top-level element is projectionlist not projfile
4493    
4494 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4495    
4496     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4497     method to write a projfile and display a busy cursor and error
4498     dialogs.
4499     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4500     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4501     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4502     busy cursor while loading the user and system prj files.
4503    
4504 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4505    
4506     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4507     ProjFile objects
4508     (clear_proj_file_cache): New function to clear the cache. Mainly
4509     useful for use by the test suite
4510     (read_proj_file): Use the cache.
4511    
4512     * test/test_proj.py (TestProjFile): Clarify the doc-string
4513     (ProjFileReadTests): Update doc-string
4514     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4515     system proj files is cached.
4516     (ProjFileLoadTestCase): New base class for the proj file tests
4517     derived from support.FileLoadTestCase to provide some common
4518     behavior.
4519     (TestLoadingProjFile)
4520     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4521     (TestProjFileWithInvalidParameters.file_contents): Derive from
4522     ProjFileLoadTestCase
4523     (TestLoadingProjFile.test_caching): New. Test whether the cache
4524     works
4525    
4526 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4527    
4528     * debian/*: New directory with configuration files for building a thuban
4529     deb-package.
4530    
4531 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4532    
4533 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4534     __main__ so that missing unsubscribes are detected
4535     (TestProjFile.tearDown): Destroy the proj_file properly
4536    
4537     2003-10-14 Bernhard Herzog <[email protected]>
4538    
4539 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4540     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4541     the ProjFile objects
4542    
4543     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4544     easily send messages when the projections change
4545     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4546     when the change was successful
4547    
4548     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4549     proj file messages
4550     (TestProjFile.test_add_remove)
4551     (TestProjFile.test_remove_non_existing)
4552     (TestProjFile.test_replace)
4553     (TestProjFile.test_replace_non_existing): Test whether the right
4554     messages are sent
4555    
4556     2003-10-14 Bernhard Herzog <[email protected]>
4557    
4558 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4559     tests
4560     (TestProjFile.test_add_remove)
4561     (TestProjFile.test_remove_non_existing)
4562     (TestProjFile.test_replace)
4563     (TestProjFile.test_replace_non_existing): Some of the new
4564     individual test cases
4565     (TestProjFileSimple): New class for the rest of the test cases
4566     that came out of the refactoring
4567     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4568     derived classes don't have to
4569    
4570 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4571    
4572 bh 1820 Add an optional EPSG code to the projection objects and extend the
4573     .proj file format accordingly.
4574    
4575     * Resources/XML/projfile.dtd (element projection): Add epsg
4576     attribute
4577    
4578     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4579     instance variable epsg. Update doc-string
4580     (Projection.EPSGCode, Projection.Label): New methods to provide
4581     access to EPSG code and a label for use in dialogs
4582    
4583     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4584     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4585     Handle the epsg code attribute when reading or writing proj files
4586    
4587     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4588     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4589     (ProjFrame.__FillAvailList): Use the projection's Label method to
4590     get the string for the list box
4591    
4592     * test/test_proj.py (TestProjection.test_label)
4593     (TestProjection.test_label_epsg)
4594     (TestProjection.test_epsgcode_for_non_epsg_projection)
4595     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4596     for the label and EPSGCode methods
4597     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4598     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4599     objects in the test cases and put the expected contents into the
4600     test case methods too. Update doTestWrite accordingly
4601     (TestLoadingProjFile)
4602     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4603     read tests from TestProjFile.
4604     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4605     tests are now in the new classes.
4606     (sample_projfile, sample_projfile_data)
4607     (sample_projfile2, sample_projfile_data2): Removed. Not used
4608     anymore.
4609     (TestProjFile.test_read_unreadable_file): No need to reset the
4610     permissions at the end anymore since we use a unique filename
4611    
4612     2003-10-13 Bernhard Herzog <[email protected]>
4613    
4614 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4615     (ProjFileTest): New base class for the proj file tests.
4616     (TestProjFile): Derive from ProjFileTest
4617     (TestProjFile.test_read_unreadable_file)
4618     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4619     the new filename method to get a unique filename
4620     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4621     (WriteProjFileTests): New class for proj file write tests.
4622     Contains the write test that were in TestProjFile originally.
4623    
4624     2003-10-13 Bernhard Herzog <[email protected]>
4625    
4626 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4627     (TestProjFile.test_read_non_existing_file)
4628     (TestProjFile.test_read_unreadable_file)
4629     (TestProjFile.test_read_empty_file): Split into several methods.
4630    
4631 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4632    
4633 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4634    
4635     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4636     all projection type specific panels and put them into a
4637     NotebookLikeSizer. This way the dialog doesn't change its size
4638     when a different projection is selected
4639     (ProjFrame.__init__): Rename projection_panels
4640     projection_panel_defs and reuse projection_panels for a list of
4641     the instantiated panels.
4642     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4643     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4644     the panels
4645     (UnknownProjPanel._DoLayout): Place the newlines in the message
4646     differently to make the panel narrower.
4647     (TMPanel._DoLayout): Layout the parameters in one column.
4648    
4649     2003-10-10 Bernhard Herzog <[email protected]>
4650    
4651 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4652     that contains all the setup for the dialog's widgets, layout and
4653     event handling.
4654     (__): Call build_dialog to build the dialog.
4655     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4656     Their functionality is now in build_dialog
4657     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4658     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4659     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4660     different widget names and hierarchy introduced with build_dialog.
4661    
4662     2003-10-10 Bernhard Herzog <[email protected]>
4663    
4664 bh 1805 * README: Fix typo.
4665    
4666 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4667    
4668     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4669     projection is already in the list. This is *a lot* faster when
4670     loading files with hundreds of projections since it saves a linear
4671     search. OTOH this will allow adding the same projection to the
4672     user.proj file multiple times in the projection dialog but we'll
4673     deal with that later
4674    
4675 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4676    
4677     * devtools: New. Directory for developer tools that are not intended
4678     for the regular user.
4679    
4680     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4681     a python .proj file.
4682    
4683 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4684    
4685     * test/test_proj.py
4686     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4687     whether GetParameter handles parameters without "=" sign correctly
4688    
4689     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4690     parameters that do not contain a "=". Update the doc-string
4691    
4692 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4693    
4694 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4695     length limit on the projname text control
4696    
4697     2003-10-08 Bernhard Herzog <[email protected]>
4698    
4699 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4700     (TestProjection.test_get_projection_units_normal): New. Tests for
4701     the Projection.GetProjectedUnits method
4702    
4703 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4704    
4705     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4706     Added missing 'val' parameter.
4707    
4708 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4709    
4710 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4711     projection type of the currently selected projection is not known,
4712     i.e. there's no panel for it, use the UnknownProjPanel
4713     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4714     the actual replacing of the proj panel into the new method
4715     _show_proj_panel.
4716     (UnknownProjPanel): Add doc-string.
4717     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4718     that the panel is not so wide.
4719    
4720     2003-10-08 Bernhard Herzog <[email protected]>
4721    
4722 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4723     too. Update the doc-string
4724     (get_proj_files): Removed. It wasn't used anywhere
4725     (get_system_proj_files, get_system_proj_file): Rename to
4726     get_system_proj_file and return the ProjFile object and not a list
4727     of ProjFile objects. Update the callers.
4728     (get_user_proj_files, get_user_proj_file): Rename to
4729     get_user_proj_file return the ProjFile object and not a list of
4730     ProjFile objects. Update the callers.
4731     (ProjFileReader.__init__): New instance variable for the warnings.
4732     Rename the __pf ivar to projfile. Update the methods referring to
4733     __pf
4734     (ProjFileReader.end_projection): Catch any errors raised when
4735     instantiating the projection and record that as an error. The
4736     projection will not be in the final ProjFile object.
4737     (ProjFileReader.GetWarnings): New method to return the warnings.
4738    
4739     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4740     show the warnings from the projfile reader
4741     (ProjFrame._OnImport): Deal with any warnings returned by
4742     read_proj_file
4743     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4744     get_system_proj_file or get_user_proj_file.
4745    
4746     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4747     (TestProjFileWithInvalidParameters.file_contents): New test cases
4748     to test whether read_proj_file handles invalid projection
4749     parameters correctly
4750     (TestProjFile.test_get_system_proj_file): New. Simple test for
4751     resource.get_system_proj_file
4752    
4753 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4754    
4755     * test/test_derivedshapestore.py
4756     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4757     properly so that the temporary directories get deleted correctly
4758    
4759 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4760    
4761 bh 1783 Handle the title changes in a proper MVC way.
4762    
4763     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4764     canvas' TITLE_CHANGED messages
4765     (MainWindow.update_title): New. Update the main window's title
4766     (MainWindow.__SetTitle): Removed. Use update_title instead.
4767     (MainWindow.SetMap): Use update_title instead of __SetTitle
4768     (MainWindow.RenameMap): Do change the window title explicitly
4769     here. That's handled in a proper MVC way now.
4770     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4771     messages
4772    
4773     * Thuban/Lib/connector.py (Conduit): New class to help classes
4774     that forward messages
4775    
4776     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4777     (ViewPort): Derive from Conduit instead of Publisher
4778     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4779     when calling the inherited versions
4780     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4781     methods to subscribe and unsubscribe map messages
4782     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4783     handle the map subscriptions
4784     (ViewPort.Map, ViewPort.map_projection_changed)
4785     (ViewPort.layer_projection_changed): Add or update doc-strings
4786    
4787     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4788     typo
4789     (MyConduit): Helper class for the Conduit test.
4790     (TestConduit): Test cases for Conduit
4791    
4792     * test/test_connector.py: Use support.run_tests as main.
4793    
4794     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4795     the TITLE_CHANGED messages
4796     (ViewPortTest.test_forwarding_title_changed): New test to check
4797     whether the viewport forwards the map's TITLE_CHANGED messages
4798     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4799     after the port's because the latter may require a still functional
4800     map.
4801    
4802     2003-10-06 Bernhard Herzog <[email protected]>
4803    
4804 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4805     doc-string
4806    
4807     2003-10-06 Bernhard Herzog <[email protected]>
4808    
4809 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4810     (SimpleViewPortTest.test_init_with_size): Move the test for the
4811     initial size as a constructor parameter from ViewPortTest.setUp
4812     method to a new separate test in SimpleViewPortTest.
4813    
4814     2003-10-06 Bernhard Herzog <[email protected]>
4815    
4816 bh 1773 * test/test_viewport.py (MockView): New class derived from
4817     ViewPort with a mock implementation of GetTextExtent to be used in
4818     the test cases
4819     (ViewPortTest.setUp): Use MockView instead of ViewPort
4820    
4821     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4822     into what would be a "pure virtual function" in C++: always raise
4823     NotImplementedError. Mock implementations for test cases don't
4824     belong into the real code
4825    
4826 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4827    
4828     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4829     close the dbf file we create so that it's contents have been
4830     written properly.
4831    
4832     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4833     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4834     Update to shapelib 1.2.10
4835    
4836 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4837    
4838     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4839     it annoys lintian which warns about these files not being
4840     executable. The #! isn't necessary here since if you absolutely
4841     must execute them you can always say "python <filename>".
4842    
4843 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
4844    
4845 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4846     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4847     is ported to a newer the import will fail, so it should be noticed
4848     immediately that this function is gone.
4849     Fixes RT#1919
4850    
4851     2003-09-26 Bernhard Herzog <[email protected]>
4852    
4853 bh 1757 Add a DTD for the projection files and make thuban write valid
4854     projection files
4855    
4856     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4857     files
4858    
4859     * Thuban/Model/resource.py (ProjFileSaver.write): Use
4860     'projectionlist' as the name in the document type declaration so
4861     that it matches the element type of the root element.
4862    
4863     * test/test_proj.py (sample_projfile, sample_projfile2): Use
4864     'projectionlist' as the name in the document type declaration just
4865     as it is done now in the files thuban would write
4866     (sample_projfile, sample_projfile_data): Fix spelling of
4867     "Mercator"
4868     (TestProjFile.doTestWrite): Validate the written and the expected
4869     XML data
4870     (TestProjFile): Derive from ValidationTest so that we can run xml
4871     validation tests
4872    
4873 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
4874    
4875     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4876     modify the list returned by map.Layers() in place since it is the
4877     actual list of layers used by the map.
4878    
4879 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
4880    
4881     * Doc/manual/thuban-manual.xml: Added subsection to chapter
4882     Extensions to describe the extensions coming with the Thuban
4883     standard package (gns2shp and importAPR).
4884    
4885 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
4886    
4887     * libraries/thuban/wxproj.cpp (project_point): if there's an
4888     inverse but no forward projection, convert to degrees after
4889     applying the inverse projection. Fixes RT#2096
4890    
4891     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4892     implicitly tests for the fix to RT#2096
4893    
4894     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4895     Check that the sequences have the same lengths
4896    
4897     * Resources/Projections/defaults.proj (Geographic projection): Use
4898     a much more precise value for the to_meter attribute.
4899    
4900 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
4901    
4902     * test/support.py (initthuban): Make sure to unset the LANG env.
4903     var. so that tests that compare translated strings work. Solves RT
4904     #2094
4905    
4906 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
4907    
4908 jan 1735 Small improvement of APR import.
4909    
4910     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4911     Added tests for text-ranges.
4912    
4913     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4914     returns a string object if the range is based on text.
4915    
4916     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4917     range retrieval.
4918    
4919     2003-09-22 Jan-Oliver Wagner <[email protected]>
4920    
4921 jan 1730 Initial version of the importAPR extension which is in
4922     experimental state.
4923    
4924     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4925     /Extensions/importAPR/test/: New directories.
4926    
4927     * /Extensions/importAPR/samples/README: New: Howto load the samples.
4928    
4929     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4930     file which refers to the Thuban Iceland demo data.
4931    
4932     * /Extensions/importAPR/test/README: New: Howto execute the tests.
4933    
4934     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4935    
4936     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4937     as in '.apr'-files.
4938    
4939     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4940     ODB Objects as in '.apr', '.avl' and other files.
4941    
4942     * /Extensions/importAPR/__init__.py: New: Init to make this
4943     directory a package.
4944    
4945     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4946     project file (.apr) and convert it to Thuban.
4947    
4948     2003-09-22 Jan-Oliver Wagner <[email protected]>
4949    
4950     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4951    
4952 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
4953    
4954     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4955     with description on RPM installation and RPM binary package
4956     creation.
4957    
4958 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
4959    
4960     * setup.py (data_files): Only add the mo files if the Locales
4961     directory actually exists, so that setup.py works with a fresh CVS
4962     checkout
4963    
4964 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
4965    
4966     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4967     in viewport, not anymore in view
4968    
4969 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
4970    
4971     Introducing first Extension (gns2shp).
4972    
4973     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4974    
4975     * Extensions/__init__.py: New. init to make this dir a package.
4976    
4977     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4978    
4979     * Extensions/gns2shp/test/README: New. some info on this test directory.
4980    
4981     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4982    
4983     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4984     of Shapefile from GNS text file format
4985    
4986 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
4987    
4988 jan 1707 Fix/workaround for bug #2019:
4989     https://intevation.de/rt/webrt?serial_num=2019
4990    
4991     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4992     (IdentifyView.__init__): Added another button that allows to
4993     stop the identify mode.
4994     (IdentifyView.OnStop): New. Stops the identify mode.
4995    
4996     2003-09-03 Jan-Oliver Wagner <[email protected]>
4997    
4998 jan 1705 Introducing a new exception dialog that allows to exit the
4999     application immediately.
5000     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5001    
5002     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5003    
5004     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5005     Made strings available to translations. Exchanged the simple
5006     ScrolledMessageDialog by the new ExceptionDialog.
5007    
5008 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5009    
5010 bh 1701 * NEWS: New. Summary of changes and release notes.
5011    
5012     * MANIFEST.in: Add NEWS
5013    
5014     2003-09-01 Bernhard Herzog <[email protected]>
5015    
5016 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5017     include the documentation too.
5018    
5019     * setup.py (data_files): Add the .mo files
5020     (setup call): Up to version 0.9.0
5021    
5022     2003-09-01 Bernhard Herzog <[email protected]>
5023    
5024 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5025     parameter list to just parent and session
5026     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5027     selection of empty list boxes is not allowed (and produces C++
5028     assertion errors) and the rest of the setup is better done in
5029     __init__ anyway.
5030     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5031     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5032     builtins True/False for booleans to avoid warnings from wxPython
5033    
5034     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5035     ChooseDBTableDialog constructor parameters.
5036    
5037     2003-09-01 Bernhard Herzog <[email protected]>
5038    
5039 bh 1694 * Thuban/Model/postgisdb.py
5040     (PostGISTable): Extend doc-string
5041     (PostGISTable._fetch_table_information): Set the column index
5042     correctly, pretending ignored columns don't exist.
5043    
5044     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5045     for postgis tables with data types not yet supported by thuban.
5046    
5047 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5048    
5049     * HOWTO-Release: Tweak item about running the tests.
5050    
5051 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5052    
5053     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5054    
5055 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5056    
5057     Add some missing parameters to projections. Proj complains about
5058     them on windows but for some reason not on Linux.
5059    
5060     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5061     missing required projection parameters
5062    
5063     * test/test_proj.py (TestProjFile.test): Add missing required
5064     projection parameters
5065    
5066     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5067     (TestLayerProjection.test): Add missing required projection
5068     parameters and tests for them
5069    
5070     * test/test_load.py (TestLayerProjection.file_contents)
5071     (TestLayerProjection.test): Add missing required projection
5072     parameters and tests for them
5073    
5074     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5075     required projection parameters
5076    
5077     2003-08-29 Bernhard Herzog <[email protected]>
5078    
5079     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5080     access the pj_errno because directly accessing pj_errno doesn't
5081     work on windows if the proj library is in a DLL
5082    
5083     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5084    
5085 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5086    
5087 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5088     initthuban
5089    
5090     * test/test_load.py (LoadSessionTest.filenames): New class
5091     variable with the filename attributes to normalize
5092     (LoadSessionTest.check_format): Pass self.filenames to
5093     sax_eventlist to normalize the filename attributes
5094    
5095     * test/xmlsupport.py: Add cvs keywords
5096     (SaxEventLister.__init__): New parameter filenames which indicates
5097     attributes that contain filenames
5098     (SaxEventLister.startElementNS): Normalize the filename attributes
5099     with os.path.normpath
5100     (sax_eventlist): New parameter filenames to pass through to
5101     SaxEventLister
5102    
5103     * test/test_derivedshapestore.py: Make this file callable as a
5104     program to execute the tests
5105     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5106     the session to self.session so that it gets destroyed properly
5107    
5108     * test/test_layer.py (TestLayer.tearDown): Call the session's
5109     Destroy method
5110    
5111     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5112     too if it exists
5113     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5114     so that it gets destroyed properly
5115    
5116     * test/postgissupport.py (reason_for_not_running_tests): Add a
5117     test for the existence of popen2.Popen4.
5118    
5119     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5120     reliable way to destroy the sessions created in the test cases
5121     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5122     so that it gets destroyed properly
5123     (SaveSessionTest.testLayerProjection): Bind the session to
5124     self.session so that it gets destroyed properly
5125    
5126     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5127     sure that the session is destroyed properly
5128    
5129     * test/test_shapefilestore.py: Make this callable as a program to
5130     execute the tests
5131    
5132     * test/test_scalebar.py: Remove unnecessary import of _ from
5133     Thuban
5134    
5135     * test/support.py (print_garbage_information): Call initthuban
5136     here because it may be called indirectly from test cases that test
5137     test support modules which do not use anything from thuban itself
5138     (ThubanTestProgram.runTests): Remove unnecessary debug print
5139    
5140     2003-08-28 Bernhard Herzog <[email protected]>
5141    
5142 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5143    
5144     * Thuban/UI/mainwindow.py: Remove some unused imports
5145    
5146     * README: Add section about required additional software. Add date
5147     and revision CVS keywords
5148    
5149     * HOWTO-Release: Add item about the translations. Add date and
5150     revision CVs keywords and change formatting to match README a bit
5151     better
5152    
5153     * po/de.po: Update for 0.9
5154    
5155     * test/README: Tweak the wording a little because many tests are
5156     not really unittest.
5157    
5158 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5159    
5160 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5161     non-dev namespace
5162    
5163     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5164     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5165     namespace
5166    
5167     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5168     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5169    
5170     * test/test_save.py (SaveSessionTest.dtd)
5171     (SaveSessionTest.testEmptySession)
5172     (SaveSessionTest.testSingleLayer)
5173     (SaveSessionTest.testLayerProjection)
5174     (SaveSessionTest.testRasterLayer)
5175     (SaveSessionTest.testClassifiedLayer)
5176     (SaveSessionTest.test_dbf_table)
5177     (SaveSessionTest.test_joined_table)
5178     (SaveSessionTest.test_save_postgis): Update for new namespace
5179    
5180     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5181     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5182     (TestLayerProjection.file_contents)
5183     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5184     (TestPostGISLayer.file_contents)
5185     (TestPostGISLayerPassword.file_contents)
5186     (TestLoadError.file_contents, TestLoadError.test): Update for new
5187     namespace
5188    
5189     2003-08-27 Bernhard Herzog <[email protected]>
5190    
5191 bh 1663 Make the table interface distinguish between row ids (an integer
5192     that uniquely identifies a row) and row ordinals (a simple row
5193     count from 0 to NumRows() - 1)
5194    
5195     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5196     (PostGISTable.RowOrdinalToId): New methods to conver between row
5197     ids and row ordinals
5198     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5199     parameter row_is_ordinal to indicate whether the row parameter is
5200     the row id or the ordinal
5201    
5202     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5203     (TransientTableBase.RowOrdinalToId)
5204     (AutoTransientTable.RowIdToOrdinal)
5205     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5206     PostGISTable.
5207     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5208     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5209     Same new parameter as in PostGISTable.
5210    
5211     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5212     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5213     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5214     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5215     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5216     parameter as in PostGISTable.
5217    
5218     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5219     (DataTable.RowOrdinalToId): New methods to convert between row ids
5220     and row ordinals.
5221     (TableGrid.SelectRowById): New method to select a row based on its
5222     ID as opposed to its ordinal
5223     (DataTable.GetValue, TableGrid.OnRangeSelect)
5224     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5225     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5226     (LayerTableFrame.__init__): Convert between row ids and row
5227     ordinals as appropriate
5228    
5229     * test/postgissupport.py (PostGISDatabase.__init__): Add
5230     doc-string.
5231     (PostGISDatabase.initdb): The optional third item in a tuple in
5232     tables is now a (key, value) list with additional arguments to
5233     pass to upload_shapefile
5234     (upload_shapefile): New parameter gid_offset to allow gids that
5235     are not the same as the shapeids in the shapefile
5236     (PostgreSQLServer.get_default_static_data_db): Use the new
5237     gid_offset to make the gids in landmarks 1000 higher than the
5238     shapeids in the shapefile
5239    
5240     * test/test_viewport.py
5241     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5242     new shapeids in the landmarks table
5243    
5244     * test/test_transientdb.py
5245     (TestTransientTable.run_iceland_political_tests)
5246     (TestTransientTable.test_transient_joined_table): Add tests for
5247     the new table methods and new keywords arguments.
5248    
5249     * test/test_postgis_db.py
5250     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5251     (TestPostGISTable.test_read_value_row_count_mode)
5252     (TestPostGISTable.test_row_id_to_ordinal)
5253     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5254     table methods and the new arguments
5255     (TestPostGISShapestorePoint.test_shapes_in_region)
5256     (TestPostGISShapestorePoint.test_shape_raw_data)
5257     (TestPostGISShapestorePoint.test_shape_points)
5258     (TestPostGISShapestorePoint.test_shape_shapeid)
5259     (TestPostGISShapestorePoint.test_all_shapes)
5260     (TestPostGISTable.test_simple_query)
5261     (TestPostGISTable.test_simple_query)
5262     (TestPostGISTable.test_simple_query)
5263     (TestPostGISTable.test_read_value)
5264     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5265     shapeids in the landmarks table
5266    
5267     * test/test_memory_table.py
5268     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5269     (TestMemoryTable.test_read_value_row_count_mode)
5270     (TestMemoryTable.test_row_id_to_ordinal)
5271     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5272     table methods and the new arguments
5273    
5274     * test/test_dbf_table.py
5275     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5276     (TestDBFTable.test_read_value_row_count_mode)
5277     (TestDBFTable.test_row_id_to_ordinal)
5278     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5279     methods and the new arguments
5280    
5281 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5282    
5283 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5284     more postgis specific but much faster method to get the bounding
5285     box
5286    
5287     2003-08-26 Bernhard Herzog <[email protected]>
5288    
5289 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5290     (PostGISShapeStore.AllShapes): Add these missing methods.
5291     (PostGISShapeStore.ShapesInRegion): No need to raise
5292     StopIteration. We can simply return
5293    
5294     * test/test_postgis_db.py (TestPostGISTable.test_title)
5295     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5296     new methods
5297    
5298 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5299    
5300 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5301    
5302     * test/test_postgis_db.py (PolygonTests): New class containing
5303     those tests from TestPostGISShapestorePolygon that can also be
5304     used to test MUTLIPOLYGON tables
5305     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5306     so derive from that
5307     (TestPostGISShapestoreMultiPolygon): New class with tests for
5308     MUTLIPOLYGON tables
5309    
5310     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5311     tables argument to have tuples with three items to override the
5312     WKT type used.
5313     (PostgreSQLServer.get_default_static_data_db): Use the above to
5314     create a polygon table with MUTLIPOLYGONs
5315     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5316     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5317     coords_to*
5318     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5319     (wkt_converter): New. Map WKT types to converters
5320     (upload_shapefile): New parameter force_wkt_type to use a
5321     different WKT type than the default
5322    
5323     2003-08-25 Bernhard Herzog <[email protected]>
5324    
5325 bh 1655 * Thuban/UI/application.py
5326     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5327     db_connection_callback. Main difference is that the dialog run
5328     from this method doesn't have a parent so it can be used even when
5329     there is no main window
5330     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5331     no db_connection_callback was given. This way the dialog pops up
5332     even when the .thuban file was given as a command line parameter.
5333    
5334     2003-08-25 Bernhard Herzog <[email protected]>
5335    
5336 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5337     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5338     which leads to an effectively frozen X session because the user
5339     can only interact with the dialog but the mouse is still grabbed
5340     by the canvas.
5341     Also, call the tool's Hide method before MouseLeftUp because
5342     MouseLeftUp may change the tool's coordinates.
5343    
5344     2003-08-25 Bernhard Herzog <[email protected]>
5345    
5346 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5347     LoadCancelled exceptions and handle them by returning immediately.
5348    
5349     2003-08-25 Bernhard Herzog <[email protected]>
5350    
5351 bh 1649 GUI part of loading sessions with postgis connections which may
5352     require user interaction to get passwords or updated parameters
5353    
5354     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5355     bit nucer and be more generic.
5356     (DBFrame.OnAdd): Adapt to new DBDialog interface
5357    
5358     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5359     optional parameter db_connection_callback which is passed to
5360     load_session.
5361    
5362     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5363     Suitable as a db_connection_callback
5364     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5365     db_connection_callback of the application's OpenSession method
5366    
5367    
5368     2003-08-25 Bernhard Herzog <[email protected]>
5369    
5370 bh 1647 Basic loading of sessions containing postgis connections:
5371    
5372     * Thuban/Model/load.py (LoadError): Add doc-string
5373     (LoadCancelled): New exception class to indicate a cancelled load
5374     (SessionLoader.__init__): Add the db_connection_callback parameter
5375     which will be used by the loader to get updated parameters and a
5376     password for a database connection
5377     (SessionLoader.__init__): Add the new XML elements to the
5378     dispatchers dictionary
5379     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5380     to a byte-string object and idref as a generic id reference
5381     (SessionLoader.start_dbconnection)
5382     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5383     elements
5384     (load_session): Add the db_connection_callback to pass through the
5385     SessionLoader
5386    
5387     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5388     New classes to test loading of sessions with postgis database
5389     connections.
5390    
5391     2003-08-25 Bernhard Herzog <[email protected]>
5392    
5393 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5394     replace it and the comment with __BuildDate__ by the Source: and
5395     Id: cvs keywords as used in the other files.
5396    
5397     2003-08-25 Bernhard Herzog <[email protected]>
5398    
5399 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5400     LoadError when a required attribute is missing. The code used to
5401     be commented out for some reason, but probably should have been
5402     active.
5403    
5404     * test/test_load.py (TestLoadError.test): Test the message in the
5405     LoadError too to make sure it really is about the missing
5406     attribute
5407    
5408 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5409 bh 1641
5410     * test/test_save.py (SaveSessionTest.test_dbf_table)
5411     (SaveSessionTest.test_joined_table): Add XML validation tests.
5412    
5413     2003-08-22 Bernhard Herzog <[email protected]>
5414    
5415 bh 1639 Implement saving a session with a postgis connection
5416 bh 1632
5417 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5418     elements for database connections and shapestores using db
5419     connections
5420     (session): Add the dbconnections to the content model
5421    
5422     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5423     Write the db connections
5424     (SessionSaver.write_session): Call write_db_connections to write
5425     the connection before the data sources
5426     (SessionSaver.write_data_containers): Handle postgis shapestores
5427    
5428     * test/test_save.py (SaveSessionTest.thubanids)
5429     (SaveSessionTest.thubanidrefs): Update for new DTD
5430     (SaveSessionTest.test_save_postgis): New. Test saving a session
5431     with postgis connections
5432    
5433     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5434     (PostGISTable.TableName): New accessor methods for the connection
5435     and table name
5436    
5437     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5438     (TestPostGISTable.test_dbname): New methods to test the new
5439     PostGISConnection methods
5440    
5441     2003-08-22 Bernhard Herzog <[email protected]>
5442    
5443 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5444     for exceptions occurring when establishing a Database connection
5445     (PostGISConnection.connect): Catch psycopg.OperationalError during
5446     connects and raise ConnectionError.
5447    
5448     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5449     tests for database exceptions
5450    
5451     2003-08-22 Bernhard Herzog <[email protected]>
5452    
5453 bh 1635 Prepare the test suite for tests with required authentication
5454    
5455     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5456     variables with two predefined users/passwords, one for the admin
5457     and one for a non-privileged user.
5458     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5459     the non-privileged user to the database and set the admin password
5460     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5461     Better error reporting
5462     (PostgreSQLServer.connection_params)
5463     (PostgreSQLServer.connection_string): New methods to return
5464     information about how to connect to the server
5465     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5466     SQL statements
5467     (PostgreSQLServer.require_authentication): Toggle whether the
5468     server requires authentication
5469     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5470     Add or alter users
5471     (PostGISDatabase.initdb): Pass the admin name one the
5472     subprocesses' command lines. Grant select rights on
5473     geometry_columns to everybody.
5474     (upload_shapefile): Use the admin name and password when
5475     connecting. Grant select rights on the new table to everybody.
5476    
5477     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5478     server's new methods to get the connection parameters.
5479    
5480     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5481     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5482     server's new methods to get the connection parameters.
5483    
5484     * test/test_postgis_db.py
5485     (TestPostGISConnection.test_gis_tables_empty)
5486     (TestPostGISConnection.test_gis_tables_non_empty)
5487     (PostGISStaticTests.setUp): Use the server's new methods to get
5488     the connection parameters.
5489    
5490     2003-08-22 Bernhard Herzog <[email protected]>
5491    
5492 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5493    
5494     * Thuban/version.py: Add psycopg version
5495    
5496     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5497     version of the psycopg module
5498    
5499     2003-08-22 Bernhard Herzog <[email protected]>
5500    
5501     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5502     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5503     at the moment. The functionality should probably be implemented
5504     some time, though.
5505 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5506     removed because it's still in use.
5507 bh 1632
5508 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5509    
5510     * Thuban/UI/about.py (About.__init__): split up the huge about
5511     text into elements/lists for easier translation. This fixes bug
5512     https://intevation.de/rt/webrt?serial_num=2058
5513     Also, made some forgotten string available for the i18n.
5514    
5515 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5516    
5517     Make postgis support really optional including insensitive menu
5518     items.
5519    
5520     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5521     whether the postgis is supported.
5522    
5523     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5524     to make postgis support optional
5525    
5526     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5527     version of Thuban.Model.postgisdb.has_postgis_support
5528     (database_management command): Make it only sensitive if postgis
5529     is supported.
5530    
5531 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5532    
5533 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5534     (section Adding and Removing Layers): Added text and described
5535     multi-selection.
5536     (chapter Extensions): New.
5537    
5538     2003-08-21 Jan-Oliver Wagner <[email protected]>
5539    
5540 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5541     settings to allow multiple files to load into the map.
5542     Also reduced selection to *.shp as a default.
5543    
5544 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5545    
5546     Add dialogs and commands to open database connections and add
5547     database layers.
5548    
5549     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5550     method to open the database connection management dialog
5551     (MainWindow.AddDBLayer): New method to add a layer from a database
5552     (_has_dbconnections): New helper function to use for sensitivity
5553     (database_management command, layer_add_db command): New commands
5554     that call the above new methods.
5555     (main_menu): Add the new commands to the menu.
5556    
5557     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5558     (PostGISConnection.connect): Establish the actual connection in a
5559     separate method and call it in __init__. This makes it easier to
5560     override the behavior in test cases
5561     (PostGISConnection.BriefDescription): New method to return a brief
5562     description for use in dialogs.
5563    
5564     * test/test_postgis_db.py (NonConnection): DB connection that
5565     doesn't actually connect
5566     (TestBriefDescription): New class with tests for the new
5567     BriefDescription method
5568    
5569 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5570    
5571     Moved anything from extensions to libraries.
5572    
5573     * libraries: New.
5574    
5575     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5576    
5577     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5578     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5579     been moved here from thuban/extensions/pyprojection/
5580     See there in the Attic for the older history.
5581    
5582     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5583     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5584     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5585     have been moved here from thuban/extensions/pyshapelib/
5586     See there in the Attic for the older history.
5587    
5588     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5589     files have been moved here from thuban/extensions/shapelib/
5590     See there in the Attic for the older history.
5591    
5592     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5593     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5594     thuban/extensions/thuban/
5595     See there in the Attic for the older history.
5596    
5597     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5598    
5599     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5600     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5601    
5602     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5603     Moved to libraries/shapelib.
5604    
5605     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5606     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5607     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5608     Moved to libraries/pyshapelib.
5609    
5610     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5611     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5612     Moved to libraries/pyprojection.
5613    
5614     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5615    
5616     * extensions: Removed.
5617    
5618 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5619    
5620 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5621     facilities of FileTestMixin so don't derive from it.
5622     (TestViewportWithPostGIS): New class with tests for using a
5623     viewport on a map with postgis layers.
5624    
5625     2003-08-19 Bernhard Herzog <[email protected]>
5626    
5627     Add the db connection management to the session.
5628    
5629     * Thuban/Model/session.py (Session.__init__): New instance
5630     variable db_connections
5631     (Session.AddDBConnection, Session.DBConnections)
5632     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5633     (Session.RemoveDBConnection): New methods to manage and query the
5634     db connections managed by the session
5635     (Session.OpenDBShapeStore): New method to open a shapestore from a
5636     db connection
5637    
5638     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5639     messages for the db connection handling in the session
5640    
5641     * test/test_postgis_session.py: New. test cases for the session's
5642     db connection handling with postgis connections
5643    
5644     2003-08-19 Bernhard Herzog <[email protected]>
5645    
5646 bh 1606 Add very basic postgis database support and the corresponding test
5647     cases. The test cases require a PostgreSQL + postgis installation
5648     but no existing database. The database will be created
5649     automatically by the test cases
5650    
5651     * test/README: Add note about skipped tests and the requirements
5652     of the postgis tests.
5653    
5654     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5655    
5656     * test/test_postgis_db.py: New. Test cases for the postgis
5657     support.
5658    
5659     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5660     format
5661    
5662     * test/test_wellknowntext.py: New. Test cases for the
5663     wellknowntext parser
5664    
5665     * test/postgissupport.py: New. Support module for tests involving
5666     a postgis database.
5667    
5668     * test/support.py (execute_as_testsuite): Shut down the postmaster
5669     if it's still running after the tests
5670    
5671     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5672     well known text format
5673    
5674 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5675    
5676     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5677     message dialog.
5678    
5679 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5680    
5681 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5682     reason for the skips in the output to make it a bit more readable.
5683     (execute_as_testsuite): New helper function to run a test suite
5684     and print some more information.
5685     (run_tests): Use execute_as_testsuite to run the tests
5686    
5687     * test/runtests.py (main): Use execute_as_testsuite to run the
5688     tests
5689    
5690     2003-08-18 Bernhard Herzog <[email protected]>
5691    
5692 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5693     changes introduced in Python 2.3:
5694    
5695     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5696     filename is an absolute name
5697    
5698     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5699     filename is an absolute name
5700    
5701     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5702     unique filename to save to and use the correct relative filename
5703     in the expected output.
5704     (SaveSessionTest.test_dbf_table): Use the correct relative
5705     filename in the expected output.
5706    
5707     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5708     test to check whether the filename is absolute.
5709    
5710 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5711    
5712     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5713    
5714 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5715    
5716 bh 1594 Change the way shapes are returned by a shape store. The
5717     ShapesInRegion method returns an iterator over actual shape
5718     objects instead of a list of shape ids.
5719    
5720     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5721     id.
5722     (ShapefileStore.ShapesInRegion): Return an iterator over the
5723     shapes which yields shape objects instead of returning a list of
5724     shape ids
5725     (ShapefileStore.AllShapes): New. Return an iterator over all
5726     shapes in the shape store
5727     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5728    
5729     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5730     doc-string.
5731    
5732     * Thuban/UI/baserenderer.py
5733     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5734     layer_shapes and make it return an iterator containg shapes
5735     instead of a list of ids.
5736     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5737     layer_shapes() change
5738    
5739     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5740     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5741    
5742     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5743     changes in the ShapesInRegion return value.
5744     (ViewPort._get_hit_tester): Remove commented out code
5745    
5746     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5747     new return value.
5748     (SimpleShapeStore.AllShapes): New. Implement this method too.
5749    
5750     * test/test_layer.py (TestLayer.test_arc_layer)
5751     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5752     (TestLayer.test_point_layer_with_projection)
5753     (TestLayer.test_derived_store): Adapt to changes in the
5754     ShapesInRegion return value.
5755    
5756     * test/test_shapefilestore.py
5757     (TestShapefileStoreArc.test_shapes_in_region)
5758     (TestShapefileStorePolygon.test_shapes_in_region)
5759     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5760     in the ShapesInRegion return value.
5761     (TestShapefileStorePoint.test_all_shapes)
5762     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5763     methods
5764    
5765     * test/test_derivedshapestore.py
5766     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5767     the ShapesInRegion return value.
5768     (TestDerivedShapeStore.test_all_shapes)
5769     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5770     methods
5771    
5772     2003-08-15 Bernhard Herzog <[email protected]>
5773    
5774 bh 1592 Make the renderers deal correctly with raw vs. python level
5775     representation of shape geometries
5776    
5777     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5778     Return a flag useraw in addition to the callable and the parameter
5779     to indicate whether the callable can deal with the raw shape data
5780     or uses the higher level python lists of coordinates. The callable
5781     now should accept either the raw data or the return value of the
5782     shape's Points() method.
5783     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5784     change
5785     (BaseRenderer.projected_points): Instead of the shape id use the
5786     points list as parameter.
5787     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5788     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5789     change and accept the points list as parameter instead of the
5790     shape id.
5791    
5792     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5793     the useraw flag as required by the BaseRenderer
5794     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5795     changes.
5796    
5797     * test/test_baserenderer.py
5798     (TestBaseRenderer.test_point_with_classification): New test for
5799     rendering a map with classifications.
5800    
5801     2003-08-15 Bernhard Herzog <[email protected]>
5802    
5803 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5804     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5805     (ViewPort._get_hit_tester, ViewPort.projected_points)
5806     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5807     (ViewPort._find_label_at): Split the find_shape_at method into
5808     several new methods and use the functions in the hit-test module.
5809    
5810     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5811     functions
5812    
5813     * test/test_hittest.py: New. Test for the new hittest module
5814    
5815     2003-08-15 Bernhard Herzog <[email protected]>
5816    
5817 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5818     projection to all corners of the bounding box to get a better
5819     approximation of the projected bounding box
5820    
5821     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5822     New. Test coordinate handling of a layer with a projection.
5823     Catches the bug fixed in Layer.ShapesInRegion
5824    
5825     2003-08-15 Bernhard Herzog <[email protected]>
5826    
5827 bh 1586 Move some of the mock objects in test_baserenderer into their own
5828     module so they can easily be used from other tests
5829    
5830     * test/mockgeo.py: New test helper module with some mock objects
5831     for geometry related things like shapes, shapestores and
5832     projections.
5833    
5834     * test/test_mockgeo.py: New. Tests for the new helper module
5835    
5836     * test/test_baserenderer.py: Some of the mock-objects are in
5837     mockgeo now.
5838    
5839 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
5840    
5841     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5842    
5843 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
5844    
5845 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
5846    
5847     2003-08-12 Bernhard Herzog <[email protected]>
5848    
5849 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5850     strings have to be one string literal.
5851    
5852 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
5853    
5854 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5855     New. This method was used in various derived classes, but it's
5856     better to have it here.
5857    
5858     * test/test_shapefilestore.py
5859     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5860     FloatComparisonMixin
5861    
5862     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5863     It's now in FloatComparisonMixin
5864    
5865     * test/test_derivedshapestore.py
5866     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5867     in FloatComparisonMixin
5868    
5869     2003-08-11 Bernhard Herzog <[email protected]>
5870    
5871 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5872     error message
5873    
5874 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
5875    
5876 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5877     with version number.
5878     Changed title to reflect version number of Thuban.
5879    
5880     2003-08-08 Jan-Oliver Wagner <[email protected]>
5881    
5882 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5883     the list corresponds to the "About" web page.
5884    
5885 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
5886    
5887     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5888     Make sure translated strings are recognized as one string literal.
5889    
5890     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5891     Make sure translated strings are recognized as one string literal.
5892    
5893     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5894     translated strings are recognized as one string literal.
5895    
5896     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5897     sure translated strings are recognized as one string literal.
5898    
5899 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
5900    
5901 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5902     Simply delegates to the original shapestore.
5903    
5904     * test/test_derivedshapestore.py
5905     (TestDerivedShapeStore.test_raw_format): New. Test case for
5906     DerivedShapeStore.RawShapeFormat
5907    
5908     2003-08-07 Bernhard Herzog <[email protected]>
5909    
5910 bh 1561 Add raw data interface to shape objects.
5911    
5912     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5913     class to ShapefileShape which now holds shapefile specific
5914     information.
5915     (ShapefileShape.compute_bbox): Simplified to not cache any
5916     information. The way this method is used that shouldn't matter
5917     performance wise.
5918     (ShapefileShape.RawData): New. Return the shapeid which is the raw
5919     data format for shapes from shapefiles.
5920     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5921     in the shape objects returned by a shapestore. For a
5922     ShapefileStore this is always RAW_SHAPEFILE.
5923     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5924     method.
5925    
5926     * test/test_shapefilestore.py
5927     (TestShapefileStore.test_raw_format): New test to test the raw
5928     format feature of shapes.
5929    
5930 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
5931     data. It was only there for interface compatibility but it's not
5932 bh 1561 used inside of Thuban and the generic Shape class has gone away.
5933 bh 1560
5934 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5935     the raw data format and only use an optimized version of its a
5936     shapefile.
5937    
5938 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
5939    
5940 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
5941     tests.
5942     (SimpleShapeStore.Shape): Use SimpleShape instead of
5943     Thuban.Model.data.Shape to make the tests independed of the coming
5944     changes.
5945    
5946     2003-08-07 Bernhard Herzog <[email protected]>
5947    
5948 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5949     (ThubanTestProgram): New classes that extend the respective
5950     classes from unittest. These new version support skipping tests
5951     under certain expected conditions. In the Thuban test suite we
5952     uses this for tests that require the optional gdal support.
5953     (run_tests): Use ThubanTestProgram instead of the unittest.main()
5954    
5955     * test/runtests.py (main): Use the new ThubanTestRunner instead of
5956     the normal one from unittest
5957    
5958     * test/test_layer.py (TestLayer.test_raster_layer): If this test
5959     is not run because gdal support isn't available report this to the
5960     runner.
5961    
5962     * test/test_baserenderer.py
5963     (TestBaseRenderer.test_raster_no_projection): Do not run this test
5964     if gdal support isn't available and report this to the runner.
5965    
5966 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
5967    
5968     Rearrange the renderers a bit, partly in preparation for changes
5969     required for the postgis merge, partly to make it more testable.
5970     Also make the representation of coordinates in Shapes more
5971     consistent.
5972    
5973     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5974     this class is now in BaseRenderer. This class is now practically
5975     only a specialization of BaseRenderer for rendering to an actual
5976     wx DC.
5977     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5978     to get the shapetype specific rendering functions.
5979    
5980     * Thuban/UI/baserenderer.py: New file with the basic rendering
5981     logic. The code in this file is completely independend of wx.
5982     (BaseRenderer): Class with the basic rendering logic
5983    
5984     * test/test_baserenderer.py: New. Test cases for BaseRenderer
5985    
5986     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5987     error_on_redraw to guard agains endless loops and stack overflows
5988     when there's a bug in the rendering code that raises exceptions.
5989     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5990     rendering into a separate method _do_redraw so that error handling
5991     is a bit easier. When an exception occurs, set error_on_redraw to
5992     true. When it's true on entry to OnIdle do nothing and return
5993     immediately.
5994    
5995     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5996     Shape object will always have the coordinates as a list of list of
5997     coordinate pairs (tuples).
5998     (Shape.compute_bbox): Adapt to new representation.
5999    
6000     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6001     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6002     Shape objects.
6003    
6004     * test/test_shapefilestore.py
6005     (ShapefileStoreTests.assertFloatTuplesEqual)
6006     (ShapefileStoreTests.assertPointListEquals): Rename to
6007     assertPointListEquals and change purpose to checking equality of
6008     the lists returned by Shape.Points().
6009     (TestShapefileStoreArc.test_shape)
6010     (TestShapefileStorePolygon.test_shape)
6011     (TestShapefileStorePoint.test_shape): Use the new
6012     assertPointListEquals instead of assertFloatTuplesEqual
6013    
6014     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6015     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6016     and change purpose to checking equality of the lists returned by
6017     Shape.Points().
6018     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6019     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6020     (TestLayer.test_derived_store): Use the new assertPointListEquals
6021     instead of assertFloatTuplesEqual
6022    
6023     * test/test_derivedshapestore.py
6024     (TestDerivedShapeStore.assertFloatTuplesEqual)
6025     (TestDerivedShapeStore.assertPointListEquals): Rename to
6026     assertPointListEquals and change purpose to checking equality of
6027     the lists returned by Shape.Points().
6028     (TestDerivedShapeStore.test_shape): Use the new
6029     assertPointListEquals instead of assertFloatTuplesEqual
6030    
6031 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6032    
6033     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6034     a bounding box. A dialog is raised in case, no bounding box
6035     is found. This fixes bug #2043:
6036     https://intevation.de/rt/webrt?serial_num=2043
6037    
6038 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6039    
6040     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6041     object look like a Color instantiation. Formerly it looked like a
6042     tuple.
6043    
6044     * test/test_color.py (TestColor.test_repr)
6045     (TestColor.test_equality, TestColor.test_inequality): New. test
6046     some more apects of the Color class
6047     (TestTransparent.test_repr, TestTransparent.test_hex)
6048     (TestTransparent.test_equality): New. Test cases for the
6049     Transparent object.
6050    
6051 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6052    
6053     * Doc/manual/thuban-manual.xml: a number of small improvements.
6054     The resulting file is the version submitted for GREAT-ER II.
6055    
6056 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6057    
6058 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6059     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6060     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6061    
6062     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6063     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6064     (ThubanEndBusyCursor): Add doc-strings
6065    
6066     2003-08-01 Bernhard Herzog <[email protected]>
6067    
6068 bh 1540 First step towards PostGIS integration. More abstraction by movin
6069     more code from the layer to the shapestore. More methods of the
6070     layer are now simply delegated to the equivalent method of the
6071     shapestore. The SHAPETYPE_* constants are now in data not in
6072     layer.
6073    
6074     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6075     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6076     layer.py to data.py
6077     (ShapefileStore.__init__): More Initialization for the new methods
6078     and functionality.
6079     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6080     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6081     (ShapefileStore.Shape): New methods that were formerly implemented
6082     in the layer.
6083     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6084     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6085     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6086     equivalents of the new shape methods. These versions are simply
6087     delegated to the original shapstore.
6088    
6089     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6090     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6091     (Layer.SetShapeStore): Removed the initializatin of instance
6092     variables that were needed for the stuff that's now in
6093     ShapefileStore
6094     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6095     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6096     shapestore.
6097    
6098     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6099     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6100     instead of layer.
6101    
6102     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6103    
6104     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6105    
6106     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6107     instead of layer.
6108     (TestLayer.test_derived_store): Remove the test for the exception
6109     when instantiating the DerivedShapeStore with an incompatible
6110     table which is now in test_derivedshapestore.py. Add some more
6111     tests of the layer methods to determine whether they work for a
6112     DerivedShapeStore as well.
6113    
6114 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6115    
6116     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6117     by just listing the name and where they can be found.
6118    
6119 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6120    
6121     * Doc/manual/thuban-manual.xml:
6122     Changed the screenshot elements to figure.
6123     Changed some variablelist elements to itemizedlist.
6124     Added section on GDAL formats.
6125    
6126 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6127    
6128     * Doc/manual/thuban-manual.xml: Added a few sentences about
6129     the Fix Border Color option when generating classes.
6130    
6131 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6132    
6133     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6134     Ramp instances to use lower_case_style.
6135    
6136     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6137    
6138     * Thuban/UI/classifier.py: Add docstrings.
6139    
6140     * Thuban/UI/dock.py: Add docstrings.
6141    
6142     * test/test_classgen.py: Use renamed Ramp instances.
6143    
6144 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6145    
6146 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6147     was never used in Thuban.
6148    
6149     2003-07-30 Bernhard Herzog <[email protected]>
6150    
6151 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6152     method directly instead of going through the transient_table
6153     method. This faster because transient_table may force the copy of
6154     a DBF file into the transient database and setting a table's title
6155     doesnm't affect the title of the associated transient table, so
6156     this fixes RT #2042
6157    
6158     * Thuban/UI/main.py (__version__): Don't import the already
6159     removed show_exception_dialog.
6160    
6161 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6162    
6163 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6164     Put back this method and remove the equivalent function since we
6165     are setting the exception hook from within this class (OnInit).
6166    
6167     2003-07-29 Jonathan Coles <[email protected]>
6168    
6169 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6170     Doc/manual/images/5_2_quantiles.png,
6171     Doc/manual/images/5_2_uniform_dist.png,
6172     Doc/manual/images/5_2_unique_values.png,
6173     Doc/manual/images/8_int_error.png: New screen shots.
6174    
6175     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6176     some points, and added more screen shots.
6177    
6178 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6179    
6180 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6181    
6182     2003-07-29 Bernhard Herzog <[email protected]>
6183    
6184 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6185     deprecated since before the 0.8 release and isn't used in Thuban
6186     itself anymore.
6187    
6188 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6189    
6190 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6191 jonathan 1506
6192     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6193     python exception hook here so that we are sure to catch any
6194     Thuban exception that happen during initialization.
6195    
6196     * Thuban/UI/main.py (main): Don't set the exception hook here,
6197     it will get set in ThubanApplication.OnInit.
6198    
6199     2003-07-29 Jonathan Coles <[email protected]>
6200 jonathan 1503
6201     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6202     Removed and called it show_exception_dialog() so that the exception
6203     handler can be set before the class is created.
6204    
6205     * Thuban/UI/main.py (main): Install the exception handler before
6206     a ThubanApplication is created.
6207    
6208 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6209    
6210     * po/it.po: New. Italian translation by Maurizio Napolitano
6211    
6212     * po/ru.po: New. Russian translation by Alex Shevlakov
6213    
6214 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6215    
6216 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6217     projections.
6218    
6219     2003-07-29 Frank Koormann <[email protected]>
6220    
6221 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6222    
6223 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6224    
6225 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6226     on white background.
6227    
6228     2003-07-29 Jonathan Coles <[email protected]>
6229    
6230 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6231     descriptions for the legend toolbar.
6232    
6233     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6234     cursor from dialog box.
6235    
6236     2003-07-28 Jonathan Coles <[email protected]>
6237    
6238     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6239    
6240     * Doc/manual/images/2_4_session_tree.png,
6241     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6242     Doc/manual/images/4_2_layer_properties.png,
6243     Doc/manual/images/4_2_raster_layer_properties.png,
6244     Doc/manual/images/5_3_genclass.png,
6245     Doc/manual/images/5_classification.png,
6246     Doc/manual/images/6_projection.png,
6247     Doc/manual/images/7_1_table_view.png,
6248     Doc/manual/images/7_2_5_join.png: New screenshots.
6249    
6250     2003-07-24 Jonathan Coles <[email protected]>
6251    
6252     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6253    
6254     2003-07-24 Jonathan Coles <[email protected]>
6255    
6256     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6257     chapter on Layer Management.
6258    
6259     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6260     manual and images.
6261    
6262 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6263    
6264     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6265     it annoys lintian which warns about these files not being
6266 jan 1767 executable. The #! isn't necessary here since if you absolutely
6267 bh 1483 must execute them you can always say "python <filename>".
6268    
6269     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6270     superfluous code to set brush and pen for point shapes
6271    
6272     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6273     belong in viewport anyway
6274    
6275 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6276    
6277     * Doc/manual/thuban-manual.xml: Added section on table management.
6278    
6279 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6280    
6281     * test/runtests.py (main): Recognize the long "verbose" option
6282     correctly.
6283    
6284 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6285    
6286     * Doc/manual/thuban-manual.xml: Continue to write first revision
6287     of the manual.
6288    
6289     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6290     with Begin/EndDrawing() calls to ensure we aren't doing to
6291     many updates to the dc during rendering.
6292     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6293     a pen and brush argument so they need to be passed to the function.
6294    
6295     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6296     Calculates the minimum and maximum scale values. Factored out
6297     of set_view_transform so that it could be used to zoom all the
6298     way into a single point.
6299     (ViewPort.set_view_transform): Call calc_min_max_scales().
6300     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6301     if only a single point is selected.
6302    
6303     * Doc/manual/images/1_2_legend_close.png,
6304     Doc/manual/images/1_2_legend_dock.png,
6305     Doc/manual/images/1_2_mainwindow.png,
6306     Doc/manual/images/1_2_mainwindow.ps,
6307     Doc/manual/images/1_2_mainwindow.sk,
6308     Doc/manual/images/3_2_fullextent.png,
6309     Doc/manual/images/3_2_fulllayerextent.png,
6310     Doc/manual/images/3_2_fullshapeextent.png,
6311     Doc/manual/images/3_2_pan.png,
6312     Doc/manual/images/3_2_zoomin.png,
6313     Doc/manual/images/3_2_zoomout.png,
6314     Doc/manual/images/3_3_identify.png,
6315     Doc/manual/images/3_3_label.png,
6316     Doc/manual/images/3_5_invisible.png,
6317     Doc/manual/images/3_5_movedown.png,
6318     Doc/manual/images/3_5_moveup.png,
6319     Doc/manual/images/3_5_props.png,
6320     Doc/manual/images/3_5_tobottom.png,
6321     Doc/manual/images/3_5_totop.png,
6322     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6323    
6324 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6325    
6326 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6327    
6328     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6329     after the new map has been assigned
6330    
6331     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6332     Delegate MAP_REPLACED to the canvas too
6333     (MainWindow.prepare_new_session): Removed. Thanks to the new
6334     MAP_REPLACED message it's no longer needed
6335     (MainWindow.OpenSession, MainWindow.NewSession):
6336     prepare_new_session has been removed.
6337    
6338     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6339     MAP_REPLACED so that we can close the dialog if a new map is set.
6340     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6341     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6342     dialog
6343    
6344     * test/test_viewport.py (SimpleViewPortTest)
6345     (SimpleViewPortTest.test_default_size): Add doc-strings
6346     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6347     tests. Subscribe to MAP_REPLACED messages too.
6348     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6349     (ViewPortTest.test_set_map): New test for the SetMap method.
6350    
6351     2003-07-18 Bernhard Herzog <[email protected]>
6352    
6353 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6354     Move this test from ViewPortTest.setUp to this new separate test
6355     case. setUp is not the place for the actual tests.
6356     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6357     more of the test from setUp to the new test test_inital_settings.
6358     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6359     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6360     test_win_to_proj and test_proj_to_win and make the tests easier to
6361     understand
6362     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6363     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6364     (ViewPortTest.test_unprojected_rect_around_point)
6365     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6366     Reformat to increase readability.
6367    
6368     2003-07-18 Bernhard Herzog <[email protected]>
6369    
6370 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6371    
6372     2003-07-18 Bernhard Herzog <[email protected]>
6373    
6374 bh 1459 * test/runtests.py: The test suite can now be run without an X
6375     connection. To make sure this remains true, remove the DISPLAY
6376     environment variable so that an error occurs if the wxGTK is
6377     imported accidentally
6378    
6379     2003-07-18 Bernhard Herzog <[email protected]>
6380    
6381 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6382    
6383     * Thuban/UI/view.py: Remove unused imports
6384    
6385     2003-07-18 Bernhard Herzog <[email protected]>
6386    
6387 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6388     function is now in viewport.py and is called output_transform
6389     (TestScalebar.test_output_transform)
6390     (TestScalebar.test_OutputTransform): Renamed to
6391     test_output_transform and updated to use output_transform instead
6392     of OutputTransform
6393    
6394     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6395     renamed.
6396     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6397     renamed to output_transform
6398    
6399     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6400     Rename to output_transform
6401    
6402     2003-07-18 Bernhard Herzog <[email protected]>
6403    
6404 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6405     classificationField to classificatin_column and init it here so
6406     that it can be used in SetClassificationColumn
6407     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6408     Rename to GetClassificationColumn.
6409     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6410     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6411     message if the column changes.
6412     (Layer._classification_changed, Layer.ClassChanged): Rename to
6413     _classification_changed. Update the callers.
6414     (Layer.SetShapeStore): Further field->column renames.
6415    
6416     * Thuban/Model/load.py (SessionLoader.start_classification)
6417     (SessionLoader.start_clpoint): Updates because of
6418     field->column method name changes in the Layer class
6419    
6420     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6421     because of field->column method name changes in the Layer class
6422    
6423     * Thuban/UI/classifier.py (Classifier.__init__)
6424     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6425     field->column method name changes in the Layer class
6426    
6427     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6428     because of field->column method name changes in the Layer class
6429    
6430     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6431     of field->column method name changes in the Layer class
6432    
6433     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6434     (SaveSessionTest.testClassifiedLayer): Update because of
6435     field->column method name changes in the Layer class
6436    
6437     * test/test_layer.py (SetShapeStoreTests.setUp)
6438     (SetShapeStoreTests.test_sanity): Update because of field->column
6439     method name changes in the Layer class
6440     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6441     (TestLayerModification.test_sanity)
6442     (TestLayerModification.test_initial_settings): remove unsued code
6443     and rename to test_sanity.
6444     (TestLayerModification.test_set_classification): New test for
6445     SetClassification and SetClassificationField.
6446    
6447     2003-07-18 Bernhard Herzog <[email protected]>
6448    
6449 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6450     the non-fixed values as well. The old test would have accepted a
6451     fixed ramp that only returnes the fixed properties
6452    
6453 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6454    
6455     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6456     shots for the manual. The XCF file is the source image and
6457     has additional layers to support changes.
6458    
6459     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6460    
6461     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6462     Return both the new class and the field name.
6463    
6464     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6465     fit the map to the window as this changes any zoom level that
6466     the user may have set.
6467    
6468 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6469    
6470     * Thuban/Model/classgen.py (generate_singletons,
6471     generate_uniform_distribution, generate_quantiles): Remove
6472     fixes parameter, but maintain the same functionality by having
6473     the calling function pass a FixedRamp object for the ramp.
6474     (FixedRamp): New. Adapts a ramp to have fixed property values.
6475    
6476     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6477     (Classification): Inherit from Publisher.
6478     (Classification.__init__): Remove the layer parameter.
6479     Classifications no longer need to have a parent layer.
6480     (Classification.GetField, Classification.GetFieldType,
6481     Classification.SetFieldInfo): Removed. The field name is stored
6482     in the layer, and the type can be retreived by calling
6483     Layer.GetFieldType().
6484     (Classification._set_layer, Classification.GetLayer): Removed.
6485     Classifications no longer have a parent layer.
6486    
6487     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6488     classification.
6489     (Layer.SetShapeStore): Reset the classification first while
6490     we still have the old shape store to work with.
6491     (Layer.GetClassificationField, Layer.SetClassificationField):
6492     New. Method for getting/setting the field to classify on.
6493     (Layer.SetClassification): Simplified now that the layer
6494     simply has to hold a reference to the classification and not
6495     tell the classification who owns it.
6496     Fixes RTbug #2023.
6497    
6498     * Thuban/Model/load.py (SessionLoader.start_classification):
6499     Set the field name on the layer, not the classification.
6500    
6501     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6502     classification is modified.
6503    
6504     * Thuban/Model/save.py (SessionSaver.write_classification):
6505     Get the field name and type from the layer.
6506    
6507     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6508     parameter records to rows and add docstring. Fixes RTbug #1997.
6509    
6510     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6511     ramp when we need to fix certain values of a ramp rather than
6512     using the old fixes parameter. Fixes RTbug #2024.
6513    
6514     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6515     parameter.
6516     (ClassTable.Reset): Add fieldType parameter and use it, rather
6517     than asking the classification.
6518     (Classifier.__init__): Remember the original class's field
6519     and ask the layer for the field type, rather than the classification.
6520     (Classifier.__SetGridTable): Retrieve the field and field type
6521     for the table because they are not in the classification.
6522     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6523     field on the layer in addition to the classification itself.
6524    
6525     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6526     classification field from layer.
6527    
6528     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6529     classification field from layer. Split up tests and remove
6530     *-imports. Fixes RTbug #1992.
6531    
6532     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6533    
6534     * test/test_classification.py
6535     (TestClassification.test_classification): Remove tests for methods
6536     that no longer exist.
6537    
6538     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6539     __init__ no longer has a field parameter, use SetClassificationField.
6540     (SetShapeStoreTests.test_sanity): Use layer object to get class
6541     field info.
6542    
6543     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6544     SetClassificationField on layer to set class field info.
6545    
6546     * test/test_viewport.py: Renamed from test/test_view.py.
6547    
6548 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6549    
6550     * Doc/manual/thuban-manual.xml: Added authors and an initial
6551     coarse structure.
6552    
6553 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6554    
6555 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6556     and therefore should not be derived from any other class.
6557    
6558     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6559     mix-in, so derive from TestCase as well.
6560    
6561     2003-07-15 Bernhard Herzog <[email protected]>
6562    
6563 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6564     draw_func handling a bit to remove one layer of indirection. This
6565     makes the renderer about 10% faster in the non-classifying case
6566     and the code a bit cleaner
6567     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6568     and set them in the dc. Now the draw_point_shape method and
6569     wxproj's draw_polygon_shape function have basically the same
6570     signature so that both can be directly used as draw_func
6571    
6572     2003-07-15 Bernhard Herzog <[email protected]>
6573    
6574 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6575     string values (in addition to the labels) as UTF 8
6576    
6577     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6578     values if the field type is string
6579    
6580     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6581     saving a session with non-ascii string classification values.
6582    
6583     * test/test_load.py (TestClassification.file_contents)
6584     (TestClassification.test): Check for non-ascii values in string
6585     classifications
6586    
6587 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6588    
6589     * test/test_view.py: New. Tests for ViewPort.
6590    
6591 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6592    
6593     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6594     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6595    
6596 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6597     unicode strings from session file: session title, map title and
6598     projection name.
6599    
6600 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6601    
6602 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6603     drag_stop, not drag_move when the mouse is released.
6604    
6605     2003-07-10 Jonathan Coles <[email protected]>
6606    
6607 jonathan 1403 The most important part of this is the seperation of view.py into
6608     two pieces. viewport.py now has a class called ViewPort which
6609     contains all the non-wx parts of view.py and can therefore be
6610     tested. view.py contains only the wx-specific parts and is fairly
6611     simple.
6612    
6613     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6614     RTTbug #1992.
6615     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6616     RTTbug #1992.
6617    
6618     * Thuban/Model/classgen.py (generate_singletons,
6619     generate_uniform_distribution, generate_quantiles):
6620     Added 'fixes' parameter so that property attributes can
6621     be held constant over the generated classification groups.
6622     (CustomRamp.GetProperties): Remove unused variables.
6623    
6624     * Thuban/Model/map.py (Map.SetProjection): Send the old
6625     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6626     event.
6627    
6628     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6629     parameter which is a list of records that restricts which
6630     records are saved. Fixes RTbug #1997.
6631    
6632     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6633     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6634    
6635     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6636     to allow the user to fix line color/width on generated groups.
6637     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6638     functions to optionally fix group properties.
6639    
6640     * Thuban/UI/main.py (main): Set exception hook to the
6641     ShowExceptionDialog. Fixes RTbug #1993.
6642    
6643     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6644     the table window when it is selectd to be shown.
6645    
6646     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6647     Export Selection button and move the export buttons underneath
6648     the table.
6649     (QueryTableFrame.UpdateStatusText): Added event argument so
6650     that it can respond to grid selection events. The status text
6651     is now updated even when the table is not associated with a
6652     layer as was previously assumed.
6653     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6654     UpdateStatusText responds to these events.
6655     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6656     (QueryTableFrame.doExport): Helper function that saves the
6657     entire table, or selected rows, to a file.
6658     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6659     Respond to export button events and call doExport.
6660    
6661     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6662     the function doesn't return NULL without first setting a Python
6663     Error.
6664    
6665     * test/runtests.py (main): Only print "Unknown option" for
6666     unsupported options.
6667    
6668     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6669     optional epsilon argument to specify floating point accuracy.
6670     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6671     for each item test.
6672    
6673     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6674     tests for saving selected records.
6675    
6676     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6677     tests for saving selected records.
6678    
6679     * test/test_map.py (TestMapWithContents.test_set_projection):
6680     MAP_PROJECTION_CHANGED events send the old projection.
6681    
6682     * test/test_session.py
6683     (TestSessionWithContent.test_forward_map_projection):
6684     MAP_PROJECTION_CHANGED events send the old projection.
6685    
6686     * test/test_table.py (TableTest): Update tests to use non-deprecated
6687     functions.
6688    
6689 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6690    
6691 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6692     constants in the column objects are the standard ones defined in
6693     the table module.
6694    
6695     * test/test_transientdb.py
6696     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6697     exporting transient tables as DBF works. This should catch the bug
6698     just fixed in TransientTableBase.Width.
6699    
6700     2003-07-08 Bernhard Herzog <[email protected]>
6701    
6702 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6703     interpolated colors correctly.
6704    
6705     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6706     New. Test case for the fix in classgen.py
6707    
6708     2003-07-08 Bernhard Herzog <[email protected]>
6709    
6710 bh 1378 * test/runtests.py (main): Make the default output less verbose
6711     and add a verbosity option (-v) to get the old output
6712    
6713     2003-07-08 Bernhard Herzog <[email protected]>
6714    
6715 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6716     0.9.
6717    
6718     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6719     New. Return the join type
6720    
6721     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6722     DTD
6723     (SessionSaver.write_data_containers): Save the join type for
6724     joined tables
6725    
6726     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6727     namespace
6728     (SessionLoader.start_jointable): Handle the jointype attribute
6729    
6730     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6731     as of Thuban 0.8. These are now tests to determine whether Thuban
6732     can still read files generated by Thuban 0.8
6733    
6734     * test/test_load.py (LoadSessionTest.dtd)
6735     (TestSingleLayer.file_contents)
6736     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6737     (TestLayerProjection.file_contents)
6738     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6739     (TestJoinedTable.file_contents)
6740     (TestLoadError.file_contents): Update for new DTD
6741     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6742     for new join type attribute
6743    
6744     * test/test_save.py (SaveSessionTest.dtd)
6745     (SaveSessionTest.testEmptySession)
6746     (SaveSessionTest.testSingleLayer)
6747     (SaveSessionTest.testLayerProjection)
6748     (SaveSessionTest.testRasterLayer)
6749     (SaveSessionTest.testClassifiedLayer)
6750     (SaveSessionTest.test_dbf_table)
6751     (SaveSessionTest.test_joined_table): Update for new DTD
6752     (SaveSessionTest.test_joined_table): Add test for new join type
6753     attribute
6754    
6755 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6756    
6757     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6758     function for table_to_dbf
6759     (table_to_dbf): Deal with names longer than the 10 character limit
6760    
6761     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6762     doc-string
6763     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6764     long column names
6765    
6766 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6767    
6768 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6769    
6770     2003-07-03 Bernhard Herzog <[email protected]>
6771    
6772 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6773     for the Thuban manual and README with some basic information about
6774     the manual
6775    
6776     2003-07-03 Bernhard Herzog <[email protected]>
6777    
6778 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6779     Update doc-string
6780     (TransientJoinedTable.create): Do not modify the column objects of
6781     the input tables in place and copy all columns of the input tables
6782     into the joined table after all.
6783    
6784     * test/test_transientdb.py
6785     (TestTransientTable.test_transient_joined_table_same_column_name):
6786     Update to reflect the new behavior
6787     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6788     Update to reflect the new behavior
6789     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6790     New test case for a bug which modified the column objects in place
6791    
6792 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6793 jonathan 1349
6794 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6795     generate_uniform_distribution, generate_quantiles,
6796 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6797     one, otherwise we could divide by zero.
6798    
6799     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6800     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6801     check the end classification groups against the
6802     proper property values.
6803     (ClassGenTest.doBoundsTest): New. Checks the first and
6804     last classification groups to make sure their properties
6805     are the correct upper and lower bounds for a color ramp.
6806    
6807     2003-07-02 Jonathan Coles <[email protected]>
6808    
6809     * Thuban/Model/classgen.py (generate_singletons,
6810     generate_uniform_distribution, generate_quantiles,
6811 jonathan 1360 GenQuantiles0): The denominator was one to high when
6812     calculating the index for the ramp causing the index
6813     to never to reach one.
6814    
6815     2003-07-02 Jonathan Coles <[email protected]>
6816    
6817 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6818     ClassGroupRange.SetRange() so that the min/max values are
6819     passed as a tuple. This makes a better calling scheme for
6820     when a Range object is passed instead.
6821    
6822     * Thuban/Model/classgen.py: Fixed parameters to
6823     ClassGroupRange constructor.
6824    
6825     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6826     Consolidate the min/max parameters into a single _range which
6827     can either be a tuple or a Range object.
6828     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6829     into a single _range which can either be a tuple or a Range object.
6830    
6831     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6832     call to ClassGroupRange constructor to use a tuple.
6833    
6834     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6835     the classification instance variable to the new class
6836     before calling _set_layer otherwise subscribers to a
6837     LAYER_CHANGED event will not see any difference.
6838    
6839     * test/test_classification.py: Fix tests of ClassGroupRange
6840     so that they use the new signature.
6841    
6842     * test/test_load.py: Fix use of ClassGroupRange so that it
6843     uses the new signature.
6844    
6845     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6846     uses the new signature.
6847    
6848     * test/test_save.py: Fix use of ClassGroupRange so that it
6849     uses the new signature.
6850    
6851    
6852     2003-07-01 Jonathan Coles <[email protected]>
6853    
6854 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6855     Import used objects/class from color.
6856     (generate_singletons): We don't
6857     need the numGroups parameter anymore because we are using
6858     the new ramps with GetProperties().
6859     (generate_uniform_distribution): Use new ramp method
6860     GetProperties().
6861     (generate_quantiles, GenQuantiles0): Use new ramp method
6862     GetProperties().
6863     (CustomRamp.SetNumGroups): Removed. The ramps now map
6864     a value from 0 to 1 to class properties so the number
6865     of groups is not needed ahead of time.
6866     (CustomRamp.next): Removed. CustomRamp does not support
6867     interation anymore.
6868     (CustomRamp.GetProperties): Returns a ClassGroupProperties
6869     object based on the index value from 0 to 1 that is
6870     passed to it.
6871     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6872     Made into instances of Monochromatic class instread of
6873     deriving from it.
6874     (HotToCold.SetNumGroups): Removed. See CustomRamp.
6875     (HotToCold.next): Removed. See CustomRamp.
6876    
6877     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6878     (Classification.SetField, Classification.SetFieldType):
6879     Replaced with SetFieldInfo.
6880     (Classification.SetFieldInfo): New. Does a better job of
6881     what SetField and SetFieldType used to do by combining
6882     their function since they should really always be done
6883     at the same time.
6884     (Classification.SetLayer): Renamed to _set_layer.
6885     (Classification._set_layer): Should only be called from
6886     Layer's SetClassification. This does not cause a recursive
6887     call as SetLayer did because we know that Layer knows about
6888     the classification.
6889    
6890     * Thuban/Model/color.py: Fixes RTbug #1971.
6891     (_Transparent): Renamed from Transparent so it doesn't
6892     conflict with the module variable.
6893     (Transparent, Black): Renamed from Color.Transparent,
6894     Color.Black so they are not class variables.
6895    
6896     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6897     (Layer.Destroy): We don't need to call SetClassification
6898     anymore to clear out the back reference in the classifcation
6899     to the layer. It's better to set it to None using _set_layer,
6900     and we won't be creating another clas object too.
6901     (Layer.SetClassification): Classification._set_layer is not
6902     recursive so remove all the locking variables. Also clean
6903     up the code so that it remains unchanged if something fails.
6904    
6905     * Thuban/Model/load.py: Fixes RTbug #1971.
6906     (SessionLoader.start_classification): Call
6907     Classification.SetFieldInfo().
6908    
6909     * Thuban/Model/save.py: Removed import of Color which wasn't
6910     being used.
6911    
6912     * Thuban/UI/classgen.py: Fixes RTbug #1972.
6913     (ClassGenDialog.__init__): Color ramps are now instances
6914     already so we don't need to create any new objects.
6915     (ClassGenDialog.OnOK): Check for numGroups is no longer
6916     necessary because we never use it.
6917    
6918     * Thuban/UI/classifier.py: Fixes RTbug #1971.
6919     (Classifier.__BuildClassification, Classifier.__SetGridTable):
6920     Call Classification.SetFieldInfo() instead of SetFieldType.
6921    
6922     * Thuban/UI/renderer.py: Fixes RTbug #1971.
6923    
6924     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6925     (MapCanvas.__init__): Subscribe to the idle time event. Set
6926     background color to white.
6927     (MapCanvas.OnPaint): Set a flag indicating that we should
6928     render the map during idle time. If we already have a bitmap
6929     just draw it now.
6930     (MapCanvas.OnIdle): New. Render the map only during idle time.
6931     This also fixes a problem with the busy cursor under gtk.
6932    
6933     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6934     Fix calls to generate_singletons because the signature changed.
6935    
6936     * test/test_classification.py: Fix color references and
6937     change calls to Classification.[SetField|SetFieldType] to
6938     SetFieldInfo.
6939    
6940     * test/test_load.py: Fix color references.
6941    
6942     * test/test_load_0_2.py: Fix color references.
6943    
6944     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6945     Change calls to Classification.[SetField|SetFieldType] to
6946     SetFieldInfo.
6947    
6948 frank 1334 2003-07-01 Frank Koormann <[email protected]>
6949    
6950     MERGE from the greater-ms3 branch.
6951    
6952     * test/test_transientdb.py
6953     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6954     New. Test join of two tables with partly equal column names.
6955    
6956     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6957     If duplicates in left and right tables column names are found,
6958     append '_' (underscores) to the name until it is unique.
6959     Create always new internal names for the resulting table and reference
6960     columns in the join statement with <table>.<column>
6961    
6962 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
6963    
6964     * test/test_transientdb.py
6965     (TestTransientTable.test_transient_joined_table_same_column_name):
6966     New. Test whether joining on columns with the same names in both
6967     tables works.
6968 frank 1334
6969 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6970     sure to use the right internal names even when joining on field
6971     with the same names in both tables. Also, detect duplicate names
6972     in the joined table correctly.
6973    
6974 frank 1325 2003-07-01 Frank Koormann <[email protected]>
6975    
6976     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6977     Reverse List of layers to render in same order as in desktop legend.
6978    
6979 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
6980    
6981 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
6982     and splits it into a tuple of at most three integers.
6983     Used make_tuple() to make tuple versions of the version
6984     numbers.
6985    
6986     * Thuban/UI/about.py: Add Thuban email addresses.
6987    
6988     2003-06-30 Jonathan Coles <[email protected]>
6989    
6990 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
6991     were too high.
6992    
6993     2003-06-30 Jonathan Coles <[email protected]>
6994    
6995 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
6996    
6997     * MANIFEST.in: Added Projections so that default.proj is
6998     included.
6999    
7000 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7001    
7002     New About box with lots more information including library
7003     versions and credits. More/better version checking before
7004     Thuban starts.
7005    
7006     * Thuban/UI/about.py: New. New About box that displays
7007     library version information and credits.
7008    
7009     * Thuban/version.py: Added new 'versions' dictionary which
7010     contains the verions of various libraries which are checked
7011     when the module loads.
7012     (verify_versions): Check all version numbers and returns
7013     a list of errors.
7014    
7015     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7016     Reset the status of the buttons as the situation warrants,
7017     but in a better more reliable way by not relying on the
7018     current status to determine what needs to change.
7019    
7020     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7021     (verify_versions): Remove most of the code since it is
7022     now in Thuban.version.verify_versions.o
7023    
7024     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7025     About box in Thuban.UI.about.
7026    
7027     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7028     Returns the version of gdal library being used as a string.
7029    
7030     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7031     Removed.
7032     (get_proj_version): Return the version of PROJ that the file
7033     was compiled with.
7034     (get_gtk_version): Return th version of GTK that the file
7035     was compiled with.
7036    
7037 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7038    
7039     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7040     of the SelectPropertiesDialog should be self so the window
7041     appears on top.
7042     (ClassGroupPropertiesCtrl.DoEdit): The parent
7043     of the SelectPropertiesDialog should be self so the window
7044     appears on top.
7045    
7046     * Thuban/UI/resource.py: Cleaned up how we determine file
7047     extensions.
7048     (GetImageResource): Return an wxImage from our Resources.
7049    
7050 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7051    
7052     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7053     Check that a layer has a classification before trying
7054     to get it. Raster layers don't have classifications.
7055    
7056 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7057 jonathan 1297
7058     * setup.py: Add Resources/XML to resource list.
7059    
7060     2003-06-23 Jonathan Coles <[email protected]>
7061 jonathan 1286
7062 jonathan 1297 * setup.cfg: Fix copyright dates
7063    
7064     2003-06-23 Jonathan Coles <[email protected]>
7065    
7066 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7067    
7068     * setup.py: Don't include Locale resources yet as we don't
7069     have any and it causes problems building the distribution
7070     for Windows. Update version to 0.8.0.
7071    
7072     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7073    
7074     * Thuban/UI/mainwindow.py: Add blank line at the end because
7075     file was not being read correctly building the Windows
7076     distribution.
7077    
7078     2003-06-23 Jonathan Coles <[email protected]>
7079    
7080 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7081    
7082     * Thuban/version.py: Temporarily update longversion for
7083     the 0.8 release so that it doesn't have the cvs revision.
7084    
7085     2003-06-23 Jonathan Coles <[email protected]>
7086    
7087 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7088     to make sure that we don't create reentrant possibilities with
7089     wxYield.
7090    
7091     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7092     directly to avoid the wxSafeYield() call which generates an
7093     OnPaint event causing infinite recursion. Don't try to catch
7094     exception anymore. This was for before there were limits on map
7095     scaling.
7096    
7097 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7098    
7099     Bug fix for RT #1961:
7100    
7101     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7102     Register DerivedShapestores with the session
7103    
7104     * Thuban/Model/session.py (Session.Tables): Make sure each table
7105     is only listed once.
7106    
7107     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7108     Update file contents to match the one written out.
7109    
7110 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7111    
7112     * test/xmlsupport.py (SaxEventLister.startElementNS)
7113     (SaxEventLister.endElementNS): Do not include the qname. Python
7114     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7115     is (presumably incorrectly) None, whereas it's a string with the
7116     element name in the later versions.
7117    
7118     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7119     (TestEventList.test_even_list_namespace): Update tests to reflect
7120     the new behaviour
7121     (TestEventList.test_even_list_id_normalization): Fix doc-string
7122    
7123 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7124    
7125 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7126     by deriving classes to determine if that layer supports shapes.
7127     (Layer): Override HasShapes and return true.
7128    
7129     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7130     instead of a direct call to wx[Begin|End]CusyCursor().
7131     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7132     table data.
7133    
7134     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7135     New. Wrappers around the wxWindows functions that allow us to
7136     make additional calls such as wxYield which gives the native
7137     system a chance to update the cursor correctly.
7138    
7139     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7140     instead of a direct call to wx[Begin|End]CusyCursor().
7141    
7142     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7143     instead of a direct call to wx[Begin|End]CusyCursor().
7144     (MapCanvas.find_shape_at): Check if the current search layer
7145     support shapes, otherwise go on to the next layer.
7146    
7147     * test/test_layer.py: Add tests in each type of layer for
7148     HasClassification() and HasShapes()
7149    
7150     2003-06-20 Jonathan Coles <[email protected]>
7151    
7152 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7153     turning on the busy cursor to allow the system to change the
7154     cursor before we begin painting. This fixes a problem that
7155     was occuring only under GTK. Fixes RTbug #1840.
7156    
7157 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7158    
7159     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7160     version.
7161    
7162     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7163     sort of the data sources so they can be written with sources that
7164     data sources that depend on other data sources come after the
7165     sources they depend on.
7166     (SessionSaver.__init__): Add idmap instance variable to map from
7167     objects to the ids used in the file.
7168     (SessionSaver.get_id, SessionSaver.define_id)
7169     (SessionSaver.has_id): New. Methods to manage the idmap
7170     (SessionSaver.write): Use thuban-0.8.dtd
7171     (SessionSaver.write_session): Add a namespace on the session and
7172     write out the data sources before the maps.
7173     (SessionSaver.write_data_containers): New. Write the data
7174     containers.
7175     (SessionSaver.write_layer): Layer elements now refer to a
7176     shapestore and don't contain filenames anymore.
7177    
7178     * Thuban/Model/load.py (LoadError): Exception class to raise when
7179     errors in the files are discovered
7180     (SessionLoader.__init__): Define dispatchers for elements with a
7181     thuban-0.8 namespace too.
7182     (SessionLoader.check_attrs): New helper method to check and
7183     convert attributes
7184     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7185     (SessionLoader.start_fileshapesource)
7186     (SessionLoader.start_derivedshapesource)
7187     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7188     Handlers for the new elements in the new fileformat
7189     (SessionLoader.start_layer): Handle the shapestore attribute in
7190     addition to filename.
7191     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7192     They were never used in the old formats and aren't needed for the
7193     new.
7194    
7195     * Thuban/Model/session.py (Session.DataContainers): New method to
7196     return all "data containers", i.e. shapestores and tables
7197    
7198     * test/xmlsupport.py (SaxEventLister.__init__)
7199     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7200     normalize IDs.
7201    
7202     * test/test_xmlsupport.py
7203     (TestEventList.test_even_list_id_normalization): New test case for
7204     id normalization
7205    
7206     * test/test_load.py (LoadSessionTest.check_format): Use ID
7207     normalization
7208     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7209     class atrributes used for ID normalization
7210     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7211     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7212     file format
7213     (TestJoinedTable): New test for loading sessions with joined
7214     tables.
7215     (TestLoadError): New. Test whether missing required attributes
7216     cause a LoadError.
7217    
7218     * test/test_save.py (SaveSessionTest.thubanids)
7219     (SaveSessionTest.thubanidrefs): New class attributes for ID
7220     normalization in .thuban files.
7221     (SaveSessionTest.compare_xml): Use id-normalization.
7222     (SaveSessionTest.testEmptySession)
7223     (SaveSessionTest.testLayerProjection)
7224     (SaveSessionTest.testRasterLayer)
7225     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7226     (SaveSessionTest.testLayerProjection): The filename used was the
7227     same as for testSingleLayer. Use a different one.
7228     (SaveSessionTest.test_dbf_table)
7229     (SaveSessionTest.test_joined_table): New test cases for saving the
7230     new data sources structures.
7231     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7232     data stores for writing.
7233    
7234     * test/runtests.py: Add CVS keywords
7235    
7236 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7237    
7238 jonathan 1267 * test/test_session.py
7239     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7240     Use the cultural_landmark-point.dbf file for the store so that
7241     the table rows and shape count match.
7242    
7243     2003-06-20 Jonathan Coles <[email protected]>
7244    
7245 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7246     an exception if the number of shapes is different from the
7247     number of rows in the table. Address RTbug #1933.
7248    
7249     * test/test_layer.py (TestLayer.test_derived_store): Add
7250     a test for the new exception in DerivedShapeStore.__init__.
7251    
7252     * test/support.py (FloatTestCase): Removed since there is
7253     already FloatComparisonMixin. Fixes RTbug #1954.
7254     (FloatComparisonMixin.assertFloatEqual): Include test for
7255     infinity that was part of FloatTestCase.
7256    
7257     * test/test_range.py (RangeTest): Inherit from
7258     support.FloatComparisonMixin now that we don't have
7259     support.FloatTestCase.
7260    
7261 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7262    
7263 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7264     the implementation in xmlsupport instead.
7265     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7266    
7267     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7268     of test_save
7269    
7270     2003-06-20 Bernhard Herzog <[email protected]>
7271    
7272 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7273     method to make sure the test files we load might have been written
7274     by the current thuban version.
7275     (ClassificationTest.TestLayers, TestSingleLayer.test)
7276     (TestLayerVisibility.test, TestClassification.test)
7277     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7278     Add check_format() calls and fix the thuban data to match the data
7279     that would be written by saving the session loaded from it.
7280    
7281     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7282     the same class and function in test_save.
7283    
7284     * test/test_xmlsupport.py (TestEventList): New. test cases for
7285     sax_eventlist
7286    
7287     2003-06-20 Bernhard Herzog <[email protected]>
7288    
7289 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7290     Thuban are covered by this DTD
7291     (map): Fix content model for layers and raster layers. There can
7292     be any number or layers and raster layers in any order.
7293    
7294 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7295    
7296 jonathan 1265 This is mainly about fixing RTbug #1949.
7297    
7298 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7299     import statement since python 2.2 is the earliest supported
7300     version.
7301    
7302     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7303     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7304     depending on the units this projection *forwards* into.
7305    
7306     * Thuban/Model/save.py (SessionSaver.write_classification):
7307     Remove unnecessary use of lambdas and nested functions.
7308    
7309     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7310     adjustment here if the map projection uses degrees.
7311    
7312     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7313     scale adjust code since it is now done before calling
7314     this method. Don't do anything if the map projection
7315     is None.
7316    
7317 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7318    
7319 bh 1248 Move version specific load tests to their own file.
7320    
7321     * test/test_load.py: Expand the doc-string to explain a bit how to
7322     handle file format changes.
7323     (TestClassification.test): Update the docstring as this test is
7324     not about Thuban 0.2 anymore.
7325    
7326     * test/test_load_0_2.py: New file with the load tests for thuban
7327     files created with Thuban 0.2 and earlier.
7328    
7329     2003-06-19 Bernhard Herzog <[email protected]>
7330    
7331 bh 1246 Add XML validation to some of the tests. Validation will only be
7332     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7333     To make the DTD available to the test cases it's moved into
7334     Resources/XML
7335    
7336     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7337     for versions up to and including 0.2. Two slight changes: added an
7338     encoding specification and fixed the comment which refered to
7339     GRASS, not Thuban
7340    
7341     * test/xmlsupport.py: New support module for tests involving XML.
7342     Currently there's a mix-in class for XML validation.
7343    
7344     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7345    
7346     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7347     so that we can validate the
7348     (SaveSessionTest.testEmptySession)
7349     (SaveSessionTest.testSingleLayer)
7350     (SaveSessionTest.testSingleLayer)
7351     (SaveSessionTest.testLayerProjection)
7352     (SaveSessionTest.testRasterLayer)
7353     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7354    
7355     * test/runtests.py (main): Call print_additional_summary instead
7356     of print_garbage_information
7357    
7358     * test/support.py (resource_dir): New function to return the
7359     "Resource" subdirectory
7360     (print_additional_summary): New function to combine several
7361     summary functions
7362     (run_tests): Use print_additional_summary instead of calling
7363     print_garbage_information directly
7364    
7365     2003-06-19 Bernhard Herzog <[email protected]>
7366    
7367 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7368     the classification element.
7369     (projection): Add the "name" attribute
7370    
7371 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7372    
7373     MERGE from the greater-ms3 branch.
7374    
7375     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7376     scale if projection is latlong to get better estimate.
7377    
7378     Fix problem of hidden properties dialog under windows after double
7379     click on layer tree:
7380     The tree control always gets an Expanded / Collapsed event after
7381 joey 2162 the ItemActivated on double click, which raises the main window again.
7382     We add a second ItemActivated event to the queue, which simply
7383 frank 1242 raises the already displayed window.
7384    
7385     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7386     raiseProperties initialized to prevent endless loops
7387     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7388     simply raise the properties or open the dialog and issue a second
7389     event.
7390    
7391 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7392    
7393 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7394    
7395     2003-06-18 Jonathan Coles <[email protected]>
7396    
7397 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7398     legend was being opened after the mainwindow was created
7399     and not during its creation. This meant the map was drawn
7400     initially and then had to be redrawn when the legend
7401     caused the display to change. Now the legend is opened
7402     in the mainwindow constructor which resolves this issue.
7403    
7404     Also, although we were checking for the existence of
7405     gdal and gdalwarp modules, the gdalwarp extension was
7406     still being compiled (which may fail if the system doesn't
7407     have gdal installed). the build_ext command to setup.py
7408     now accepts the flags --with-gdal and --without-gdal.
7409     If --without-gdal is specified setup.py will try to
7410     use the gdal parameters specified by gdal-config. Under
7411     windows, those parameters have to be set in setup.py
7412     as with proj4 an wxWindows.
7413    
7414     * setup.py: Use a list instead of seperate variables for
7415     extension parameters so we can create a generic function
7416     that runs an appropriate *-config script.
7417     (run_cs_script): Renamed from run_wx_script and modified
7418     to accept a second argument which is a list of lists to
7419     be filled in by the values returned from running the command.
7420     (thuban_build_ext): New. Extends the build_ext command and
7421     provides the options --with-gdal/--without-gdal which then
7422     optionally includes the gdalwarp extension.
7423    
7424     * Thuban/Model/resource.py: First check if we can import
7425     the gdalwarp Thuban extension before checking for gdal.
7426     Also added some comments.
7427    
7428     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7429     the map is None which may be the case if none has been loaded
7430     yet.
7431    
7432     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7433    
7434     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7435    
7436     * Thuban/UI/renderer.py: Check for gdal support before importing
7437     gdalwarp.
7438     (MapRenderer.render_map): Only try to optimize if we have gdal
7439     support otherwise nothing will get drawn.
7440    
7441 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7442     during startup before a map has been created. Check if map is None
7443     before using it and do nothing if it is.
7444    
7445 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7446    
7447     Fix the problem with raster layers under Windows that caused
7448     Thuban to crash. The view should respond to layer projection
7449     changed events to update the display. Changes to a projection
7450     should not cause the map to be set to full extent.
7451    
7452     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7453     current_map_proj to remember the current map projection so that
7454     when the projection changes we know what the previous projection
7455     was.
7456     (MapCanvas.SetMap): Unsubscribe and subscribe to
7457     LAYER_PROJECTION_CHANGED events.
7458     (MapCanvas.projection_changed): Split into two methods that respond
7459     to map and layer projection changes.
7460     (MapCanvas.map_projection_changed): New. Takes the current view and
7461     projects it using the new projection. This does not cause the
7462     map to be redrawn at full extent.
7463     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7464     will draw each layer in its new projection.
7465    
7466     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7467     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7468     under Windows.
7469    
7470     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7471     to twice sizeof(void*) because there are two digits for each
7472     hex byte.
7473    
7474 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7475    
7476     Update to the layer interface: Direct access to the table,
7477     shapetable, shapefile and filename attributes is now actively
7478     deprecated by issuing deprecation warnings for all places where
7479     this happens.
7480    
7481     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7482     to the instance variables table, shapetable, shapefile and
7483     filename via __getattr__ so that we can issue a deprecation
7484     warning.
7485     (Layer.SetShapeStore): Don't set the deprecated instance variables
7486     any more
7487     (Layer.SetShapeStore): Don't use deprecated layer instance
7488     variables
7489     (Layer.Destroy): No need to explicitly remove the instance
7490     variables any more
7491     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7492     instance variables
7493    
7494     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7495     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7496     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7497     use deprecated layer instance variables
7498    
7499     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7500     deprecated layer instance variables
7501    
7502     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7503     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7504     instance variables
7505    
7506     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7507     deprecated layer instance variables
7508    
7509     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7510     deprecated layer instance variables
7511    
7512     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7513     deprecated layer instance variables
7514    
7515     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7516     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7517     variables
7518    
7519     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7520     errors so that they're cought by the tests
7521    
7522     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7523     layer instance variables
7524    
7525 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7526    
7527     Fix a problem under Windows whereby if the user double-clicks on a
7528     layer in the legend that tree item will expand or collapse as well
7529     as open the layer properties dialog. The state of the tree item
7530     should not be affected.
7531    
7532     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7533     preventExpandCollapse and subscribe to expanding and collapsing
7534     events.
7535     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7536     collapsing events and will veto the event if it has been triggered
7537     by the user double clicking on a layer.
7538     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7539     that an expanding/collapsing event should be vetoed.
7540    
7541 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7542    
7543     * Thuban/UI/classifier.py (Classifier.OnClose)
7544     (Classifier.map_layers_removed)
7545     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7546     in OnClose and not in map_layers_removed or
7547     layer_shapestore_replaced to make sure it always happens when the
7548     dialog is closed
7549    
7550 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7551    
7552 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7553     the background of the table view appears correctly.
7554    
7555     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7556     object that can be used by derived classes to place any
7557     controls (including the grid) onto.
7558     (QueryTableFrame.__init__): Use the panel as the parent window
7559     for all the controls. Reparent the grid so that the panel is
7560     the parent. Call UpdateStatusText() to correctly initialize
7561     the status bar.
7562    
7563     2003-06-13 Jonathan Coles <[email protected]>
7564    
7565 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7566     from wxFrame (as opposed to wxDialog like the other classes)
7567     but otherwise behaves like the other classes. This is needed
7568     for the TableView which isn't really a dialog and needs to
7569     have a status bar and control buttons.
7570    
7571     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7572     instance variable to keep track of how many rows are selected.
7573     Subscribe once to the the events we are interested in.
7574     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7575     hasn't been turned off.
7576     (ThubanGrid.OnSelectCell): Only handle event if event handling
7577     hasn't been turned off.
7578     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7579     as an event listener (which changes the event handler stack)
7580     simply set an instance variable to False. This is checked in
7581     the event handlers.
7582     (ThubanGrid.GetNumberSelected): Return the number of currently
7583     selected rows.
7584     (TableFrame): Inherit from ThubanFrame so we can have a
7585     status bar and control buttons.
7586     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7587     Explicitly set which items are selected in the operator choice and
7588     action choice so there is always a valid selection. Fixes RTbug #1941.
7589     Subscribe to grid cell selection events so we can update the
7590     status bar.
7591     (QueryTableFrame.UpdateStatusText): Update the status bar with
7592     how many rows are in the grid, how many columns, and how many
7593     rows are selected.
7594     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7595     Call UpdateStatusText when cells are (de)selected.
7596     (QueryTableFrame.OnQuery): Use the string value in the value
7597     combo if either the selected item index is 0 or if the string
7598     cannot be found in the predefined list (this happens if the
7599     user changes the text). Fixes RTbug #1940.
7600     Only turn off the grid event listeners if there a query comes
7601     back with a none empty list of ids. in the case that the list
7602     is empty this causes a grid.ClearSelection() call to actually
7603     clear the grid selection which causes the selected items in
7604     the map to be deselected. Fixes RTbug #1939.
7605    
7606     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7607     Fixes RTbug #1851.
7608    
7609 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7610    
7611     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7612     self.selected_shape with the current selection to make sure the
7613     contents of the dialog are up to date when it's shown for the
7614     first time.
7615     The dialog used to work without this by luck. The recent fix to
7616     the connector module 'broke' a 'feature' the identify view was
7617     relying on, i.e that subscribing to a message in response to
7618     receiving a message of that type would mean that the new
7619     subscriber would also be called for the same message.
7620    
7621 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7622 jonathan 1175
7623 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7624     the image is rendered. Fixes RTbug #1937.
7625    
7626     2003-06-12 Jonathan Coles <[email protected]>
7627    
7628 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7629 jonathan 1193 user directory if it doesn't exist on a posix system.
7630     Fixes RTbug #1815.
7631 jonathan 1191
7632     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7633     called to get_application_dir here, so that the directory
7634     will only be called if this method is invoked.
7635    
7636     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7637     the projfilepath if no projection is selected.
7638    
7639     2003-06-12 Jonathan Coles <[email protected]>
7640    
7641 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7642     the scalebar if the current map has no projection set.
7643    
7644     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7645     projfilepath label to just the basename of the projection file
7646     rather than include the entire path.
7647    
7648     * Thuban/Model/resource.py: Fix missed proj functions that
7649     needed to be renamed.
7650    
7651     2003-06-12 Jonathan Coles <[email protected]>
7652    
7653 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7654     tested if the variable was an instance of Color.
7655    
7656     * Thuban/Model/color.py (Color): Remove commented code that isn't
7657     used.
7658     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7659     Fixes RTbug #1835.
7660     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7661     Needed now that the class doesn't inherit from Color.
7662    
7663     2003-06-12 Jonathan Coles <[email protected]>
7664    
7665 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7666     check unicode strings.
7667    
7668     * test/test_layer.py: Check for existence of gdal.
7669    
7670     2003-06-12 Jonathan Coles <[email protected]>
7671 jonathan 1172
7672     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7673     that was in load.py
7674 jonathan 1169
7675 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7676     that was in save.py
7677    
7678     2003-06-12 Jonathan Coles <[email protected]>
7679    
7680 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7681     case where gdal is not on the system. The XMLReader and XMLWriter
7682     classes were moved into there own files to resolve some circular
7683     import references and because they shouldn't really be in the
7684     file that is dediciated to reading/writing session files since
7685     they are also used elsewhere.
7686    
7687     * Thuban/Model/classgen.py: Renamed functions to follow the
7688     function_names_with_underscores style. Fixes RTbug #1903.
7689     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7690    
7691     * Thuban/Model/layer.py: Import gdal only if it available.
7692     (RasterLayer): Handle the case where the gdal library is unavailable.
7693     Addresses RTbug #1877.
7694    
7695     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7696     xmlreader.py.
7697    
7698 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7699    
7700     This is largely a collection of bug fixes. We also handle the
7701     case where gdal is not on the system. The XMLReader and XMLWriter
7702     classes were moved into there own files to resolve some circular
7703     import references and because they shouldn't really be in the
7704     file that is dediciated to reading/writing session files since
7705     they are also used elsewhere.
7706    
7707     * Thuban/Model/classgen.py: Renamed functions to follow the
7708     function_names_with_underscores style. Fixes RTbug #1903.
7709     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7710    
7711     * Thuban/Model/layer.py: Import gdal only if it available.
7712     (RasterLayer): Handle the case where the gdal library is unavailable.
7713     Addresses RTbug #1877.
7714    
7715     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7716     xmlreader.py.
7717    
7718 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7719     file xmlwriter.py.
7720    
7721     * Thuban/Model/resource.py: Renamed functions to following the
7722     function_names_with_underscores style.
7723     (has_gdal_support): New function that returns true if the gdal
7724     library is available. Addresses RTbug #1877.
7725    
7726     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7727     Display a message box if the gdal library is not available, but
7728     only if there are any layers that would use it. Addresses RTbug #1877.
7729    
7730     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7731     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7732     when using integers versus floats.
7733    
7734     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7735     determine if the "Add Image Layer" menu option should be
7736     greyed out or not. Addresses RTbug #1877.
7737    
7738     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7739    
7740     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7741     optimize if a raster layer is visible. Fixes RTbug #1931.
7742     Only draw the raster layer if the gdal library is available.
7743     Addresses RTbug #1877.
7744    
7745     * test/test_classgen.py: Add tests for generate_singletons,
7746     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7747     (test_calculate_quantiles): Fix some tests to catch the new
7748     ValueError that is raised.
7749    
7750     * test/test_proj.py: Use renamed projection resource functions.
7751    
7752     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7753     test for saving classified layers. Fixes RTbug #1902.
7754     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7755    
7756 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7757    
7758     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7759    
7760     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7761    
7762     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7763     multiplechoicedialog.py rather than from the wxPython library.
7764    
7765 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7766    
7767 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7768     update.
7769    
7770     2003-06-11 Frank Koormann <[email protected]>
7771    
7772 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7773     determine the absolute .thuban/thuban directory under
7774     "posix" (os.expanduser) and "nt" (read AppData registry key).
7775    
7776     * Thuban/Model/resource.py: Use get_application_dir
7777    
7778     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7779     Use get_application_dir.
7780    
7781 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7782    
7783 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7784     the messages MAP_LAYERS_REMOVED messages
7785     (LayerTableFrame.OnClose): Unsubscribe from it.
7786     (LayerTableFrame.map_layers_removed): New. Receiver for
7787     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7788     dialog is showing is removed.
7789    
7790     2003-06-10 Bernhard Herzog <[email protected]>
7791    
7792 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7793     of the receivers list so that unsubscribing in a receiver doesn't
7794     modify it while iterating over it.
7795    
7796     * test/test_connector.py
7797     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7798     unsubscribing in a receiver works correctly. See docstring for
7799     details
7800    
7801     2003-06-10 Bernhard Herzog <[email protected]>
7802    
7803 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7804     message.
7805    
7806     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7807     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7808     LAYER_CHANGED will still be sent if the classification changes.
7809    
7810     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7811     parameter so we can subscribe to some of its messages
7812     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7813     and the layer's LAYER_SHAPESTORE_REPLACED
7814     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7815     subscribed to in __init__
7816     (Classifier.map_layers_removed)
7817     (Classifier.layer_shapestore_replaced): receivers for the messages
7818     subscribed to in __init__. Unsubscribe and close the dialog
7819    
7820     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7821     the map to the Classifier dialog
7822    
7823     * test/test_layer.py (SetShapeStoreTests): Derive from
7824     SubscriberMixin as well so we can test messages
7825     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7826     messages
7827     (SetShapeStoreTests.tearDown): Clear the messages again
7828     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7829     for the modified flag too
7830     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7831     to check whether SetShapeStore sets the modified flag
7832     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7833     (SetShapeStoreTests.test_set_shape_store_same_field)
7834     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7835     Add tests for the messages. This checks both the new
7836     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7837    
7838 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7839    
7840     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7841     the menu items.
7842    
7843 frank 1134 2003-06-05 Frank Koormann <[email protected]>
7844    
7845 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7846     Layout reimplemented without panel. Make life easier to fit the list
7847     in the dialog.
7848    
7849     2003-06-05 Frank Koormann <[email protected]>
7850    
7851 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7852     once on initialisation (Former implementation resulted in multiple
7853     entries for each projection).
7854     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7855     if set, select the projection found under the specified name. This
7856     overwrites any other selection estimate.
7857     Removed projchoice filling from this method.
7858     (ProjFrame._OnSave, ProjFrame._OnAddToList):
7859     Updated call of ProjFrame.__FillAvailList
7860     (LCCPanel._DoLayout): Moved parameter controls in more common order.
7861    
7862     * Resources/Projections/defaults.proj: Extended defaults representing
7863     various common European projections.
7864    
7865     2003-06-05 Frank Koormann <[email protected]>
7866    
7867 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7868     Use ListCtrl instead of GridCtrl
7869    
7870     * Thuban/Model/resource.py:
7871     Guess location of .thuban directory from tempdir parent directory.
7872    
7873     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7874     Guess location of .thuban directory from tempdir parent directory.
7875    
7876 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
7877    
7878     Do not cache the values returned by the tree widget's
7879     GetFirstChild and GetNextChild methods because it led to lots of
7880     segfaults. The new way requires more brute force but is more
7881     reliable.
7882    
7883     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7884     variable layer2id
7885     (LegendTree.find_layer): New method to do with brute force what
7886     layer2id tried to accomplish
7887     (LegendTree._OnMsgLayerChanged)
7888     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7889     Use find_layer instead of layer2id
7890     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7891     update layer2id anymore
7892     (LegendTree._OnMsgMapLayersRemoved)
7893     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7894    
7895 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
7896    
7897     * Thuban/Model/classgen.py (GenQuantiles0): New function.
7898    
7899 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
7900    
7901 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7902     New commands.
7903     (main_menu): Add the new commands.
7904     (MainWindow.TableRename): New. Implementation of the table_rename
7905     command.
7906     (MainWindow.RenameLayer): New. Implementation of the layer_rename
7907     command.
7908    
7909     * Thuban/Model/session.py (Session.AddTable): call self.changed to
7910     set the modified flag
7911    
7912     * test/test_session.py (TestSessionSimple.test_add_table): Test
7913     whether the modified flag is set properly
7914    
7915     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7916     instead of issue so that the modified flags get updated.
7917    
7918     * test/test_base.py (SomeTitledObject): Derive from Modifiable
7919     instead of Publisher to reflect reality better and to accomodate
7920     the fact that SetTitle now calls changed instead of issue
7921    
7922     2003-06-02 Bernhard Herzog <[email protected]>
7923    
7924     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7925     acquisition has to happen before the try in a try-finally.
7926    
7927     2003-06-02 Bernhard Herzog <[email protected]>
7928    
7929 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7930     possible that a layer is removed that is not currently selected in
7931     the legend so don't check for this.
7932    
7933 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
7934    
7935 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7936     variables to None that have direct or indirect references to
7937     shapefiles or dbf files to make sure that they do go away and the
7938     files are closed.
7939    
7940     2003-05-30 Bernhard Herzog <[email protected]>
7941    
7942 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7943     availImgListIndices when a new image list is created
7944    
7945     2003-05-30 Bernhard Herzog <[email protected]>
7946    
7947 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7948     changing_selection to indicate whether the LegendTree code itself
7949     is currently changing the selection
7950     (LegendTree.normalize_selection): New method to normalize the
7951     selection by selecting the layer item even if the user clicked on
7952     the classification.
7953     (LegendTree._OnSelChanged): normalize the selection. This works
7954     around a bug in wx which doesn't keep track of the selection
7955     properly when subtrees are deleted.
7956    
7957     2003-05-30 Bernhard Herzog <[email protected]>
7958    
7959 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7960     maximum and minimum scale factors.
7961    
7962     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7963     changes in classgen.py
7964    
7965 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
7966    
7967     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7968     all the methods functions. Fixes RTBug #1903.
7969    
7970     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7971     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7972     RTBug #1907.
7973    
7974     * Thuban/UI/classgen.py: Use classgen functions that were part
7975     of the ClassGenerator class. Put try/finally blocks around
7976     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7977     RTBug #1904.
7978    
7979     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7980    
7981     * Thuban/UI/legend.py: The legend was cleared and repopulated any
7982     time something changed which caused some state to be lost such
7983     as which children were expanded or collapsed. Fixes RTBug #1901.
7984     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7985     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7986     the legend but not in the map.
7987     (LegendTree.__FillTree): Move main functionality out into smaller
7988     methods that can be used by other methods.
7989     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7990     if they are available.
7991     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7992     that we override the wxTreeCtrl method. Iterate over children
7993     and call __RemoveLayer.
7994     (LegendTree.__AddLayer): New. Add a new layer to the legend.
7995     (LegendTree.__RemoveLayer): Remove a layer from the legend.
7996     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7997     Should only be called with the id of a layer branch.
7998     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7999     Returns the root item or creates one if necessary.
8000    
8001     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8002     ProjectRasterFile with tuple arguments instead of strings.
8003    
8004     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8005     with try/finally. Fixes RTBug #1904.
8006    
8007     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8008     with try/finally. Fixes RTBug #1904.
8009     (MapCanvas.FitSelectedToWindow): If a single point is selected
8010     simply center it on the display. Fixes RTBug #1849.
8011    
8012     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8013     to be compiled as a standalone app. Now the code can only be
8014     called from Python which simplifies the parameter passing.
8015     (ProjectRasterFile): Handle Python arguments. Remove code that
8016     checks for a destination dataset. Add more clean up code.
8017    
8018     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8019     TestMapWithContents.test_lower_layer_bottom):
8020     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8021     Fixes RTBug #1907.
8022    
8023     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8024     extent to the map when the legend is toggled. Fixes RTBug #1881.
8025    
8026 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8027    
8028     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8029     unsubscribes all that is subcribed in __init__.
8030    
8031 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8032    
8033 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8034     (MainWindow.CanDuplicateLayer): New methods to implement the
8035     Layer/Duplicate command.
8036     (layer_duplicate command): New.
8037     (main_menu): Add layer_duplicate to the Layer menu.
8038    
8039     2003-05-28 Bernhard Herzog <[email protected]>
8040    
8041 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8042     renderer so that NULL/None values get displayed differently (by a
8043     gray rectangle).
8044     (TableGrid.__init__): Override the default renderers
8045    
8046     2003-05-28 Bernhard Herzog <[email protected]>
8047    
8048 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8049     classification to "None" if the type of the field has changed.
8050    
8051     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8052     test for the Layer.SetShapeStore method
8053    
8054 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8055 jan 1085
8056 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8057     does not necessarily have a filename).
8058    
8059     2003-05-28 Jan-Oliver Wagner <[email protected]>
8060    
8061 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8062     sort the selection list for the dialog.
8063    
8064 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8065    
8066     * extensions/thuban/wxproj.cpp
8067     (project_point): Removed cast to int for projected point coordinates.
8068     (shape_centroid): Return last point if all polygon vertices fall
8069     to one point.
8070    
8071 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8072    
8073 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8074     with layers that don't have shapestores, i.e. raster layers.
8075    
8076     2003-05-28 Bernhard Herzog <[email protected]>
8077    
8078 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8079     when determining the title from the filename.
8080    
8081     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8082     reflect changes in the way the title is derived from the filename
8083    
8084 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8085    
8086     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8087     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8088    
8089 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8090    
8091 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8092     delegate SelectedLayer.
8093     (MainWindow.LayerUnjoinTable): Implement.
8094     (_can_unjoin): New. Helper function for the sensitivity of the
8095     layer/unjoin command.
8096    
8097     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8098     (DerivedShapeStore.OrigShapeStore): New. Return the original
8099     shapestore. Used to figure out how to unjoin.
8100     (DerivedShapeStore.Shapefile): Fix a typo.
8101    
8102     2003-05-27 Bernhard Herzog <[email protected]>
8103    
8104 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8105     well
8106     (JoinDialog.__init__): Use the layer parameter and only build the
8107     left choice when a layer is given
8108     (JoinDialog.OnJoin): Handle layer joins as well
8109     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8110     that the user selects the "Select..." item. The sensitivitly
8111     updating is now in update_sensitivity
8112     (JoinDialog.y): New method to refactor the sensitivity update of
8113     the join button into its own method.
8114    
8115     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8116    
8117     2003-05-27 Bernhard Herzog <[email protected]>
8118    
8119 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8120     iff there are unreferenced tables in the session
8121    
8122     2003-05-27 Bernhard Herzog <[email protected]>
8123    
8124 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8125    
8126     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8127     to return tables that are not referenced by other tables or shape
8128     stores and can be removed.
8129     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8130     removing the table
8131    
8132     * Thuban/UI/mainwindow.py: Remove unused imports
8133     (MainWindow.TableClose): Implement.
8134    
8135     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8136     messages so that the frame will be automatically closed when a new
8137     session is opened or the table is removed.
8138     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8139     __init__
8140     (TableFrame.close_on_session_replaced)
8141     (TableFrame.close_on_table_removed): New. Subscribers that close
8142     the window
8143    
8144     * test/test_session.py (TestSessionMessages.test_remove_table)
8145     (TestSessionSimple.test_remove_table): Move the test to
8146     TestSessionSimple and add test for the TABLE_REMOVED message
8147     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8148     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8149     UnreferencedTables method.
8150     (UnreferencedTablesTests): New. Class with some more sophisticated
8151     tests for UnreferencedTables.
8152    
8153 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8154    
8155 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8156     display has some unwanted side effects. Removed again.
8157    
8158     2003-05-27 Frank Koormann <[email protected]>
8159    
8160 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8161    
8162     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8163    
8164 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8165    
8166 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8167     Menu.RemoveItem().
8168 jan 1062
8169 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8170     the menu.
8171 jan 1062
8172 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8173    
8174     Nonmodal dialogs without parent (i.e. they can fall behind the main
8175     window)
8176    
8177     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8178     all dialogs in the dialogs dictionary and the canvas.
8179    
8180     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8181     parent, i.e. can fall behind other windows.
8182     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8183     dictionary before removing it.
8184    
8185     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8186    
8187     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8188     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8189     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8190    
8191 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8192    
8193 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8194     tableview dialog
8195     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8196     Also, don't use the table's titles as the dialog names. The titles
8197     aren't guaranteed to be unique.
8198     (MainWindow.TableOpen): Open a table view dialog after opening the
8199     table
8200    
8201     2003-05-27 Bernhard Herzog <[email protected]>
8202    
8203 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8204     effect can be achieved by simply closing the window showing the
8205     table.
8206     (MainWindow.TableHide): Removed.
8207     (main_menu): Removed "table_hide"
8208    
8209 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8210    
8211     Fix legend tree display problems under Win32
8212    
8213     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8214     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8215     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8216    
8217     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8218    
8219 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8220    
8221     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8222     'after' now allows to insert separators almost anywhere in the menu.
8223    
8224 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8225    
8226     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8227     "S" of selection box label to hint on hot key (Alt-S). Works under
8228     Win32 but is ignored under GTK.
8229    
8230     2003-05-26 Frank Koormann <[email protected]>
8231    
8232     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8233     Center Choices.
8234    
8235 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8236    
8237 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8238     part of the table interface and they're only used in table_to_dbf
8239     anyway.
8240    
8241     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8242     fixed precision of 12 for doubles.
8243     (TransientTableBase.Precision): Removed
8244     (AutoTransientTable.Width): Delegate to self.table.
8245    
8246     * Thuban/Model/table.py (DBFTable.Precision)
8247     (MemoryTable.Precision): Removed.
8248     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8249     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8250     column object specifies something else.
8251    
8252     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8253     test for table_to_dbf
8254    
8255     2003-05-26 Bernhard Herzog <[email protected]>
8256    
8257     * test/test_transientdb.py
8258     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8259    
8260     2003-05-26 Bernhard Herzog <[email protected]>
8261    
8262 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8263     implementation. Mark parts of the file format strings for
8264     localization.
8265    
8266     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8267     file and add the table to the tables managed by the session
8268    
8269 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8270     New. test case for OpenTableFile
8271    
8272 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8273    
8274 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8275     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8276     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8277     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8278    
8279     2003-05-26 Jan-Oliver Wagner <[email protected]>
8280    
8281 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8282     already a selection present, update the grid accordingly.
8283 jan 1033
8284     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8285     resizeable and increase its initial size.
8286    
8287 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8288    
8289     Table export functionality
8290    
8291     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8292     Return width (in characters) for a column.
8293     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8294     (table_to_dbf): Write table to dbf file.
8295     (table_to_csv): Write table to csv file.
8296    
8297     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8298     TransientTableBase.Precision): Return column width and precision.
8299    
8300     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8301     or table_to_csv depending on file selection.
8302    
8303     * test/test_dbf_table.py:
8304     Test table_to_dbf (extension of former part of test).
8305    
8306     * test/test_csv_table.py:
8307     Test table_to_csv.
8308    
8309 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8310    
8311 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8312     Use QueryTableFrame instead of TableFrame.
8313 jan 1021
8314 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8315     table window with 'Layer Table:' instead of 'Table:'.
8316    
8317     2003-05-23 Jan-Oliver Wagner <[email protected]>
8318    
8319     Give all tables a title via mix-in TitledObject.LayerShowTable
8320    
8321 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8322     only if it exists.
8323    
8324     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8325     and call its init-method with a default title. Remove Title() method.
8326    
8327     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8328     AutoTransientTable): mix-in TitledObject and call its init-method with
8329     a default title. Remove Title() method.
8330    
8331 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8332    
8333     * Thuban/Model/session.py (Session.AddShapeStore): Define
8334     AddShapeStore analogously to AddTable.
8335    
8336     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8337     New. Test for AddShapeStore
8338    
8339 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8340    
8341     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8342    
8343     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8344     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8345     The latter implements the selection GUI without dependency on a layer.
8346     LayerTableFrame now is derived from QueryTableFrame and connects
8347     to a layer.
8348    
8349     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8350     implementation that still needs work.
8351    
8352     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8353    
8354 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8355    
8356     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8357     Added "outer_join = False" as optional parameter.
8358     (TransientJoinedTable.create): If outer join is true, perform a
8359     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8360     the left table. Records not matching are filled with 0 / None.
8361    
8362     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8363     (JoinDialog.OnJoin): Consider outer join check box.
8364    
8365 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8366    
8367 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8368     somewhat safer way. Storing the traceback in a local variable can
8369     lead to memory leaks
8370    
8371     2003-05-22 Bernhard Herzog <[email protected]>
8372    
8373 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8374     the wxMessageDialog's Destroy() method.
8375    
8376 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8377    
8378     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8379     TransientTable.Title()
8380    
8381     2003-05-22 Frank Koormann <[email protected]>
8382    
8383     Join Dialog, initial version.
8384    
8385     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8386    
8387     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8388     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8389     in all occurences.
8390    
8391     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8392     Typo fixed.
8393    
8394 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8395    
8396 bh 999 Give the tables titles so that the GUI can display more meaningful
8397     names. For now the titles are fixed but depend on e.g. filenames
8398     or the titles of the joined tables.
8399    
8400     * Thuban/Model/transientdb.py (TransientTable.Title)
8401     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8402    
8403     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8404    
8405     * test/test_transientdb.py
8406     (TestTransientTable.test_auto_transient_table_title): New. Test
8407     for the Title method
8408     (TestTransientTable.test_transient_joined_table)
8409     (TestTransientTable.test_transient_table): Add test for the Title
8410     methods
8411    
8412     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8413     Test for the Title method
8414    
8415     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8416     the Title method
8417    
8418     2003-05-22 Bernhard Herzog <[email protected]>
8419    
8420 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8421     Provide a better way to destroy the layers
8422     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8423     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8424     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8425     the new way to destroy the layers.
8426     (TestLayer.test_derived_store): New. Test for using a layer with a
8427     DerivedShapeStore
8428    
8429     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8430     filename if the shape store actually has one.
8431    
8432     2003-05-22 Bernhard Herzog <[email protected]>
8433    
8434 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8435     for the filename
8436    
8437     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8438     for the FileName method
8439     (TestDBFTableWriting.test_write): Fix spelling of filename
8440    
8441 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8442    
8443     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8444     from SciParam that now really is immutable.
8445    
8446 frank 992 2003-05-22 Frank Koormann <[email protected]>
8447    
8448     Layer Top/Bottom placement added to legend.
8449    
8450     * Thuban/UI/legend.py
8451     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8452     bound to tool events.
8453     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8454     New, methods binding the event methods with the map methods.
8455    
8456     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8457     layer at top/bottom of layer stack.
8458    
8459     * Resources/Bitmaps/top_layer.xpm: New button icon.
8460    
8461     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8462    
8463 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8464    
8465     * Thuban/Model/session.py (Session.RemoveTable): New method to
8466     remove tables
8467    
8468     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8469     Test for RemoveTable
8470    
8471 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8472    
8473     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8474     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8475    
8476 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8477    
8478 bh 985 Implement a way to discover dependencies between tables and
8479     shapestores.
8480    
8481     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8482     (TransientJoinedTable.Dependencies)
8483     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8484     interface
8485     (TransientJoinedTable.__init__): Keep tack of the original table
8486     objects in addition to the corresponding transient tables.
8487    
8488     * Thuban/Model/table.py (DBFTable.Dependencies)
8489     (MemoryTable.Dependencies): New. Implement the dependencies
8490     interface
8491    
8492     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8493     ShapefileStore
8494     (ShapefileStore.__init__): Use ShapeTable instead of
8495     AutoTransientTable
8496     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8497     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8498     methods for filename and type
8499     (ShapefileStore.Dependencies): New. Implement the dependencies
8500     interface
8501     (DerivedShapeStore): New class to replace SimpleStore. The main
8502     difference to SimpleStore is that it depends not on a shapefile
8503     but another shapestore which expresses the dependencies a bit
8504     better
8505     (SimpleStore.__init__): Add deprecation warning.
8506    
8507     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8508     Test for the Dependencies method.
8509    
8510     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8511     New. Test for the Dependencies method.
8512    
8513     * test/test_transientdb.py
8514     (TestTransientTable.test_auto_transient_table_dependencies): New.
8515     Test for the Dependencies method.
8516     (TestTransientTable.test_transient_joined_table): Add test for the
8517     Dependencies method.
8518    
8519     * test/test_session.py (TestSessionSimple.setUp)
8520     (TestSessionSimple.tearDown): New. Implement a better way to
8521     destroy the sessions.
8522     (TestSessionSimple.test_initial_state)
8523     (TestSessionSimple.test_add_table): Bind session to self.session
8524     so that it's destroyed by tearDown
8525     (TestSessionSimple.test_open_shapefile): New. Test for
8526     OpenShapefile and the object it returns
8527    
8528     2003-05-22 Bernhard Herzog <[email protected]>
8529    
8530 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8531     register tables with the session.
8532     (Session.Tables): Return the tables registered with AddTable too.
8533    
8534     * test/test_session.py (TestSessionSimple.test_add_table): New.
8535     Test case for the AddTable method
8536    
8537 frank 981 2003-05-22 Frank Koormann <[email protected]>
8538    
8539     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8540     lower right corner, center labels for selections, initialize controls
8541     in reasonable order for keyboard navigation.
8542    
8543     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8544     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8545     using the wxListBox.FindString() method. Still a problem (#1886)
8546    
8547     * Thuban/UI/classifier.py
8548     (Classifier.__init__, SelectPropertiesDialog.__init__)
8549    
8550     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8551     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8552     different classification types from here to __init__.
8553     (GenUniquePanel.__init__): Set the column width of the first field
8554     in the Field ListCtrl to the full width.
8555    
8556     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8557     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8558     Grid.
8559     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8560     changes focus to the Selection when pressing "Alt-S".
8561    
8562     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8563     the text if not visible. The italic font sometimes exceeds the
8564     rendering area.
8565    
8566 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8567 jonathan 971
8568 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8569     to OnClose so that Thuban closes correctly.
8570    
8571     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8572     DockFrame.OnClose, not DockFrame._OnClose.
8573    
8574     2003-05-21 Jonathan Coles <[email protected]>
8575    
8576 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8577     references to 'inf' and use new Range __init__ to pass floats
8578     directly rather than converting them to strings first.
8579     Fixes RTBug #1876.
8580    
8581     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8582     Use new Range ___init__ to pass floats.
8583    
8584     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8585     filename is a valid image file. Throw IOError otherwise.
8586    
8587     * Thuban/Model/range.py: Brought over new Range from SciParam that
8588     is immutable and has an __init__ which can accept floats.
8589    
8590     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8591     into try block. AddLayer doesn't throw any exceptions anymore.
8592     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8593     try block.
8594    
8595     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8596     the first item in choices. Fixes RTBug #1882.
8597    
8598     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8599     has gone to 0 which is a serious problem. abort.
8600     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8601     print the error from GDAL.
8602    
8603     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8604     ToggleEventListeners to turn on listening.
8605     (TableGrid.ToggleEventListeners): New. Turns event listening on
8606     and off so as to prevent excessive messages.
8607     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8608     to suppress excessive messages when selecting many rows.
8609     Fixes RTBug #1880.
8610    
8611     * Thuban/UI/view.py: Added checks against if scale == 0. This
8612     is a serious problem that can occur when an image without
8613     geo data is loading and causes the map projection bounds to
8614     go to infinity. Right now, the solution is to simply try
8615     to recover.
8616    
8617     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8618     to set the MFILEReceiver attributes even if the data is NULL.
8619    
8620     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8621     and passed GDAL messages back up to the Python layer. Also
8622     tried to fix some memory leaks that were present in the original
8623     utility but didn't matter because the program aborted.
8624    
8625     * test/test_range.py: Copied over tests from SciParam. Removed
8626     tests against importing. Fixes RTBug #1867.
8627    
8628 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8629    
8630     * test/test_load.py: Remove unused imports and restructure the
8631     test code
8632     (LoadSessionTest): Split into one class for each test and turn
8633     LoadSessionTest itself into the base class for all such session
8634     tests.
8635     (ClassificationTest): New base class for load tests that test
8636     classifications
8637     (TestSingleLayer, TestLayerVisibility, TestClassification)
8638     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8639     for the individual tests
8640    
8641     * test/support.py (FileLoadTestCase.filename): New base class for
8642     file loading tests
8643    
8644 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8645    
8646     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8647     Mercator' to 'UTM Zone 32' as a more convenient example.
8648     Added 'Gauss Krueger Zone 6'.
8649    
8650     * Data/iceland_sample_raster.thuban: political polygon now
8651     filled transparent to have the raster image visible at once.
8652    
8653 frank 952 2003-05-21 Frank Koormann <[email protected]>
8654    
8655     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8656     OnClose() to keep in sync with extensions. Internally Thuban
8657     still uses "underscored" names.
8658    
8659 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8660    
8661     This puts back Raster layer support. These layers support projections
8662     through the GDAL library. Currently, the CVS version is being used.
8663     There are no Debian packages available although this may change soon.
8664     A GDAL driver was extended to support writing to memory rather to
8665     files.
8666    
8667     There is still some work that needs to be done, such as some error
8668     handling when loading invalid images or when there is a problem
8669     projecting the image. This putback simply checks in the majority
8670     of the work.
8671    
8672     * setup.py: Add gdalwarp library extension.
8673    
8674     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8675     Defaults to False, but can be overridden by subclasses if they
8676     support classification.
8677     (RasterLayer): New. Defines a new layer that represents an
8678     image.
8679    
8680     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8681     tag handler.
8682     (SessionLoader.start_layer): Encode the filename.
8683     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8684     New. Supports reading a rasterlayer tag.
8685    
8686     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8687    
8688     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8689     get a string in Latin1. If we get such as string convert it to
8690     unicode first, otherwise leave if alone before encoding.
8691     (SessionSaver.write_layer): Add support for writing both Layers
8692     and RasterLayers.
8693    
8694     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8695     The right argument may not be a string, it could also be a Column.
8696    
8697     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8698     Make initial window size 600x400. Fixes RTBug #1872.
8699    
8700     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8701     the dialog is constructed so that we can support layers that
8702     do not have classifications.
8703     (Classifier._OnTry): Only build a classification if the layer
8704     supports one.
8705    
8706     * Thuban/UI/legend.py: Change all checks that a layer is an
8707     instance of Layer into checks against BaseLayer.
8708     (LegendTree.__FillTreeLayer): Only add children to a branch if
8709     the layer supports classification.
8710    
8711     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8712     MainWindow.OpenSession): Don't proceed with an action if the
8713     user chooses Cancel when they are asked to save changes.
8714     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8715     user to select an image file. Create a new RasterLayer and add
8716     it to the map.
8717    
8718     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8719     for rendering RasterLayer layers.
8720     (MapRenderer.draw_raster_layer): Actually method that calls
8721     the GDALWarp python wrapper and constructs an image from the
8722     data returned.
8723    
8724     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8725     Choices symbols to match those used in the table query method.
8726     Replace deprecated method calls on table with new method names.
8727    
8728     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8729     how small the scale can get. This still needs more testing.
8730    
8731     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8732     Provides a driver to output in .bmp format.
8733    
8734     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8735     New. Provides IO routines which write to memory, rather than a file.
8736    
8737     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8738     of the gdalwarp utility provided in GDAL. Added function calls
8739     that can be accessed from python.
8740    
8741     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8742     a raster layer.
8743    
8744     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8745     layer image data.
8746    
8747     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8748    
8749     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8750     tests associated with the raster layer code.
8751    
8752     * test/test_transientdb.py
8753     (TestTransientTable.test_auto_transient_table_query): Added a test
8754     for using a Column object as the "right" parameter to a query.
8755    
8756 frank 924 2003-05-19 Frank Koormann <[email protected]>
8757    
8758 frank 927 * Thuban/version.py (get_changelog_date):
8759     Catch exceptions if ChangeLog does not exist.
8760    
8761     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8762    
8763     2003-05-19 Frank Koormann <[email protected]>
8764    
8765 frank 924 Extended version information for Thuban
8766    
8767     * Thuban/version.py: New, version information for Thuban: Last
8768     modification date and last ChangeLog entry date.
8769    
8770     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8771     information: Display Thuban, wxPython and Python version.
8772    
8773 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8774    
8775 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8776     __future__ import for nested_scopes as Thuban relies on Python 2.2
8777     now.
8778     (XMLWriter.encode): Remove the special case for a None argument.
8779     In the saver encode is always called with a string argument.
8780    
8781     2003-05-16 Bernhard Herzog <[email protected]>
8782    
8783 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8784     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8785     of the bug was that e.g. float("1.2") would fail. Thuban now
8786     requires 2.4.x.
8787    
8788 frank 917 2003-05-16 Frank Koormann <[email protected]>
8789    
8790     Printing enhancement and WMF export (under Win32)
8791    
8792     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8793     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8794     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8795     PrintRender.
8796    
8797     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8798     to fullfil information needed for PrinterRenderer.
8799     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8800     (MapCanvas.Print): Adapted to new MapPrintout.
8801     (OutputTransform): General calculations to transform from canvas
8802     coordinates to export/printing devices.
8803    
8804     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8805     new method_command to call ExportMap, with platform dependency (only
8806     __WXMSW__)
8807    
8808     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8809     of scalebar drawing area as new parameters.
8810    
8811     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8812    
8813     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8814     Update to extended scalebar.DrawScalebar header.
8815    
8816     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8817    
8818     * test/test_scalebar.py: Made test executable as standalone.
8819    
8820 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8821    
8822     * Thuban/Model/table.py (Table): Remove this compatibility alias
8823     for DBFTable.
8824    
8825     * test/test_table.py: Import DBFTable as Table because that alias
8826     doesn't exist anymore.
8827    
8828     * Thuban/UI/classgen.py: Remove some unused imports
8829    
8830 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8831    
8832     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8833     Fix docstring.
8834     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8835     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8836     values of the supplied range to determine the beginning and end
8837     bounds of the generated classes.
8838    
8839     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8840     do not have a leading 0 (.5 is now accepted as well as 0.5).
8841    
8842     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8843     call to ClassGenerator.GenUniformDistribution.
8844    
8845     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8846     layout bug with the 'Projection' label.
8847    
8848     * test/support.py (FloatTestCase): New. Needed for the Range tests.
8849    
8850     * test/test_range.py: New. Imported from SciParam.
8851    
8852 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
8853    
8854 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8855     to table.UniqueValues() with calls that retrieve all the values
8856     from the table. This will need to be replaced by a method on table
8857     which can simply return the list (perhaps more efficiently).
8858    
8859     2003-05-12 Jonathan Coles <[email protected]>
8860    
8861 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
8862     Refer to the documentation for details.
8863    
8864     * test/test_classgen.py: Modified Quantile tests to use the
8865     new return values.
8866    
8867     * Thuban/Model/classgen.py
8868     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8869     use new return values from CalculateQuantiles to produce the correct
8870     range bounds in the Classification.
8871     (ClassGenerator.CalculateQuantiles): Add more comments describing
8872     the return values and parameters. Make minor adjustments to improve
8873     the legibility of the code. Fix problem with adjusted not being set
8874     in most cases.
8875    
8876 frank 893 2003-05-12 Frank Koormann <[email protected]>
8877    
8878     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8879     and latin1. Fixes #1851 finally.
8880    
8881 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
8882    
8883 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
8884    
8885     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8886     Clean up debugging statement, add comments, fix a small bug in the
8887     returned adjusted percentiles.
8888    
8889     2003-05-09 Jonathan Coles <[email protected]>
8890    
8891 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
8892     and such ranges can now be saved and loaded from disk.
8893    
8894     Quantiles are now available in the Classification Generator.
8895    
8896     Initial support for building Queries on a table. Doesn't do anything
8897     but run some tests.
8898    
8899     * Thuban/Model/classification.py: Explicit imports.
8900     (ClassGroupRange): Use the Range class to store the underlying
8901     range information. The interface remains the same, except for
8902     GetRange(), and you can also supply a Range object as the min
8903     parameter to SetRange or __init__.
8904    
8905     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8906     string appropriately for use in Thuban. Fixes RTbug #1851.
8907     (SessionLoader.end_projection): Handle the context of the
8908     projection tag a bit better by looking at what objects are not
8909     None. There was an assumption that a projection tag for a map
8910     could occur before any layers.
8911     (SessionLoader.start_clrange): Provide backward compatibility for
8912     reading min/max values as well as the new range parameter.
8913    
8914     * Thuban/Model/map.py: Explicit imports.
8915    
8916     * Thuban/Model/resource.py: Import _.
8917     (ProjFileSaver.write): write header using projfile.dtd.
8918    
8919     * Thuban/Model/save.py: Explicit imports.
8920     (XMLWriter.encode): New. Encode the given string from a format
8921     used by Thuban into UTF-8. Fixes RTbug #1851.
8922    
8923     * Thuban/UI/classgen.py: Explicit imports.
8924     (ClassGenDialog.__init__): Clean up the code and add support
8925     for Quantiles.
8926     (ClassGenDialog.OnOK): Add support for Quantiles.
8927     (GenQuantilesPanel): New. Input panel for Quantiles.
8928     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8929     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8930    
8931     * Thuban/Model/classgen.py: New. Contains all the classes named above.
8932    
8933     * Thuban/UI/classifier.py: Explicit imports.
8934     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8935     ClassTable.SetValueAsCustom): Reworked to use new Range class.
8936    
8937     * Thuban/UI/legend.py: Explicit imports.
8938    
8939     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8940     a Table menu and associated method calls.
8941     (MainWindow.choose_color): Removed. No longer needed.
8942    
8943     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8944     should be disabled if no projection is selected in the available
8945     list.
8946    
8947     * Thuban/UI/renderer.py: Explicit imports.
8948    
8949     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8950     with correctly selecting the rows and issuing the right events.
8951     Be sure to call Skip() to allow the grid to do some of its own
8952     handling which allows the rows to actually be selected.
8953     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8954     selecting multiple shapes.
8955     (LayerTableFrame): Support for building Queries.
8956     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8957    
8958     * Thuban/UI/tree.py: Explicit imports.
8959    
8960     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8961     table view can call it.
8962    
8963     * test/test_classification.py: Explicit imports.
8964     (TestClassification.test_ClassGroupRange): Fix test for new
8965     Range class.
8966    
8967     * Doc/thuban.dtd: Add range parameter for clrange.
8968    
8969     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8970     object in ClassGroupRange, and also uesd for inputting ranges in
8971     the classifer table and elsewhere.
8972    
8973     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8974     yet.
8975    
8976 frank 872 2003-05-09 Frank Koormann <[email protected]>
8977    
8978     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8979    
8980 frank 860 2003-05-08 Frank Koormann <[email protected]>
8981    
8982 frank 870 Coding style updates
8983    
8984     * test/test_scalebar.py: Replaced tab indentation by spaces.
8985    
8986     * Thuban/UI/scalebar.py: Explicit imports.
8987    
8988     2003-05-08 Frank Koormann <[email protected]>
8989    
8990 frank 867 * Thuban/UI/scalebar.py
8991     (ScaleBar.DrawScalebar): Format string bug fixed.
8992    
8993     2003-05-08 Frank Koormann <[email protected]>
8994    
8995 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
8996    
8997     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8998     (deriveInterval):
8999     Calculate scalebar interval and unit which fits in width for scale.
9000     (roundInterval): Round float.
9001    
9002     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9003    
9004     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9005    
9006     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9007    
9008     2003-05-08 Frank Koormann <[email protected]>
9009    
9010 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9011     Initialize ScaleBar with canvas.map
9012    
9013     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9014     round intervals to display smarter lengths
9015     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9016     layer. If the maps has no projection applied grey the scalebar.
9017    
9018 frank 857 2003-05-07 Frank Koormann <[email protected]>
9019    
9020     Basic Scalebar features added.
9021    
9022     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9023    
9024     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9025     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9026     and the renderer.
9027    
9028     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9029    
9030     * Thuban/UI/messages.py: SCALE_CHANGED added.
9031    
9032 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9033    
9034 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9035     variable shapestores to hold a list of all open shapestore objects
9036     (Session.ShapeStores): New. Accessor method for the shapestores
9037     list.
9038     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9039     Internal methods to maintain the shapestores list.
9040     (Session.Tables): New. Return all tables open in the session.
9041     (Session.OpenShapefile): Insert the new ShapeStore into the
9042     shapestores list.
9043    
9044     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9045     tests for ShapeStores and Tables
9046     (TestSessionWithContent.test_shape_stores)
9047     (TestSessionWithContent.test_tables): New. Test cases for
9048     ShapeStores and Tables
9049    
9050     2003-05-07 Bernhard Herzog <[email protected]>
9051    
9052 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9053     Add comments about the optimizations used.
9054     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9055     Implement the ReadValue table interface method.
9056    
9057     * test/test_transientdb.py
9058     (TestTransientTable.run_iceland_political_tests)
9059     (TestTransientTable.test_transient_joined_table): Add tests for
9060     ReadValue
9061    
9062 frank 848 2003-05-07 Frank Koormann <[email protected]>
9063    
9064     * Resources/Bitmaps/fulllayerextent.xpm,
9065     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9066     new icons.
9067    
9068 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9069    
9070 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9071     New. Simply delegate to the transient table's version.
9072    
9073     * test/test_transientdb.py
9074     (TestTransientTable.test_auto_transient_table_query): New. Test
9075     case for AutoTransientTable's SimpleQuery
9076    
9077     2003-05-06 Bernhard Herzog <[email protected]>
9078    
9079 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9080     Implement a simple query method for the query dialog
9081     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9082     the row index or shapeid.
9083     (TransientTable.create): Insert the right value of the row index
9084     (TransientJoinedTable.create): Copy the row index of the left
9085     table to the joined result table
9086    
9087     * test/test_transientdb.py
9088     (TestTransientTable.test_transient_table_read_twice): Fix
9089     doc-string
9090     (TestTransientTable.test_transient_table_query): New. Test for the
9091     SimpleQuery method
9092    
9093     2003-05-06 Bernhard Herzog <[email protected]>
9094    
9095 bh 840 Convert all table users to use the new table interface. This only
9096     covers Thuban itself, not GREAT-ER or other applications built on
9097     Thuban yet, so the compatibility interface stays in place for the
9098     time being but it now issues DeprecationWarnings.
9099    
9100     Finally, the new Table interface has a new method, HasColumn.
9101    
9102     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9103     issue deprecation warnings when they're. The warnings refer to the
9104     caller of the method.
9105     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9106     for the deprecation warnings
9107    
9108     * test/test_table.py: Ignore the deprecation warnings for the old
9109     table in the tests in this module. The purpose of the tests is to
9110     test the old interface, after all.
9111    
9112     * test/test_transientdb.py
9113     (TestTransientTable.run_iceland_political_tests): Use the
9114     constants for the types. Add a test for HasColumn
9115     (TestTransientTable.test_transient_joined_table): Adapt to new
9116     table interface. Add a test for HasColumn
9117     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9118     table interface
9119    
9120     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9121     Adapt to new table interface
9122    
9123     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9124     new table interface
9125    
9126     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9127     (RecordTable.SetTable): Adapt to new table interface
9128    
9129     * Thuban/UI/classifier.py (Classifier.__init__)
9130     (Classifier.__init__): Adapt to new table interface
9131    
9132     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9133     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9134     to new table interface
9135    
9136     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9137     (AutoTransientTable.HasColumn): Implement the new table interface
9138     method
9139     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9140     (AutoTransientTable.UniqueValues): Adapt to new table interface
9141    
9142     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9143     Adapt to new table interface
9144    
9145     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9146     simplify opening shapefiles a bit easier.
9147     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9148     (TestLayer.test_point_layer): Use the new helper method
9149     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9150     method
9151    
9152     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9153     the new table method
9154    
9155     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9156     Test for the new table method HasColumn
9157    
9158 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9159    
9160     Addresses the "Selection Extent" wish of RTbug #1787.
9161    
9162     * Resources/Bitmaps/fulllayerextent.xpm,
9163     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9164     extent. These are just place holders for the real bitmaps.
9165    
9166     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9167     calculate the bounding box once (the first time compute_bbox() is
9168     called).
9169     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9170     the bounding box for the shapes in lat/long coordinates.
9171    
9172     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9173     option.
9174     (MainWindow.has_selected_shapes): New. Returns true if there are
9175     any selected shapes.
9176     (MainWindow.FullSelectionExtent): New. Calls
9177     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9178     (_has_selected_shapes): New. Returns true if there are any
9179     selected shapes.
9180    
9181     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9182     true if there are any selected shapes.
9183    
9184     * Thuban/UI/view.py (MapCanvas): Added delegated method
9185     HasSelectedShapes.
9186     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9187     shapes on the canvas using the map projection (if any).
9188    
9189     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9190     for Layer.ShapesBoundingBox().
9191    
9192 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9193    
9194     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9195    
9196 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9197    
9198     Addresses the "Full Layer Extent" wish of RTbug #1787.
9199    
9200     * Resources/Projections/defaults.proj: Added UK National Grid.
9201    
9202     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9203     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9204     when the user selects the menu option.
9205    
9206     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9207     scales the given layer on the canvas using the map projection.
9208    
9209 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9210    
9211     Convert the table implementations to a new table interface. All
9212     tables use a common mixin class to provide backwards compatibility
9213     until all table users have been updated.
9214    
9215     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9216     provide backwards compatibility for table classes implementing the
9217     new interface
9218     (DBFTable, MemoryTable): Implement the new table interface. Use
9219     OldTableInterfaceMixin as base for compatibility
9220     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9221     and MemoryTable resp.
9222    
9223     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9224     the new table interface.
9225    
9226     * test/test_memory_table.py: New. Test cases for the MemoryTable
9227     with the new table interface.
9228    
9229     * test/test_table.py: Document the all tests in this file as only
9230     for backwards compatibility. The equivalent tests for the new
9231     interface are in test_memory_table.py and test_dbf_table.py
9232     (MemoryTableTest.test_read): field_info should be returning tuples
9233     with four items
9234     (MemoryTableTest.test_write): Make doc-string a more precise.
9235    
9236     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9237     table interface. Derive from from OldTableInterfaceMixin for
9238     compatibility.
9239     (TransientTableBase.create): New intance variable column_map to
9240     map from names and indices to column objects
9241     (TransientTable.create): Use the new table interface of the input
9242     table
9243     (AutoTransientTable): Convert to new table interface. Derive from
9244     from OldTableInterfaceMixin for compatibility.
9245     (AutoTransientTable.write_record): Removed. It's not implemented
9246     yet and we still have to decide how to handle writing with the new
9247     table and data framework.
9248    
9249     * test/test_transientdb.py
9250     (TestTransientTable.run_iceland_political_tests)
9251     (TestTransientTable.test_transient_joined_table): Use the new
9252     table interface
9253    
9254 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9255    
9256     This is namely a collection of UI updates to improve user interactivity.
9257     Tabbing between controls now exists and you can use ESC to close dialog
9258     boxes; ENTER will active the default button.
9259    
9260     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9261     order that the controls are created so that tabbing works correctly.
9262     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9263     wxDialog can handle the default button correctly.
9264     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9265     same reasons as for OnOK.
9266     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9267     when we ask the table for the maximum/minimum values of a field
9268     which could take a very long time.
9269    
9270     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9271     order that the controls are created so that tabbing works correctly.
9272     (SelectPropertiesDialog.__init__): Rearrange the order that the
9273     controls are created so that tabbing works correctly.
9274    
9275     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9276     to derive from a wxDialog but behave like the original implementation
9277     which was derived from a wxFrame. wxDialog provides useful key
9278     handling functionality like ESC calling OnCancel and ENTER calling
9279     OnOK which is lost with wxFrame.
9280    
9281     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9282     new dialogs.
9283    
9284     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9285     order that the controls are created so that tabbing works correctly.
9286     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9287     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9288     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9289     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9290     can provide the "UK National Grid" as a default projection.
9291     (UTMPanel.__init__): Rearrange the order that the controls are
9292     created so that tabbing works correctly.
9293    
9294 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9295    
9296 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9297     (project_point): If a map projection but no layer projection is
9298     given, convert degrees to radians before applying the map
9299     projection.
9300    
9301 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9302     (TableGrid.allow_messages): New methods to make it possible to
9303     inhibit message sending.
9304     (TableGrid.issue): Only send the message if not inhibited.
9305     (LayerTableGrid.select_shape): Use the new methods to make sure
9306     that no ROW_SELECTED message is sent while we're updating the
9307     selected rows to match the selected shapes.
9308    
9309 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9310    
9311     Implementation of MemoryTable.
9312    
9313     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9314     implementation that operates on a list of tuples. All of the data
9315     are kept in the memory.
9316    
9317     * test/test_table.py (MemoryTableTest): New.
9318    
9319     * test/test_transientdb.py (SimpleTable): Removed.
9320     (TestTransientTable.test_transient_joined_table,
9321     (TestTransientTable.test_transient_table_read_twice): Replaced
9322     SimpleTable by MemoryTable.
9323    
9324 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9325    
9326 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9327     for each of the layers.
9328    
9329     * Resources/Projections/defaults.proj: Geographic projection
9330     contains unit conversion parameter.
9331    
9332     2003-04-30 Jonathan Coles <[email protected]>
9333    
9334 jonathan 793 The most important part of this putback is the projection changes.
9335     It should now be possible to specify the projection that a layer
9336     is in and then specify a different projection for the map. The
9337     projection dialog has an extra parameter for a geographic projection
9338     which lets the user select if the input is in degrees or radians.
9339    
9340     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9341     to say that the parameter is a tuple of unprojected
9342     points (which is what the callers to this method were assuming).
9343     Also, since the points are unprojected we need to projected them.
9344    
9345     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9346     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9347     groups are selected, move the layer up/down. Fixes RTbug #1833.
9348    
9349     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9350    
9351     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9352     parameter in call to SetClientData.
9353     (GeoPanel): Add support for selecting the units that the
9354     source data is in (Radians or Degrees).
9355    
9356     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9357     the rendering loop by reducing the number of if's, removing the
9358     unnecessary try/except block, and checking if the old group
9359     is the same as the new one (which happens a lot if there is
9360     no classification, or lots of shapes are in the same group).
9361    
9362     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9363     around the redraw routine to try to catch problems that the user
9364     may create by selecting invalid projections for the data set and
9365     map. Clears the display if there are any problems and prints the
9366     error.
9367     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9368     rectangle.
9369    
9370     * extensions/thuban/wxproj.cpp (project_point): First invert the
9371     supplied point (which should be in projected coordinates) using
9372     the layer's projection and then project the point using the
9373     map's projection.
9374     (project_points): Use project_point() to project each point.
9375    
9376 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9377    
9378     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9379     don't set the Classification to None if the classfication field
9380     is None (ie only a DEFAULT).
9381    
9382 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9383    
9384 bh 790 * Thuban/UI/view.py: Fix some typos.
9385    
9386 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9387     not pop up the dialog if the selection becomes empty (this could
9388     happen if e.g. a new selection is opened while the identify tool
9389     is active and dialog had been closed)
9390    
9391     2003-04-30 Bernhard Herzog <[email protected]>
9392    
9393 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9394     instance variable read_record_last_result
9395     (TransientTableBase.read_record): Make sure reading the same
9396     record twice works. The implementation uses the new instance
9397     variable read_record_last_result
9398    
9399     * test/test_transientdb.py
9400     (TestTransientTable.test_transient_table_read_twice): New test
9401     case for the above bug-fix.
9402    
9403 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9404    
9405     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9406    
9407     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9408    
9409     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9410     (ClassTable.SetValueAsCustom): Rename keyword argument in
9411     ClassGroup* constructors to match argument name.
9412    
9413 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9414    
9415     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9416     transient DB if it exists to make sure it doesn't leave a journal
9417     file in the temp directory.
9418    
9419     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9420     self.conn to None after closing the connection to make sure it's
9421     not closed twice
9422    
9423 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9424    
9425 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9426     "true". If anything other than "false" is specified we also assume
9427 jonathan 776 "true". Addresses RTbug #1025.
9428 jonathan 769
9429     * Doc/thuban.dtd: Add visible parameter to a layer.
9430    
9431     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9432     of visible from 1 to True.
9433     (Layer.__init__): Change default value of visible from 1 to True.
9434    
9435     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9436     parameter.
9437    
9438     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9439     parameter.
9440    
9441     * test/test_load.py: Add new test data contents_test_visible.
9442     (LoadSessionTest.setUp): save test data.
9443     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9444     is loaded correctly.
9445    
9446     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9447     for saving an invisible layer.
9448    
9449     2003-04-29 Jonathan Coles <[email protected]>
9450    
9451 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9452     legend dialog box and tell it to change its map to the one
9453     supplied to SetMap(). Fixes RTbug #1770.
9454    
9455 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9456    
9457 bh 766 Next step of table implementation. Introduce a transient database
9458     using SQLite that some of the data is copied to on demand. This
9459     allows us to do joins and other operations that require an index
9460     for good performance with reasonable efficiency. Thuban now needs
9461     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9462     haven't tested that.
9463    
9464     * Thuban/Model/transientdb.py: New. Transient database
9465     implementation.
9466    
9467     * test/test_transientdb.py: New. Tests for the transient DB
9468     classes.
9469    
9470     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9471     classes to help automatically remove temporary files and
9472     directories.
9473     (Session.__init__): New instance variables temp_dir for the
9474     temporary directory and transient_db for the SQLite database
9475     (Session.temp_directory): New. Create a temporary directory if not
9476     yet done and return its name. Use AutoRemoveDir to have it
9477     automatically deleted
9478     (Session.TransientDB): Instantiate the transient database if not
9479     done yet and return it.
9480    
9481     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9482     AutoTransientTable so that data is copied to the transient DB on
9483     demand.
9484     (SimpleStore): New class that simply combines a table and a
9485     shapefile
9486    
9487     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9488     DBFTable and update its doc-string to reflect the fact that this
9489     is only the table interface to a DBF file. Table is now an alias
9490     for DBFTable for temporary backwards compatibility.
9491    
9492     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9493     the last reference to the session goes away so that the temporary
9494     files are removed properly.
9495    
9496     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9497     reference to the session to make sure the temporary files are
9498     removed.
9499    
9500     2003-04-29 Bernhard Herzog <[email protected]>
9501    
9502 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9503     the __parser instance variable into a normal local variable in
9504     read. It's only used there and read will never be called more than
9505     once. Plus it introduces a reference cycle that keeps can keep the
9506     session object alive for a long time.
9507    
9508 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9509 jonathan 735
9510 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9511     Projection an immutable item. Fixes RTbug #1825.
9512     (Projection.__init__): Initialize instance variables here.
9513     (ProjFile.Replace): New. Replace the given projection object with
9514     the new projection object. This solves the problem of needing the
9515     mutator Projection.SetProjection() in the ProjFrame class and
9516     allows a projection to change parameters without changing its
9517     location in the file.
9518    
9519     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9520     be of type wxSAVE and should verify overwriting a file.
9521    
9522     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9523     ProjFile.Replace() method instead of the mutator
9524     Projection.SetProjection(). Also requires that we reassign the
9525     client data to the new projection.
9526    
9527     * test/test_proj.py (TestProjection.test): Test GetName() and
9528     GetAllParameters()
9529     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9530     for Replace().
9531    
9532     2003-04-25 Jonathan Coles <[email protected]>
9533    
9534 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9535     to save the name of the projection.
9536    
9537     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9538     test to verify layer projections are saved correctly.
9539    
9540     2003-04-25 Jonathan Coles <[email protected]>
9541    
9542 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9543     to "Unknown" if name is None.
9544     (Projection.SetAllParameters): New. Set the projection's
9545     parameter list to the one supplied.
9546     (Projection.SetProjection): New. Set the projection's
9547     properties to those of the supplied Projection.
9548    
9549     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9550     the dialog title to include the map's title.
9551     (MainWindow.LayerProjection): Set the dialog title to include
9552     the layer's title.
9553    
9554     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9555     error dialogs into a single method call.
9556     (ProjFrame.__VerifyButtons): Add more states to check.
9557     (ProjFrame.__GetProjection): Return the current state of an
9558     edited projection or None.
9559     (ProjFrame.__FillAvailList): Remove checks for states that
9560     shouldn't exist.
9561     (ProjFrame._OnNew): Clear all selected items and supply
9562     a projection panel if necessary.
9563    
9564     * test/test_proj.py (TestProjFile.test): Add tests for
9565     ProjFile.SetAllParameters, ProjFile.SetProjection,
9566     ProjFile.SetName.
9567    
9568     2003-04-25 Jonathan Coles <[email protected]>
9569    
9570 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9571     takes an optional argument to select the current projection.
9572     This does not guarantee that the item is visible due to
9573     limited wxWindows functionality. Fixes RTBug #1821.
9574    
9575     2003-04-25 Jonathan Coles <[email protected]>
9576    
9577 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9578     the projection name and use it when constructing the Projection
9579     object.
9580    
9581     * Thuban/Model/proj.py (Projection.__init__): Change the default
9582     value for 'name' to None and then test if name is equal to None
9583     in the body of the constructor. This way the caller doesn't have to
9584     know what the default value should be. Namely, useful in load.py
9585     where we have to pick a default value if the 'name' parameter
9586     doesn't exist in the XML file.
9587    
9588     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9589     Tests a file where a layer has a projection.
9590    
9591     2003-04-25 Jonathan Coles <[email protected]>
9592    
9593 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9594     tree for projection information.
9595    
9596     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9597     XMLReader.GetFileName.
9598     (SessionLoader): Added support for loading projection tags that
9599     appear inside a layer.
9600    
9601     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9602     back to using a list because the order of the projections in
9603     the file is important to maintain. Fixes RTbug #1817.
9604    
9605     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9606     to ProjFile.GetFilename.
9607    
9608     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9609     information.
9610    
9611     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9612     ProjFrame._OnSaveAs. Removed old dead code from previous
9613     implementation.
9614     (ProjFrame._OnExport): Add support for exporting more than one
9615     projection to a single file.
9616     (ProjFrame.__FillAvailList): use string formatting (% operator)
9617     to build strings that are (partly) translated. Fixes RTbug #1818.
9618    
9619     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9620     class.
9621    
9622 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9623    
9624     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9625    
9626     * po/fr.po: New. French translation by Daniel Calvelo Aros
9627    
9628     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9629     empty strings.
9630    
9631 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9632 jonathan 724
9633     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9634     implement the interface that the ProjFrame dialog expects.
9635    
9636     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9637     name of the projection to be changed.
9638     (ProjFile): Use a dictionary instead of a list so that removing
9639     projections is easier and we are sure about uniqueness.
9640     (ProjFile.Remove): Remove the given projection object.
9641    
9642     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9643     Return a list with only one projection file instead of searching for
9644     any projection file. This simplifies many things if the user can
9645     only have one system file and one user file.
9646    
9647     * Thuban/UI/classgen.py: Change all references to
9648     genCombo to genChoice.
9649    
9650     * Thuban/UI/mainwindow.py: Add a Projection option under the
9651     layer menu.
9652     (MainWindow.LayerProjection): New. Open up a projection window
9653     for a layer.
9654    
9655     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9656     laid out. Use three panels instead of one. One for the list of
9657     projections, one for the edit controls, and one for the buttons.
9658     Fixed resizing problems so that the dialog resizes correctly
9659     when the projection panel changes. Added import/export, save, and
9660     new buttons/functionality.
9661    
9662 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9663    
9664     First step towards table management. Introduce a simple data
9665     abstraction so that we replace the data a layer uses more easily
9666     in the next step.
9667    
9668     * Thuban/Model/data.py: New file with a simple data abstraction
9669     that bundles shapefile and dbffile into one object.
9670    
9671     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9672     open shapefiles and return a shape store object
9673    
9674     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9675     object instead of a shapefile filename. This introduces a new
9676     instance variable store holding the datastore. For intermediate
9677     backwards compatibility keep the old instance variables.
9678     (open_shapefile): Removed. No longer needed with the shape store.
9679     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9680     get the shape store used by a layer.
9681     (Layer.Destroy): No need to explicitly destroy the shapefile or
9682     table anymore.
9683    
9684     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9685     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9686     open shapefiles
9687    
9688     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9689     session's OpenShapefile method to open shapefiles
9690    
9691     * test/test_classification.py
9692     (TestClassification.test_classification): Use the session's
9693     OpenShapefile method to open shapefiles and build the filename in
9694     a more platform independed way
9695    
9696     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9697     Implement to have a session to use in the tests
9698     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9699     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9700     session's OpenShapefile method to open shapefiles
9701     (TestLayerLegend.setUp): Instantiate a session so that we can use
9702     it to open shapefiles.
9703     (TestLayerLegend.tearDown): Make sure that all references to
9704     layers and session are removed otherwise we may get a resource
9705     leak
9706    
9707     * test/test_map.py (TestMapAddLayer.test_add_layer)
9708     (TestMapWithContents.setUp): Instantiate a session so that we can
9709     use it to open shapefiles.
9710     (TestMapWithContents.tearDown): Make sure that all references to
9711     layers, maps and sessions are removed otherwise we may get a
9712     resource leak
9713     ("__main__"): use support.run_tests() so that more info about
9714     uncollected garbage is printed
9715    
9716     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9717     session's OpenShapefile method to open shapefiles
9718     ("__main__"): use support.run_tests() so that more info about
9719     uncollected garbage is printed
9720    
9721     * test/test_selection.py (TestSelection.tearDown): Make sure that
9722     all references to the session and the selection are removed
9723     otherwise we may get a resource leak
9724     (TestSelection.get_layer): Instantiate a session so that we can
9725     use it to open shapefiles.
9726     ("__main__"): use support.run_tests() so that more info about
9727     uncollected garbage is printed
9728    
9729     * test/test_session.py (TestSessionBase.tearDown)
9730     (TestSessionWithContent.tearDown): Make sure that all references
9731     to the session and layers are removed otherwise we may get a
9732     resource leak
9733     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9734     method to open shapefiles
9735    
9736 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9737    
9738     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9739     if the file_or_filename object had the 'read' attribute.
9740    
9741 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9742    
9743 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9744     (ReadProjFile): Add documentation about which exceptions are raised.
9745     Always pass the exceptions up to the caller.
9746     (GetProjFiles): If the directory can't be read return an empty list.
9747     If any of the proj files can't be read skip that file and go
9748     on to the next one.
9749    
9750     * test/test_proj.py: Added test cases to handle nonexistent files,
9751     unreadable files, and files that don't parse correctly.
9752    
9753     2003-04-23 Jonathan Coles <[email protected]>
9754    
9755 jonathan 716 Projection dialog. Allows the user to select from a list
9756     of projection templates and optionally edit them and save new ones.
9757    
9758     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9759     (ProjPanel): Base class for projection specific panels.
9760     (TMPanel): Projection panel for Transverse Mercartor.
9761     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9762     (LCCPanel): Projection panel for Lambert Conic Conformal.
9763     (GeoPanel): Projetion panel for Geographic Projection.
9764    
9765     2003-04-23 Jonathan Coles <[email protected]>
9766    
9767 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9768     promote symmetry. There now exists XMLReader and XMLWriter.
9769     (XMLReader.read): New. Call to read the given file descriptor or
9770     filename.
9771     (XMLReader.close): New. Make sure the file is closed.
9772     (XMLReader.GetFileName): New. Return just the file name that is being
9773     read from.
9774     (XMLReader.GetDirectory): New. Return just the directory of the file
9775     that is being read.
9776     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9777     the names of functions to call as the XML tree is parsed.
9778     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9779     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9780     (SessionLoader): Removed class variables start_dispatcher and
9781     end_dispatcher since this functionality is now part of a class
9782     instance. Fixes RTbug #1808.
9783     (SessionLoader.__init__): Add dispatcher functions.
9784     (load_xmlfile): Code was moved into the XMLReader.read().
9785     (load_session): Use modified SessionLoader.
9786    
9787     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9788     map's projection.
9789    
9790     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9791     GetAllParameters.
9792     (Projection.GetParameter): Returns the value for the given parameter.
9793    
9794     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9795     (GetProjFiles): Renamed from GetProjections. Now returns a list
9796     of ProjFile objects.
9797     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9798     a list of ProjFile objects whose files are not user defined.
9799     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9800     list of ProjFile objects whose files are user defined.
9801     (ProjFileReader): Extend new XMLReader.
9802    
9803     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9804     promote symmetry.
9805    
9806     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9807     control instead of a wxComboBox. wxChoice controls do not generate
9808     events as the uses highlights possible choices which fixes problems
9809     with resizing the dialog when the use selects an option.
9810    
9811     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9812     control instead of a wxComboBox.
9813    
9814     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9815     dialog.
9816    
9817     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9818     method.
9819    
9820 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9821    
9822 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9823     constants
9824    
9825 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9826     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9827    
9828 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9829    
9830 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9831     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9832     anymore.
9833     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9834     (Layer.ShapeType, Layer.Shape): No need to call
9835     self.open_shapefile since it's always called in __init__
9836    
9837 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9838     In wxPython 2.4 there's no need to extend MainLoop anymore since
9839     wxPython itself makes sure OnExit is called.
9840    
9841 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
9842    
9843 jonathan 693 Initial putback of projection management code. Includes new
9844     classes to read and write projection files. The current load
9845     and save classes were abstracted a bit so they could be reused.
9846     The Projection class was extended to provide new methods and
9847     have a name.
9848    
9849     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9850     general XML reading methods that were part of ProcessSession.
9851    
9852     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9853     name.
9854     (ProjFile): New. Represents a file that contains projection
9855     information.
9856    
9857     * Thuban/Model/resource.py: New. Contains general utilities
9858     for read and writing projection files.
9859    
9860     * Thuban/Model/save.py (XMLSaver): New. Contains all the
9861     general XML writing methods that were part of SessionSaver.
9862     (SessionSaver): Renamed from Saver.
9863    
9864     * test/test_proj.py: New test cases for the projection
9865     file read and write functions.
9866    
9867     2003-04-16 Jonathan Coles <[email protected]>
9868    
9869 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
9870     in the ClassGroup*.__repr__() methods so it is clearer when
9871     a value is a string and when it is a number.
9872    
9873     * test/test_load.py: Rework the classification test to test
9874     that we can load old files.
9875     (testLabels): Test a file where the groups have labels.
9876    
9877 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
9878    
9879     Safer implementation of the performance enhancements of the
9880     low-level renderer:
9881    
9882     * extensions/thuban/wxproj.cpp (extract_projection)
9883     (extract_pointer): Rename extract_projection to extract_pointer
9884     and redefine its purpose to return the pointer stored in a CObject
9885     returned by the object's cobject method. Update all callers.
9886     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9887     handling of these low-level parameters so that each s_draw_info
9888     instance is handled as a CObject at python level that also
9889     contains real references to the actual python objects which
9890     contain the values in the struct. Add free_draw_info as the
9891     destructor.
9892     (draw_polygon_shape): Add the py_draw_info parameter which must a
9893     cobject containing an s_draw_info pointer.
9894    
9895     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9896     method to instantiat the low-level render parameter
9897     (MapRenderer.draw_shape_layer): Use the new method. Remove some
9898     commented out code.
9899     (MapRenderer.draw_polygon_shape): Make the first parameter not the
9900     layer but the low-level render parameter
9901     (ScreenRenderer.draw_shape_layer): Use the low-level render
9902     parameter.
9903    
9904 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
9905    
9906 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
9907     the ClassGroup* classes to make debugging a bit easier.
9908     (ClassGroup.SetLabel): Check that the string is an instance
9909     of StringTypes not StringType. Accounts for Unicode strings.
9910    
9911     * Thuban/Model/color.py: Implemented __repr__ to make
9912     debugging a bit easier.
9913    
9914     * Thuban/Model/save.py (Saver.write_classification): Need to
9915     save the group label.
9916    
9917     * test/test_load.py (testClassification): New. Loads the
9918     iceland_sample_test.thuban file and checks if it was loaded
9919     correctly.
9920    
9921     2003-04-15 Jonathan Coles <[email protected]>
9922    
9923 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9924     to improve rendering performance by initializing the variables
9925     that are not change each time draw_polygon_shape() is called.
9926     The values are stored in a global struct draw_info.
9927     (draw_polygon_shape): Removed initialization code that is
9928     now in draw_polygon_init().
9929    
9930     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9931 jonathan 674 drawing initialization call to draw_polygon_init()
9932     (MapRenderer.draw_polygon_shape): Use new signature of
9933     draw_polygon_shape.
9934 jonathan 673
9935 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9936     weirdness by setting the range to (1, maxint).
9937 jonathan 673
9938 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
9939     instance variables private and optimize comparison operator
9940     by first checking if the color references are the same.
9941     (ClassGroupSingleton): Make instance variables private.
9942     (ClassGroupRange): Make instance variables private.
9943 jonathan 673
9944 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
9945    
9946 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
9947    
9948     First stab at internationalized messages:
9949    
9950     * Thuban/__init__.py (_): Implement the translation function for
9951     real using the python gettext module.
9952    
9953     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9954     translate empty strings.
9955    
9956     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9957     Add a missing space to a warning message
9958    
9959     * po/README: New. Notes about the management of the translation
9960     files.
9961    
9962     * po/Makefile: New. Makefile to help manage the translation files.
9963    
9964     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9965    
9966     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9967     translations and support files in po/
9968    
9969     * setup.py (data_files): Add the *.mo files to the data_files too
9970    
9971     * README: Add note about the translations when building from CVS
9972    
9973 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
9974    
9975     * Thuban/UI/dock.py: Fixes some window resizing problems most
9976     noticable under windows. Always assume the button bitmaps will
9977     be there. Code clean up.
9978     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9979     images for the dock/undock button to the same images.
9980     Work around for RTbug #1801.
9981    
9982     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9983     be allowed to grow within the sizer. Fixes a bug under Windows
9984     where the toolbar wasn't being drawn.
9985    
9986 frank 664 2003-04-14 Frank Koormann <[email protected]>
9987    
9988     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9989     Updated design to try to make the button functionality more
9990     transparent.
9991    
9992 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
9993    
9994     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9995     finalize the intialization of the panel.
9996    
9997     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9998     creation of the panel. Should be the last thing called in the
9999     initializer of a subclass.
10000    
10001     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10002     set the current selections in the combo boxes. This is needed
10003     under Windows.
10004    
10005     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10006     level panel to the dialog so that the background colors are
10007     consistent under Windows.
10008    
10009 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10010    
10011 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10012     not black.
10013    
10014     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10015     the legend changes. Fixes RTbug #1793.
10016    
10017     * test/test_classification.py: Added test for copying of
10018     classifications.
10019    
10020     2003-04-11 Jonathan Coles <[email protected]>
10021    
10022 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10023     such as bitmaps.
10024    
10025     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10026     added images to the move buttons, added 'reverse' button.
10027     (CustomRampPanel.__init__): Added images to the move buttons.
10028     (GreyRamp): New. Generates a ramp from white to black.
10029     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10030    
10031     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10032     ID_PROPERTY_*.
10033     (Classifier.__init__): Minor changes to the layout.
10034     (Classifier._OnTitleChanged): Listen for when the user edits the
10035     title and update the dialog's title and the layer's title.
10036    
10037     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10038    
10039     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10040     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10041     if the layer's title changes.
10042    
10043     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10044     to open a dialog to rename the map.
10045     (MainWindow): Use new resource class to import bitmaps.
10046    
10047     2003-04-11 Jonathan Coles <[email protected]>
10048    
10049 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10050 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10051     Resources/Bitmaps/group_use_none.xpm,
10052     Resources/Bitmaps/group_use_not.xpm,
10053     Resources/Bitmaps/hide_layer.xpm,
10054     Resources/Bitmaps/layer_properties.xpm,
10055     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10056     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10057     New.
10058 jonathan 646
10059 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10060    
10061 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10062     Should pass group to ClassGroup constructor.
10063    
10064     2003-04-10 Jonathan Coles <[email protected]>
10065    
10066 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10067     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10068     here. Implement SetVisible(), IsVisible().
10069     (ClassGroup.__init__): Add group parameter which acts as a copy
10070     constructor.
10071    
10072     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10073     "Visible" check boxes.
10074     (Classifier): Rename the buttons and refactor the code to match
10075     the new labels.
10076    
10077     * Thuban/UI/legend.py: Classify button is now called "Properties".
10078     Refactored the code to change variable names.
10079     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10080    
10081     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10082     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10083     renamed to MainWindow.LayerEditProperties.
10084     (MainWindow.ToggleLegend): Don't include map name in legend title.
10085     (MainWindow.SetMap): Added the map name to the window title.
10086     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10087     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10088     Functionality is found in the layer properties dialog.
10089    
10090     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10091     draw visible groups.
10092    
10093 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10094    
10095 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10096     addition and selection of new color schemes.
10097     (MonochromaticRamp): New. Generates a ramp between two colors.
10098     (RedRamp): New. Generates a ramp of all red.
10099     (GreenRamp): New. Generates a ramp of all green.
10100     (BlueRamp): New. Generates a ramp of all blue.
10101    
10102     2003-04-09 Jonathan Coles <[email protected]>
10103    
10104 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10105     Need to copy over field and fieldType attributes.
10106    
10107     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10108     maximum and minimum values over the entire table for a given
10109     field.
10110     (Table.GetUniqueValues): New. Retrieve all the unique values
10111     in the table for a given field.
10112    
10113     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10114     (GenUniquePanel): New. Controls to allow the user to select
10115     which unique field values they would like in the classification.
10116     (CustomRampPanel): Code that was in ClassGenDialog that allows
10117     the user to select the properties for a custom ramp.
10118     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10119    
10120     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10121     (Classifier._SetClassification): Callback method so that the
10122     class generator can set the classification in the grid.
10123     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10124     editing of a group properties class into a wxWindows control.
10125    
10126     * Thuban/UI/dock.py: It was decided that if the user closes
10127     a dockable window the window should simply hide itself. That
10128     way if the user wants to show the dock again it appears in the
10129     same place as it was when it was closed.
10130     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10131     (DockableWindow._OnButtonClose): Hide the window instead of
10132     destroying it.
10133     (DockableWindow._OnClose): Hide the window instead of
10134     destroying it.
10135    
10136     * Thuban/UI/legend.py (LegendTree): Use a private method to
10137     consistently set the font and style of the text. Fixes RTbug #1786.
10138    
10139     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10140    
10141 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10142    
10143 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10144     to the map module
10145    
10146     2003-04-07 Bernhard Herzog <[email protected]>
10147    
10148 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10149     favor of ToggleSessionTree
10150     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10151     the session tree.
10152     (MainWindow.SessionTreeShown): New method to return whether the
10153     session tree is currently shown.
10154     (MainWindow.ToggleLegend): New method to toggle visibility of the
10155     legend
10156     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10157     LegendShown
10158     (MainWindow.LegendShown): New method to return whether the legend
10159     is currently shown.
10160     (_method_command): Add checked parameter so we can define check
10161     menu items
10162     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10163     mainwindow methods.
10164     (show_session_tree, show_legend commands): Removed.
10165     (toggle_session_tree, toggle_legend commands): New commands to
10166     toggle the visibility of the dialogs
10167    
10168 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10169    
10170 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10171    
10172     * Thuban/UI/dock.py: Fix Windows problem.
10173    
10174     * Thuban/UI/mainwindow.py: Use False instead of false.
10175     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10176    
10177     2003-04-07 Jonathan Coles <[email protected]>
10178    
10179 jonathan 612 Since we now say that the order of the groups in a classification
10180     matters, it makes sense to be able to manipulate that order. Most
10181     of the changes to Thuban/Model/classification.py are to that end.
10182    
10183     * Thuban/Model/classification.py (Classification.AppendGroup,
10184     Classification.InsertGroup, Classification.ReplaceGroup,
10185     Classification.RemoveGroup, Classification.GetGroup): Do as the
10186     names imply.
10187     (Classification.FindGroup): This was called GetGroup, but GetGroup
10188     takes an index, while FindGroup takes a value.
10189     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10190     REFERENCE. Currently there is a cyclic reference between the layer
10191     and its classification. If the classification doesn't need to know
10192     its owning layer we can change this, since it may make sense to be
10193     able to use the same classification with different layers.
10194    
10195     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10196    
10197     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10198     not AddGroup()
10199    
10200     * Thuban/UI/classifier.py: Now that we can depend on the order in
10201     a Classification and have methods to manipulate that order we don't
10202     need to use our own data structures in the grid. We can simply make
10203     the grid/table access the information they need from a copy of
10204     the classification object.
10205     (Classifier._OnCloseBtn): Event handler for when the user clicks
10206     'Close'. This is needed so if the user applies changes and then
10207     continues to change the table the user has the option of discarding
10208     the most recent changes and keeping what they applied.
10209    
10210     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10211     into the same group.
10212    
10213     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10214     with a really old version of proj, PJ_VERSION won't even be defined.
10215     If it isn't defined then just compile so that the function always
10216     returns Py_False.
10217    
10218     * test/test_classification.py: Fix tests to use the renamed methods.
10219     Still need to write tests for the new methods.
10220    
10221 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10222 jonathan 608
10223 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10224     call to SetSelection out of the method and before the call
10225     to __SelectField in __init__. This prevents a recursion of events
10226     when _OnFieldSelect is triggered by the user.
10227    
10228     2003-04-04 Jonathan Coles <[email protected]>
10229    
10230 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10231     Color.Transparent.
10232     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10233     Don't bother copying the color, since Colors are immutable.
10234    
10235     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10236     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10237     Thuban/UI/renderer.py, Thuban/UI/view.py:
10238     Rename Color.None to Color.Transparent.
10239    
10240     * test/test_classification.py, test/test_load.py: Rename Color.None
10241     to Color.Transparent.
10242    
10243     2003-04-04 Jonathan Coles <[email protected]>
10244 jonathan 603
10245     * Thuban/Model/classification.py: Fix assert calls.
10246     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10247     Copy the color parameter rather than hold onto a reference.
10248 jonathan 601
10249 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10250     the color object.
10251     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10252     are sure there exists only one refernce to Color.None in the system.
10253     This allows us to use 'is' rather than the comparision functions.
10254    
10255     * Thuban/Model/save.py: Fix assert calls.
10256    
10257     * Thuban/UI/classifier.py: Fix assert calls.
10258     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10259     dialog to edit the groups properties.
10260     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10261     correctly if a cell is resized.
10262     (ClassTable.SetClassification): New. Changes the classification
10263     that is in the table.
10264     (ClassTable.__SetRow): Allow groups to be prepended.
10265     (Classifier): New code for opening the EditProperties and
10266     GenerateRanges dialogs.
10267     (SelectPropertiesDialog.__GetColor): Only set the color in the
10268     color dialog if the current color is not None.
10269    
10270     * Thuban/UI/dock.py: Fix assert calls.
10271    
10272     * Thuban/UI/legend.py: Fix assert calls.
10273    
10274     * Thuban/UI/renderer.py: Fix assert calls.
10275    
10276     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10277     classifications.
10278     (GenRangePanel): Panel specific to range generation.
10279     (GenSingletonPanel): Panel specific to singleton generation.
10280     (ClassGenerator): Class responsible for actually generating
10281     the classification from the data gathered in the dialog box.
10282     (PropertyRamp): Generates properties whose values range from
10283     a starting property to an ending property.
10284 jonathan 601
10285 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10286    
10287     * test/support.py (print_garbage_information): New function that
10288     prints information about still connected messages and memory
10289     leaks.
10290     (run_suite): Removed.
10291     (run_tests): New function for use as a replacement of
10292     unittest.main in the test_* files. This one calls
10293     print_garbage_information at the end.
10294    
10295     * test/runtests.py (main): Use support.print_garbage_information
10296    
10297     * test/test_layer.py: Use support.run_tests instead of
10298     unittest.main so we get memory leak information
10299     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10300     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10301     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10302     to fix a memory leak.
10303    
10304     * test/test_classification.py: Use support.run_tests instead of
10305     unittest.main so we get memory leak information
10306     (TestClassification.test_classification): Call the layer's Destroy
10307     method to fix a memory leak.
10308    
10309 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10310    
10311 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10312     Handle the reference counts of the return value and errors in
10313     PyArg_ParseTuple correctly.
10314    
10315 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10316     sure the filename is absolute to avoid problems when saving the
10317     session again
10318    
10319 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10320    
10321 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10322    
10323 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10324 jonathan 587 that there actually are points in the returned list of points
10325     before trying to index into the list. The list may be empty if
10326     the shape is a Null Shape.
10327    
10328 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10329    
10330     * test/test_map.py: Don't use from <module> import *
10331    
10332 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10333    
10334     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10335     LAYER_LEGEND_CHANGED
10336    
10337     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10338     self.Destroy() to close the window after yesterday's changes.
10339    
10340     * test/test_map.py, test/test_session.py: Fix messages that
10341     are sent from maps and layers.
10342    
10343 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10344    
10345     * Thuban/UI/classifier.py: Commented out some debugging statements.
10346     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10347     RTbug #1769.
10348    
10349     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10350     position (although position doesn't work yet under GTK).
10351     (DockableWindow.Destroy): New. Called when the window must be
10352     closed. Namely needed when the DockFrame closes and must close
10353     its children.
10354     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10355    
10356     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10357     when then window is told to close.
10358     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10359     comment in source for more info.
10360    
10361     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10362    
10363     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10364     symmetry with other such methods.
10365     (MainWindow.ShowLegend): Show the legend docked by default.
10366    
10367 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10368    
10369     * Thuban/UI/classifier.py: Support for highlighting a specific
10370     group within the grid when the classification dialog is opened.
10371     Also contains a lot of debugging printouts which will later
10372     be removed.
10373    
10374     * Thuban/UI/dock.py: Complete rework on the dock code so that
10375     that it is fairly removed from the rest of the Thuban application.
10376     It is easy to add new docks which the rest of the program having
10377     to be aware of them.
10378    
10379     * Thuban/UI/legend.py: Modifications to support selecting a
10380     specific group in the classification dialog. Changed how layers
10381     are drawn when the layer is visible/invisible.
10382    
10383     * Thuban/UI/mainwindow.py: Removed legend specific code and
10384     replaced it with calls to the new dock code.
10385    
10386     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10387     to check if scale > 0. Trying to track down a divide by zero.
10388    
10389 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10390    
10391 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10392     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10393     now part of DockableWindow.
10394     (LegendPanel.DoOnSelChanged): Select the current layer in the
10395     map.
10396     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10397     with the selected layer and/or group.
10398    
10399     2003-03-26 Jonathan Coles <[email protected]>
10400    
10401 jonathan 557 This putback contains the code for dockable windows. There is
10402     no support in wxWindows as of this date for windows that can
10403     attach themselves to other windows.
10404    
10405     The current model contains a DockableWindow which has a parent
10406     window for when it is detached and a dock window that it puts
10407     its contents in when it is docked. The contents of a DockableWindow
10408     must be a DockPanel. DockPanel itself derives from wxPanel.
10409    
10410     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10411     message, not a LAYER_LEGEND_CHANGED message.
10412    
10413     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10414    
10415     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10416     as one of the style properties for the fieldTypeText item to
10417     be sure that its size is correct when the text changes.
10418    
10419     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10420     DockableWindow.
10421    
10422     * Thuban/UI/legend.py: Added some more buttons and made the
10423     LegendPanel a DockPanel.
10424    
10425     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10426     and supporting functions for manipulating the sashes.
10427     (MainWindow.ShowLegend): Create a DockableWindow with the
10428     LegendPanel as the contents.
10429    
10430     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10431    
10432     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10433     not LAYER_LEGEND_CHANGED, messages.
10434    
10435 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10436    
10437     * setup.py: Added custom script bdist_rpm_build_script so that
10438     when the rpm is built the path to wx-config is correct.
10439    
10440     * setup.cfg: Added line saying to use the custom build script
10441    
10442 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10443    
10444     Initial implementation of the Legend.
10445    
10446     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10447     Legend information and allows the user to add/modify classifications
10448     and how the layers are drawn on the map.
10449    
10450     * setup.py: New command 'build_docs' which currently uses
10451     happydoc to generate html documentation for Thuban.
10452    
10453     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10454     Returns a string which is appropriately describes the group.
10455    
10456     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10457     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10458    
10459     * Thuban/Model/map.py (Map): Rename messages and use new, more
10460     specific, messages.
10461    
10462     * Thuban/Model/messages.py: New message to indicate that a layer's
10463     data has changed (LAYER_CHANGED). New map messages to indicate
10464     when layers have been added/removed/changed or if the stacking order
10465     of the layers has changed.
10466    
10467     * Thuban/Model/session.py: Rename and use new messages.
10468    
10469     * Thuban/UI/classifier.py: Remember if any changes have actually
10470     been applied so that if the dialog is cancelled without an application
10471     of changes we don't have to set a new classification.
10472     (ClassDataPreviewer): Pulled out the window specific code and put it
10473     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10474     symbols on any DC.
10475    
10476     * Thuban/UI/mainwindow.py: New code to open the legend.
10477    
10478     * Thuban/UI/view.py: Use new message names.
10479    
10480 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10481    
10482     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10483     of Python, wxPython, and some other libraries.
10484    
10485     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10486     version against what wxproj was compiled with.
10487     (check_version_gtk): If wxproj was compiled with gtk then check
10488     the given version against the version of the gtk library
10489     currently being used.
10490    
10491 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10492    
10493     * test/test_command.py: Run the tests when the module is run as a
10494     script
10495    
10496     2003-03-14 Bernhard Herzog <[email protected]>
10497    
10498     Implement selection of multiple selected shapes in the same layer:
10499    
10500     - Introduce a new class to hold the selection. This basically
10501     replaces the interactor which was nothing more than the
10502     selection anyway. A major difference is of course that the new
10503     selection class supports multiple selected shapes in one layer
10504    
10505     - Move the object that represents the selection from the
10506     application to the canvas. The canvas is a better place than the
10507     application because the selection represents which shapes and
10508     layer of the map displayed by the canvas are selected and
10509     affects how the map is drawn.
10510    
10511     - Make the selection and its messages publicly available through
10512     the mainwindow.
10513    
10514     - The non-modal dialogs do not get a reference to the interactor
10515     anymore as they can simply refer to their parent, the
10516     mainwindow, for the what the interactor had to offer.
10517    
10518     * Thuban/UI/selection.py: New module with a class to represent the
10519     selection.
10520    
10521     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10522     these unused messages
10523    
10524     * Thuban/UI/application.py (ThubanApplication.OnInit)
10525     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10526     interactor is gone now.
10527     (ThubanApplication.CreateMainWindow): There is no interactor
10528     anymore so we pass None as the interactor argument for now for
10529     compatibility.
10530    
10531     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10532     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10533     Unsubscribe, delegate messages according to the delegated_messages
10534     class variable.
10535     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10536     attributes from instance variables as described with the
10537     delegated_methods class variable.
10538     (MapCanvas.__init__): New instance variable selection holding the
10539     current selection
10540     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10541     pass them on to the renderer
10542     (MapCanvas.SetMap): Clear the selection when a different map is
10543     selected.
10544     (MapCanvas.shape_selected): Simple force a complete redraw. The
10545     selection class now takes care of only issueing SHAPES_SELECTED
10546     messages when the set of selected shapes actually does change.
10547     (MapCanvas.SelectShapeAt): The selection is now managed in
10548     self.selection
10549    
10550     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10551     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10552     Unsubscribe, delegate messages according to the delegated_messages
10553     class variable.
10554     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10555     attributes from instance variables as described with the
10556     delegated_methods class variable.
10557     (MainWindow.__init__): The interactor as ivar is gone. The
10558     parameter is still there for compatibility. The selection messages
10559     now come from the canvas.
10560     (MainWindow.current_layer, MainWindow.has_selected_layer):
10561     Delegate to the the canvas.
10562     (MainWindow.LayerShowTable, MainWindow.Classify)
10563     (MainWindow.identify_view_on_demand): The dialogs don't need the
10564     interactor parameter anymore.
10565    
10566     * Thuban/UI/tableview.py (TableFrame.__init__)
10567     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10568     (LayerTableFrame.row_selected): The interactor is gone. It's job
10569     from the dialog's point of view is now done by the mainwindow,
10570     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10571     of SELECTED_SHAPE
10572    
10573     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10574     is gone. It's job from the dialog's point of view is now done by
10575     the mainwindow, i.e. the parent.
10576    
10577     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10578     gone. It's job from the dialog's point of view is now done by the
10579     mainwindow, i.e. the parent.
10580    
10581     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10582     gone. It's job from the dialog's point of view is now done by the
10583     mainwindow, i.e. the parent.
10584     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10585     stored as self.mainwindow. The mainwindow is need so that the tree
10586     can still subscribe to the selection messages.
10587     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10588     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10589     selection is now accessible through the mainwindow. Subscribe to
10590     SHAPES_SELECTED instead of SELECTED_SHAPE
10591    
10592     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10593     SHAPES_SELECTED message now.
10594     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10595     so deal with multiple shapes
10596     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10597     gone. It's job from the dialog's point of view is now done by the
10598     mainwindow, i.e. the parent.
10599    
10600     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10601     parameter is now a list of shape ids.
10602     (RecordTable.SetTable): The second parameter is now a list of
10603     indices.
10604    
10605     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10606     selected_shape parameter and ivar to selected_shapes. It's now a
10607     list of shape ids.
10608     (MapRenderer.draw_label_layer): Deal with multiple selected
10609     shapes. Rearrange the code a bit so that the setup and shape type
10610     distinctions are only executed once.
10611    
10612     * test/test_selection.py: Test cases for the selection class
10613    
10614 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10615    
10616     * Thuban/Model/load.py: Temporary fix so that the xml reader
10617     doesn't cause Thuban to crash.
10618    
10619     * Thuban/Model/layer.py: Handle the cyclic references between
10620     a layer and its classification better, and be sure to disconnect
10621     the classification from the layer when the layer is destroyed
10622     so that we don't maintain a cyclic reference that may not be
10623     garbage collected.
10624    
10625     * Thuban/Model/classification.py: See comment for layer.py.
10626    
10627 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10628    
10629     * HOWTO-Release: New. Information on the steps for releasing
10630     a new version of Thuban.
10631    
10632 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10633    
10634     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10635     Use True instead of true.
10636     (Classifier): Should have a single panel in which all the controls lie.
10637    
10638     * Thuban/UI/proj4dialog.py: Add normal border.
10639    
10640     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10641    
10642     * Thuban/UI/mainwindow.py: Use True instead of true.
10643    
10644     * setup.py: Update some definitions to use wxWindows2.4 files
10645    
10646     * Data/iceland_sample_class.thuban: Fixed file so that the
10647     field_type information is present.
10648    
10649 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10650    
10651 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10652     field type label grow so that when the text changes the
10653     size is updated correctly. This may be a wxWindows bug.
10654    
10655     2003-03-10 Jonathan Coles <[email protected]>
10656    
10657 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10658     SESSION_REPLACED.
10659    
10660     * Thuban/UI/classifier.py: Wrap text with _().
10661     (ClassGrid.CreateTable): Set dimensions and size hints here,
10662     instead of in Reset, so we only set the size once.
10663    
10664     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10665    
10666     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10667     Call Close() instead of Shutdown().
10668    
10669     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10670    
10671     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10672     Go back to using OnClose() instead of Shutdown().
10673    
10674     2003-03-10 Jonathan Coles <[email protected]>
10675    
10676 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10677     to know the old field index as well as the new one.
10678    
10679     2003-03-10 Jonathan Coles <[email protected]>
10680    
10681 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10682     to correctly set the table information and call this from
10683     __init__ and from _OnFieldSelect so that all the information
10684     is up to date when the dialog opens and when a field is changed.
10685    
10686     2003-03-10 Jonathan Coles <[email protected]>
10687    
10688 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10689     layer's message function directly, use the ClassChanged() method
10690     when then classification changes. SetField/SetFieldType/SetLayer
10691     must keep the information about field name and field type in
10692     sync when an owning layer is set or removed.
10693    
10694     * Thuban/Model/layer.py: Added ClassChanged() so that the
10695     classification can tell the layer when its data has changed.
10696     (Layer.SetClassification): Accepts None as an arguement to
10697     remove the current classification and correctly handles
10698     adding a new classification.
10699    
10700     * Thuban/Model/load.py: Comment out print statement
10701    
10702     * test/test_classification.py, test/test_save.py: New and
10703     improved tests.
10704    
10705 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10706    
10707     * Thuban/Model/classification.py: Implemented __copy__ and
10708     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10709     they can easily be copied by the classifier dialog.
10710     (ClassGroupProperites.__init__): The default line color should
10711     have been Color.Black.
10712    
10713     * Thuban/UI/classifier.py: Setting and Getting table values now
10714     uses a consistent set of functions.
10715     (Classifier): Now non-modal. Has field type label which changes
10716     as the field changes. Keep track of buttons in a list so that
10717     we can enable/disable the buttons when the None field is selected.
10718     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10719    
10720     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10721     does what OnClose did, but can be called by the application to
10722     close a window. Needed when a session changes, and we have to
10723     close the classifier windows.
10724    
10725     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10726     Shuts down open dialogs. Used when a new session is created
10727     or a session is opened.
10728     (MainWindow.SaveSession): Should only call application.SaveSession()
10729     if we don't call SaveSessionAs first.
10730     (MainWindow.Classify): Allow different classifier dialogs for
10731     different layers.
10732    
10733     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10734     the parent class handle it. Add Shutdown() to unsubscibe from
10735     event notification and call the parent Shutdown(). This was
10736     necessary so the application can close the tree window.
10737    
10738 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10739    
10740     * Thuban/Model/classification.py: Minor documentation changes,
10741     Addition of __eq__ and __ne__ methods.
10742     (Classification.SetLayer): prevent recursion between this method
10743     and Layer.SetClassification().
10744    
10745     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10746    
10747     * Thuban/Model/layer.py (SetClassification): prevent recursion
10748     between this method and Classification.SetLayer().
10749    
10750     * test/test_classification.py, test/test_load.py,
10751     test/test_session.py: Fixed and added tests for the classification
10752     classes.
10753    
10754 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10755    
10756     * Thuban/UI/classifier.py (ClassGrid.__init__)
10757     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10758     CreateTable because otherwise it triggers an assertion in
10759     wxPython/wxGTK 2.4.
10760    
10761 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10762    
10763 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10764 jonathan 471
10765 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10766 jonathan 471
10767 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10768 jonathan 471
10769 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10770 jonathan 471
10771     2003-03-05 Jonathan Coles <[email protected]>
10772    
10773 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10774     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10775     Store just the groups in the table and generate the other
10776     column information when it is requested. Add "None" field
10777     to pull-down to select no classification.
10778    
10779     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10780     (Str2Num): Only catch ValueError exceptions.
10781    
10782     * Thuban/Model/classification.py: Class documentation. Renaming
10783     of methods with Stroke to Line. Groups are stored in a single
10784     list with the default as the first element. Groups are searched
10785     in the order they appear in the list.
10786    
10787     * Thuban/Model/color.py: Documentation.
10788    
10789     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10790     the kind of data represented by a field.
10791    
10792     * Thuban/Model/load.py (ProcessSession): Use proper string
10793     conversion function; fixes RTbug #1713.
10794    
10795     * Thuban/Model/save.py (Saver): Store field type information.
10796    
10797     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10798     (Table): Add field_info_by_name() to retrieve field information
10799     by specifying the field name, not the number.
10800    
10801     * Thuban/UI/mainwindow.py: Function name changes.
10802    
10803     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10804     get the layer classification once. Don't try to classify
10805     values when the field is None: just use the default properties.
10806    
10807     * Thuban/UI/view.py: Function name changes.
10808    
10809     * Doc/thuban.dtd: Add field_type attribute to a classification.
10810    
10811 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10812    
10813 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10814     the fill and stroke layer attributes optional with suitable
10815     default values. Add the stroke_width layer attribute. Use correct
10816     syntax for empty elements. Make the attribute list for labels
10817     refer to the label element.
10818    
10819     2003-03-04 Bernhard Herzog <[email protected]>
10820    
10821 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10822     Python 2.3 containing some of the functionality we implement in
10823     setup.py ourselves.
10824    
10825     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10826     before the selection mode. Doing it the other way round triggers
10827     an assertion in wxWindows.
10828    
10829     * Thuban/Model/save.py (escape): Fix typo in doc-string
10830    
10831     * Thuban/Model/classification.py: Remove unnecessary wxPython
10832     import
10833    
10834 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10835    
10836     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10837     Parameter 'value' should default to None.
10838    
10839     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10840     the class attribute __classification is now private.
10841    
10842     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10843     Classifier to ClassGrid. Added support for removing selected rows,
10844     which including code for keeping track of when cells are selected,
10845     and deselected.
10846     (ClassTable): Support for added/removing rows. Fixed a problem
10847     with __ParseInput whereby it would not allow strings (only numbers)
10848     to be entered.
10849     (Classifier): Added button and supporting code for removing
10850     selected rows.
10851    
10852 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
10853 jonathan 434
10854     * Thuban/common.py: Moved color conversion functions into
10855     Thuban/UI/common.py.
10856     (Str2Num): Now converts the float (not the string) to a long/int
10857     so that an exception isn't thrown.
10858    
10859     * Thuban/UI/common.py: Common functions used in several UI modules
10860    
10861     * Thuban/Model/classification.py: Changed the class hierarchy
10862     so that a Classification consists of Groups which return
10863     Properties when a value matches a Group.
10864    
10865     * Thuban/Model/layer.py: Fixed name resolution problem.
10866    
10867     * Thuban/Model/load.py: Use new Classification and Group functions.
10868    
10869     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10870     failure.
10871     (Saver.write_classification): Use new Classification and Group
10872     functions.
10873    
10874     * Thuban/UI/classifier.py: Changes to use new Classification and Group
10875 jonathan 445 functions. Fix to create a tuple with a single value instead of
10876     simply returning the value.
10877 jonathan 434
10878     * Thuban/UI/renderer.py: Use new Classification and Group functions.
10879     Use common.py functions.
10880    
10881 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
10882 jonathan 447
10883     * test/test_classification.py: Use new Classification and Group
10884     classes.
10885 jonathan 434
10886 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
10887    
10888     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10889     functions from Thuban color objects to wxWindow colour objects.
10890    
10891     * Thuban/Model/classification.py (Classification): Renamed
10892     GetProperties() to GetClassData(). Used the new iterator
10893     in TreeInfo().
10894     (ClassIterator): Iterator implementation to iterate over the
10895     ClassData objects in a classification object.
10896    
10897     * Thuban/Model/save.py (Saver.write_classificaton): Uses
10898     the new iterator to save the classification information.
10899    
10900     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10901     for changing the stroke and fill colors and previewing the
10902     changes.
10903    
10904     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10905     MainWindow.SaveSessionAs): Text string changes so the dialogs
10906     have more meaningful titles.
10907    
10908     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10909     Classification method name from GetProperties to GetClassData.
10910    
10911     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10912     instead of accessing now non-existent class variables.
10913    
10914 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
10915    
10916     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10917     unneeded Shape() call. Rendering is substantially faster without
10918     it and it avoids some problems with broken shape files.
10919    
10920 frank 423 2003-02-20 Frank Koormann <[email protected]>
10921    
10922     Force minimal size of identify and label dialogs. The autosizing
10923     looked too ugly.
10924    
10925     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10926     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10927     Set size of listctrl.
10928     * Thuban/UI/identifyview.py (IdentifyView.__init__):
10929     Set size of dialog.
10930    
10931 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
10932    
10933     * test/test_classification.py, test/test_layer.py,
10934     test/test_load.py, test/test_map.py, test/test_session.py:
10935     Updated the tests to use the new functions that are in the
10936     respective classes.
10937    
10938     * Thuban/Model/classification.py (Classification):
10939     Uses the new ClassData* classes. Modification messages are
10940     passed up to the parent layer (if it exists).
10941     (ClassData): New class to encapsulate the common data in each
10942     classification property.
10943     (ClassDataDefault): Represents the Default class. data.
10944     (ClassDataPoint): Represents a single class. data point
10945     (ClassDataRange): Represents a class. range
10946     (ClassDataMap): Represents a class. map (unused).
10947    
10948     * Thuban/Model/color.py: Added Color.None to represent something
10949     with no color. Color.Black represents the color black.
10950     (NoColor): Helper class derived from Color to represent something
10951     with no color.
10952    
10953     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10954     stroke_width attributes. Made the 'classification' attribute private.
10955     New methods for setting/getting the classification.
10956    
10957     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10958     to get the classifcation and use the new ClassData* classes to
10959     hold the classification data. Use Str2Num to convert numbers
10960     properly.
10961    
10962     * Thuban/Model/save.py (Saver): Use new Color and Classification
10963     methods
10964    
10965     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10966     custom grid.
10967     (ClassTable): Support for editing Values and Labels and for
10968     changing what type (point or range) of data is stored in each
10969     property based on how the user enters the data.
10970     (Classifier): Support for saving the new classifications and
10971     launching the dialog to edit a property.
10972     (SelectPropertiesDialog): New class for editing the visual
10973     properties of a classification (stroke color, width, and fill color)
10974     (ClassPreviewer): Took the Draw method from ClassRenderer and
10975     made most of it into this new class. Intend to use this class in
10976     the SelectPropertiesDialog for previewing changes.
10977    
10978     * Thuban/UI/renderer.py: Use new Color and Classification methods.
10979    
10980     * Thuban/UI/tree.py: Formatting changes.
10981    
10982     * Doc/thuban.dtd: Add 'label' element
10983    
10984     * Thuban/common.py: New. Contains common routines used throughout
10985     the code.
10986     (Str2Num): Takes a string and converts it to the "best" type of
10987     number.
10988    
10989 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
10990    
10991     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10992     dragging flag is always set to 0 even when the tool implementation
10993     raises an exception
10994    
10995 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
10996    
10997     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10998     method to create a splash screen.
10999     (ThubanApplication.ShowMainWindow): New. Show the main window.
11000     Needed so the splash screen can display the mainwindow
11001     (ThubanApplication.OnInit): Call the
11002     new splash_screen method to determine whether the application
11003     should display a splash screen. If it displays a splash screen do
11004     not immediately show the main window.
11005    
11006 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11007    
11008     * Thuban/Model/classification.py: Added import line to fix
11009     feature conflicts between running on python2.2 and python2.1.
11010    
11011     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11012     onto the clinfo parameter, so removed the deepcopy().
11013    
11014 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11015    
11016 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11017 jonathan 396 Added element_open variable to track opening and closing of tags
11018     so that tags that don't span more than one line are closed with
11019     /> instead of </tag_name>. Use the GetDefault*() methods of
11020     the Classification class.
11021    
11022     * Thuban/Model/classification.py (Classificaton): Added set and
11023     get methods for the default data. The class also takes a layer
11024     reference so that modification messages can be sent. Fixed the
11025     methods to use the new ClassData class.
11026     (ClassData): New class to encapsulate the classification data
11027    
11028     * Thuban/Model/layer.py (Layer): Remove the
11029 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11030 jonathan 396 SetDefault*() methods on the layer's classification object.
11031 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11032 jonathan 396 Classification class.
11033    
11034     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11035     object instead of a dictionary.
11036    
11037 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11038 jonathan 396 draw the classifications in the dialog box's table.
11039     (Classifier): Modified to use the ClassRenderer class.
11040    
11041 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11042     methods of the Classification class.
11043 jonathan 396
11044     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11045     of the ClassData class.
11046    
11047     * test/test_classification.py, test/test_layer.py,
11048     test/test_map.py, test/test_session.py: Fix the tests to work
11049     with the above code changes.
11050    
11051 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11052    
11053     * Thuban/Model/classification.py (Classification): Added getNull()
11054     to return the NullData reference
11055    
11056     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11057     Layer.SetStrokeWidth): Modified these functions to change the
11058     null data in the classification rather than keep these values
11059     directly in the Layer class. Menu options to change these values
11060     work again.
11061    
11062 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11063    
11064 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11065 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11066 jonathan 380 classification data.
11067    
11068 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11069     Colors in the tree view.
11070    
11071     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11072     the tree info for classifications. Commented out unnecessary lines.
11073    
11074     * Thuban/Model/classification.py (Classification.TreeInfo): New
11075     function to add information about the classification into the
11076     tree view.
11077    
11078 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11079 jan 375
11080 tkoester 403 * Thuban/__init__.py (_): New.
11081 jan 375
11082     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11083     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11084 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11085     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11086     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11087     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11088     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11089     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11090 jan 375
11091 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11092    
11093 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11094 jonathan 370
11095 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11096     a layer classification. Supports specific data points and
11097     ranges.
11098 jonathan 370
11099 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11100     information.
11101 jonathan 370
11102 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11103     information.
11104 jonathan 370
11105 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11106     specifying classification information.
11107 jonathan 370
11108 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11109     dialog.
11110 jonathan 370
11111 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11112     classification information.
11113 jonathan 370
11114 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11115     classification data.
11116 jonathan 370
11117 tkoester 403 * test/test_classification: Tests for the Classification class.
11118 jonathan 370
11119 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11120    
11121 bh 361 * test/test_command.py: New. Tests for the command classes.
11122    
11123 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11124     (Command.IsTool): New method to distinguish between command
11125     switching tools and other commands.
11126    
11127     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11128     the tool to avoid direct assignments to instance variables
11129     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11130     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11131     change the tool
11132    
11133     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11134     active tool's command turns insensitive, disable the tool.
11135     (_tool_command): Use the new ToolCommand class
11136    
11137     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11138     SelectTool method to change the tool
11139     (iconfile): Use the ToolCommand class
11140    
11141 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11142    
11143     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11144     the case of selected items that are not children of Layers or Maps
11145     properly. Previously this bug would trigger an assertion in
11146     wxWindows.
11147    
11148 frank 352 2002-11-06 Frank Koormann <[email protected]>
11149    
11150 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11151     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11152     Full Extent).
11153 tkoester 403
11154 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11155    
11156     * setup.py (setup call): version now 0.1.3
11157    
11158     * MANIFEST.in: Add the files in test/
11159    
11160     * test/README: Add note about tests requiring the iceland data
11161    
11162     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11163     copyright notice.
11164    
11165 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11166    
11167     * test/test_map.py
11168     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11169     epsilon.
11170    
11171     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11172     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11173     message if the assertion fails and don't return the return value
11174     of self.assert_. In assertFloatSeqEqual the return meant that not
11175     all items of the sequence were compared.
11176    
11177 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11178    
11179 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11180    
11181     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11182    
11183 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11184     the string with the bounding box on the fly because of platform
11185     differences in the way %g is handled.
11186    
11187     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11188     DBFfile too because Thuban layers can't yet cope missing DBF
11189     files.
11190    
11191     2002-09-20 Bernhard Herzog <[email protected]>
11192    
11193 bh 326 * test/test_menu.py: Use initthuban instead of
11194     add_thuban_dir_to_path to initialize Thuban.
11195    
11196     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11197     Mixin class for float comparisons
11198     (SubscriberMixin): New. Mixin class to test messages sent through
11199     the Connector class
11200    
11201     * test/README: Fix a typo and add the -v flag to the command for
11202     individual tests
11203    
11204 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11205    
11206     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11207    
11208     * test/test_map.py: New. Test cases for Thuban.Model.map
11209    
11210     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11211    
11212     * test/test_label.py: New. Test cases for Thuban.Model.label
11213    
11214     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11215    
11216     * test/test_color.py: New. Test cases for Thuban.Model.color
11217    
11218     * test/test_base.py: New. Test cases for Thuban.Model.base
11219    
11220 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11221    
11222     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11223     the CHANGED channel too.
11224    
11225     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11226     CHANGED channel too.
11227     (Map.__init__): Call the Modifiable constructor as well.
11228    
11229     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11230     event if the modified flag changes.
11231     (Modifiable.changed): Tweak the doc-string.
11232    
11233     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11234     (MainWindow.set_position_text): Put the code that puts the text
11235     with the mouse position into the status bar into the new method
11236     set_position_text so that it can overwritten in derived classes.
11237    
11238 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11239    
11240     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11241     message box on the main window.
11242    
11243 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11244    
11245     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11246     the 'E' because it's less likely to interfere with other menu
11247     entries.
11248 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11249 bh 313
11250 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11251    
11252     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11253     (_tool_command): Add sensitive parameter
11254     (_has_visible_map): Sensitivity callback to tools and other
11255     commands that require a visible map. Use it in map_zoom_in_tool,
11256     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11257     and map_full_extent
11258    
11259 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11260    
11261     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11262     VIEW_POSITION
11263    
11264 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11265 frank 306
11266     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11267    
11268 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11269    
11270 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11271     wxWindows already and our implementation doesn't work correctly
11272     with wxGTK 2.3:
11273     (MapCanvas.__init__): Remove the instance variable
11274     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11275     be drawin
11276     (MapCanvas.OnIdle): Removed.
11277    
11278 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11279     a parameter to determine the size of the rectangle.
11280     (MapCanvas.find_shape_at): Create the box around the point on a
11281     layer by layer basis and make the size depend on the shape type.
11282     This solves a problem with the selection of point shapes at the
11283     border of the layer's bounding box
11284    
11285 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11286    
11287 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11288     for the sensitivity of remove layer.
11289     (_can_remove_layer): New. Sensitivity callback for remove layer
11290     (Command layer_remove): Use _can_remove_layer
11291    
11292     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11293     determine whether a given layer can be deleted.
11294    
11295 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11296     (MapCanvas.do_redraw): Get rid of the unused update_region
11297     instance variable
11298    
11299 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11300    
11301 bh 292 * test/: new subdirectory with a bunch of unit tests.
11302    
11303     * test/README, test/test_table.py, test/test_save.py,
11304     test/test_menu.py, test/test_load.py: Initial set of tests and
11305     brief instructions on how to run them
11306    
11307 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11308    
11309 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11310     arcs with multiple parts.
11311    
11312 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11313     Handle degenrate rectangles.
11314    
11315 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11316     (Table.__init__): Keep track of whether the DBF is open for
11317     writing
11318     (Table.write_record): Open the DBF file for writing when necessary
11319    
11320 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11321    
11322     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11323     dbf files only for reading by default. Use a new writable dbf
11324     object for writing.
11325    
11326 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11327    
11328 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11329     (MainWindow.Context): New method to return a context
11330     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11331     new method
11332    
11333 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11334     layer table specific code from TableGrid into LayerTableGrid
11335     (TableFrame, LayerTableFrame): Split the layer table specific code
11336     from TableFrame into LayerTableFrame
11337 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11338 bh 278
11339     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11340     LayerTableFrame
11341    
11342 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11343    
11344     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11345     absolute filename.
11346    
11347 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11348    
11349 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11350     records.
11351 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11352 bh 275
11353     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11354     into the underlying table.
11355    
11356     * extensions/shapelib/shapefil.h (DBFCommit),
11357     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11358     commit any changes made to the DBF file.
11359    
11360 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11361     (_tool_command): Put the code that generates the "checked"
11362     callback into a separate function so that we can reuse it
11363     elsewhere
11364    
11365 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11366     session into an XML file. The main reason to introduce a class is
11367     that applications built on Thuban can derive from it so that they
11368     can save additional information in a session file.
11369     (save_session): Delegate almost all the work to the Saver class.
11370     Rename the filename argument to file because it may be a file like
11371     object now.
11372    
11373     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11374     code. Remove the little test code which would be executed when the
11375     module is run as a script which didn't work anymore since it can't
11376     import the other Thuban modules.
11377     (ProcessSession, load_session): Refactor the ProcessSession to
11378     have one method for each element start and end tag so that derived
11379     classes can easily override the processing of individual tags.
11380     Also, always parse with namespaces enabled because applications
11381     built on top of Thuban will likely use namespaces if they extend
11382     the session file format.
11383    
11384 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11385    
11386     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11387     because thubaninit_contents will do it for us.
11388    
11389 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11390 jan 265
11391     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11392     tree window already open
11393    
11394 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11395    
11396 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11397     with self.
11398    
11399     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11400     when we have actually captured it.
11401    
11402 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11403     shapefile and destroy the table.
11404    
11405     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11406    
11407 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11408    
11409 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11410     instance variable columns
11411     (RecordTable.GetTypeName): row and col may be negative in some
11412     cases.
11413    
11414 bh 254 * setup.py (InstallLocal.initialize_options)
11415     (InstallLocal.finalize_options, InstallLocal.user_options): New
11416     option create-init-file to build a thubaninit.py when running
11417     install_local
11418     (InstallLocal.run): Create the thubaninit.py module when requested
11419     (thubaninit_contents): Split the template into several parts and
11420     create a new function thubaninit_contents that creates the
11421     contents of a thubaninit module.
11422     (ThubanInstall.run): Use the new function to create the thubaninit
11423     module.
11424    
11425 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11426    
11427     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11428     cleanup.
11429     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11430    
11431     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11432     direct base class' Destroy method.
11433    
11434     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11435     layers.
11436     (Map.Destroy): Destroy the label_layer as well and call the
11437     inherited Desatroymethod first so that no more messages are
11438     issued.
11439     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11440     message if the stacking order actually has changed. Add
11441     doc-strings.
11442     (Map.BoundingBox): Correct the doc-string.
11443     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11444     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11445    
11446     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11447     all labels.
11448    
11449 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11450    
11451     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11452     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11453     to a layer's channels into separate methods.
11454     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11455     (Map.Destroy): Unsubscribe from a layer's channels before
11456     destroying it.
11457    
11458     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11459     selected_layer parameter to searched_layer which is the layer to
11460     search in.
11461     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11462     search to that layer. Return the selected layer and shape.
11463    
11464     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11465     typo
11466    
11467 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11468    
11469 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11470     Extend the doc string.
11471     (ThubanApplication.subscribe_session)
11472     (ThubanApplication.unsubscribe_session): New methods to
11473     subscribe/unsubscribe to/from session channels.
11474     (ThubanApplication.SetSession): Call the new methods here.
11475     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11476     Renamed set_map to maps_changed. Its now a subscriber for
11477     MAPS_CHANGED.
11478    
11479     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11480     x-coordinate in case of simple clicks
11481    
11482     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11483     don't pass it as a parameter
11484    
11485     * Thuban/Model/session.py (Session.RemoveMap): New
11486    
11487 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11488     window size into a parameter.
11489    
11490 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11491    
11492 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11493     just commands.
11494    
11495 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11496     parameter list a bit to allow setting the window title and the
11497     initial message in the status bar. Update the callers.
11498    
11499     * Thuban/UI/application.py (ThubanApplication.OnInit)
11500     (ThubanApplication.CreateMainWindow): Put the mainwindow
11501     instantiation into a separate method so that it can be overridden
11502     by a subclass.
11503    
11504 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11505    
11506 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11507     another changed message is issued to make it easier to get
11508     notified of changes.
11509     (Session): Update the doc string
11510     (Session.forward): Issue changed-events as CHANGED as well.
11511     (Session.changed): Overwrite the inherited version to issue
11512     CHANGED events as well.
11513    
11514     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11515     CHANGED channel to be informed of changes.
11516     (SessionTreeCtrl.session_channels): Not needed any longer.
11517 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11518 bh 234 Only have to (un)subscribe CHANGED
11519    
11520     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11521    
11522 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11523     for the wxPython locale bug to __init__.py so that it's
11524     automatically executed by anybody using UI code from Thuban.
11525    
11526 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11527    
11528 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11529    
11530     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11531     as parameter and store it in an instance variable
11532     (MainWindow.invoke_command, MainWindow.update_command_ui)
11533     (MainWindow.save_modified_session, MainWindow.NewSession)
11534     (MainWindow.OpenSession, MainWindow.SaveSession)
11535     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11536     application object.
11537    
11538     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11539     the main window with self.
11540    
11541 bh 225 * Thuban/UI/context.py: New module with the context class
11542    
11543     * Thuban/UI/command.py (Command): Update doc string.
11544    
11545     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11546     MainWindow.update_command_ui): Pass an instance of the context
11547     class to the command's methods
11548     (check_current_tool, call_method): Handle the new context
11549     implementation
11550    
11551     * Examples/simple_extensions/simple_tool.py (simple_tool,
11552     check_simple_tool): Handle the new context implementation
11553    
11554     * Examples/simple_extensions/simple_command.py (simple_command):
11555     Handle the new context implementation. Update the comments about
11556     the context.
11557    
11558     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11559     doc-string
11560     (ThubanApplication.Session): New method to return the session
11561     object
11562    
11563     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11564     interactor's selected_layer may not be a layer of the current
11565     session when the tree is updated while a new session is being set.
11566    
11567 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11568    
11569     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11570     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11571     update_tree into update_tree and add_items. The tree now uses a
11572     more generic way to display the contents of the tree.
11573     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11574    
11575     * Thuban/Model/layer.py (Layer.TreeInfo),
11576     Thuban/Model/extension.py (Extension.TreeInfo),
11577     Thuban/Model/map.py (Map.TreeInfo),
11578 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11579 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11580    
11581 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11582    
11583     * Thuban/UI/application.py: Don't use "import from" for the
11584     MainWindow. It can't always be resolved.
11585     (ThubanApplication.OnInit): change reference to MainWindow
11586     accordingly.
11587    
11588     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11589     completely
11590    
11591 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11592    
11593     * setup.py (create_init_module): New configurable variable whose
11594     default depends on the platform we're running on.
11595     (ThubanInstall.initialize_options): Initialize
11596     self.create_init_module from the global create_init_module
11597     (ThubanInstall.user_options): indictate that the options
11598     create-init-module and init-module-dir have arguments.
11599    
11600     * setup.py: In the setup call change the version number to include
11601     cvs.
11602    
11603     * MANIFEST.in: Add the files in Examples
11604    
11605 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11606    
11607 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11608     value of the url parameter.
11609    
11610 bh 208 * Examples: New subdirectory for examples.
11611    
11612     * Examples/simple_extensions/simple_tool.xpm,
11613     Examples/simple_extensions/simple_tool.py,
11614     Examples/simple_extensions/simple_command.py,
11615     Examples/simple_extensions/README: Simple examples showing how to
11616     add new commands and tools.
11617    
11618 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11619     bdist_rpm that we also have an install script.
11620     (bdist_inno): Add 2002 to the copyright notice.
11621    
11622 bh 205 * setup.py: Create a file in python's site-packages directory to
11623     make installation of Thuban as a library easier.
11624     (ThubanInstall.user_options): Add two new options,
11625     create-init-module and init-module-dir
11626     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11627     filenames for installation in the default directories.
11628     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11629     the inherited methods to capture some filenames before they're
11630     transformed too much by distutils.
11631     (ThubanInstall.run): Create the init module if requested.
11632     (ThubanInstall.thuban_init_filename): New method to return the
11633     full name of the init module.
11634     (ThubanInstall.get_outputs): Append the filename of the init
11635     module.
11636    
11637 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11638    
11639 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11640     handle the prefix properly which means that the default for the
11641     installation prefix should be /usr for RPMs and /usr/local when
11642     doing a normal source install.
11643     (bdist_rpm_install_script): Script to override the default install
11644     commands in the specfile generated by the bdist_rpm command.
11645     (thuban_bdist_rpm.user_options): Add a prefix option
11646     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11647     Create the script files for the spec files as empty files here
11648     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11649     to fill the script files with content.
11650    
11651 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11652     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11653     argument. save_session now automatically uses this version,
11654     solving a problem when saving to a relative filename.
11655    
11656     * setup.py: In the setup call, make sure that the library
11657     directories are under $prefix/lib not directly under $prefix.
11658    
11659 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11660 jan 199
11661     * Thuban/Model/extension.py: new module to handle extension objects.
11662     * Thuban/Model/messages.py: new messages for extensions.
11663     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11664     Session.AddExtension): new for handling extensions.
11665     Also some other minor changes to round up extension handling.
11666     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11667     of Extension titles and title and names of its objects.
11668    
11669 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11670    
11671     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11672 bh 202 the events for a command.
11673 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11674     Call bind_command_events to bind the events. add_toolbar_command
11675     can now bind events too so that it's possible to have commands
11676     that are only available through the toolbar.
11677     (MainWindow.init_ids): New instance variable events_bound to keep
11678     track of for which commands events have been bound.
11679    
11680 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11681    
11682     * Thuban/UI/menu.py: New module to build and manage menus.
11683    
11684     * Thuban/UI/mainwindow.py: Remove some unused imports.
11685     (MainWindow.__init__, main_menu): move the definition of the main
11686     menu from __init__ to the Menu instance main_menu.
11687     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11688     build the menu bar and sub-menus from a menu description.
11689    
11690     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11691     startup file
11692     (ThubanApplication.read_startup_files): New method to run
11693     ~/.thuban/thubanstart.py
11694    
11695 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11696     Move the toolbar definition to the Menu instance main_toolbar.
11697     (MainWindow.build_toolbar): New method to build the toolbar
11698     similar to the build_menu methods
11699    
11700 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11701    
11702 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11703     layer_outline_color. Fix it in the definition of the command too.
11704    
11705 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11706    
11707 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11708    
11709     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11710     in the docstring
11711    
11712 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11713    
11714 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11715     when the shapefile is empty.
11716     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11717     now return None for empty shapefiles. Update doc-strings.
11718    
11719     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11720     the layer's bbox being None.
11721    
11722     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11723     layer's bbox being None.
11724    
11725 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11726     necessary.
11727     (MapCanvas.__init__): New instance variables, last_selected_layer
11728     and last_selected_shape to determine how the selection has
11729     changed.
11730    
11731     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11732     AutoSizeColumns because it will cause a traversal of the entire
11733     table which for large .dbf files will take a very long time.
11734    
11735 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11736    
11737     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11738     maximum depth for the tree than shapelib does by default.
11739    
11740 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11741    
11742     * setup.py (py_modules): The shptree modules doesn't have a
11743     wrapper, so don't include it in the py_modules
11744    
11745 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11746    
11747     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11748     const void * as in the qsort prototype
11749     (SHPTreeFindLikelyShapes): Remove some unused variables.
11750    
11751     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11752     maintains to redraw the window during a drag.
11753     (MapCanvas.unprojected_rect_around_point): New method to determine
11754     a small region around a point for hit-testing.
11755     (MapCanvas.find_shape_at): Only test the shapes in a small region
11756     around the point.
11757    
11758     * setup.py: Increment the version to 0.1.2
11759    
11760     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11761     debug print and set session to None after unsubscribing
11762    
11763 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11764    
11765 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11766     the file to have a .thuban extension.
11767    
11768 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11769     all the session channels to subscribe to to update the tree
11770     (SessionTreeCtrl.session_changed): Remember the session so that we
11771     can unsubscribe properly. Use the new class constant to
11772     unsubscribe from the old session and subscribe to the new one.
11773     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11774     subscriptions of the SessionTreeCtrl.
11775     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11776    
11777     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11778     Session Tree" command to the file menu.
11779    
11780     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11781     as update_region to the renderer.
11782    
11783     * Thuban/UI/renderer.py
11784     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11785     update box is now directly a tuple, not a wxRect anymore.
11786    
11787     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11788     prints.
11789    
11790     2002-05-07 Bernhard Herzog <[email protected]>
11791    
11792 bh 146 * setup.py: Add the shptree extension module. See
11793     extensions/pyshapelib/ChangeLog for more details.
11794    
11795     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11796     extensions/shapelib/dbfopen.c: Really update to the versions of
11797     shapelib 1.2.9. For some reason it wasn't really done on
11798     2002-04-11.
11799    
11800     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11801     shapelib 1.2.9. The only real difference is the use of qsort
11802     instead of a bubble sort implementation
11803    
11804     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11805     shapetree to hold the shapelib quadtree for the shapefile
11806     (Layer.open_shapefile): Create the quad tree.
11807     (Layer.ShapesInRegion): New method to return the ids of shapes in
11808     a given region using the quad tree.
11809    
11810     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11811     comment
11812     (draw_polygon_shape): Accept both arcs and polygons.
11813     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11814     the api.
11815    
11816     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11817     return the shape ids to be rendered in a given layer.
11818     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11819     ids. Use draw_polygon_shape to draw arc shapes as well.
11820     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11821     has to be updated
11822     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11823     calling it's ShapesInRegion method.
11824    
11825     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11826     update_region for the update region.
11827     (MapCanvas.OnPaint): Maintain the update region
11828     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11829     to the renderer when drawing the bitmap. Reset the update_region.
11830    
11831 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11832    
11833 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11834     MainWindow.OpenSession): Change the file extension of the session
11835     files to .thuban
11836    
11837 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11838     Move the map channels to be forwarded by the session into the
11839 bh 146 class constant with forwarded_channels. Also add
11840     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11841     forwarded_channels
11842 bh 129
11843     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11844     typo and some rewording).
11845    
11846 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
11847    
11848     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11849     around to speed up most redraws:
11850     (MapCanvas.__init__): New instance variable bitmap which holds the
11851     bitmap
11852     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11853     self.bitmap to draw.
11854     (MapCanvas.full_redraw): New method to force a full redraw
11855     including the bitmap
11856     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11857     make sure the bitmap is redrawn.
11858     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11859     MapCanvas.shape_selected): Call full_redraw instead of readraw to
11860     make sure the bitmap is redrawn.
11861     (MapCanvas.OnSize): New method to handle size events so that the
11862     bitmap can be redrawn.
11863    
11864 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
11865    
11866     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11867     canvas' VIEW_POSITION event
11868     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11869     Update the text in the status-bar accordingly.
11870    
11871     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11872     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11873     called.
11874     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11875     current_position
11876     (MapCanvas.set_current_position): New method to set
11877     current_position. Issue a VIEW_POSITION event
11878     (MapCanvas.CurrentPosition): New public method to return the value
11879     of current_position. Should be called when the VIEW_POSITION event
11880     is processed.
11881     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11882     Update the position.
11883     (MapCanvas.OnLeaveWindow): Set the position to None.
11884    
11885     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11886     position in the statusbar
11887    
11888 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
11889 frank 120
11890     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11891    
11892 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
11893    
11894 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
11895    
11896     * Resources/Bitmaps/fullextent.xpm: new
11897 jan 116
11898 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
11899 jan 116
11900 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11901     box
11902 jan 114
11903 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
11904    
11905 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11906    
11907     * Thuban/UI/tree.py (update_tree): added added map extent
11908    
11909     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11910 tkoester 403 icon; added map_full_extend as tool
11911 jan 114
11912 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
11913 jan 107
11914     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11915     saving _new_ sessions
11916    
11917     * Thuban/Model/session.py (create_empty_session): new session
11918     don't have a filename (set to None)
11919    
11920     * Thuban/UI/tree.py (update_tree): added filename and modified flag
11921    
11922     * Thuban/Model/load.py (ProcessSession): convert projection
11923     parameters from unicode to regular string
11924    
11925     * Data/iceland_sample.session: Added UTM Zone 26 projection.
11926    
11927 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
11928    
11929     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11930     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11931     1.2.9
11932    
11933     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11934     the pyshapelib directoy into the list of include dirs, so that
11935     pyshapelib_api.h can be found.
11936    
11937     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11938     holds the pyshapelib C-API
11939     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11940     pyshapelib_api to access the shapelib functions.
11941     (initwxproj): Import the c_api from the shapelib module and
11942     initialize pyshapelib_api.
11943    
11944 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
11945    
11946 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
11947     initialize_options to create the scripts for the rpm.
11948    
11949 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11950    
11951 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
11952    
11953 bh 87 * setup.py: Increment version to 0.1.1
11954    
11955 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11956     Layer" and "Remove Layer" commands from the layer menu to the map
11957     menu
11958    
11959 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
11960    
11961     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11962     argument (python <= 1.5.2 erroneously accepted multiuple
11963     arguments)
11964    
11965 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
11966    
11967     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11968     RecordGrid in the identifyview.
11969     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11970     IdentifyListCtrl. The grid allows editing of the values.
11971    
11972     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11973     implementing a grid for a single row of a thuban table.
11974    
11975     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11976     layers by default. Easier to use than the previous default of only
11977     searching through the select layer which meant that if no layer
11978     was selected, you couldn't select a shape.
11979    
11980     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11981    
11982     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11983     stroke_width attribute
11984    
11985     * Thuban/Model/save.py (save_session): Write the new stroke_width
11986     attribute
11987    
11988     * Thuban/Model/load.py (ProcessSession.startElement): Read the
11989     stroke_width attribute
11990    
11991     * Thuban/Model/layer.py (Layer.__init__): New parameter and
11992     instance variable stroke_width
11993     (Layer.SetStrokeWidth): Set the stroke_width.
11994    
11995 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
11996    
11997     * extensions/thuban/wxproj.cpp (project_points): Fix two
11998     off-by-one errors in the last loop that joins the various parts
11999     together.
12000    
12001 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12002    
12003     * setup.py (data_dist.make_distribution): Fix some typos
12004    
12005 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12006    
12007     * README: Slight tweaking in preparation for the 0.1 release
12008    
12009     * setup.cfg: Add section for sdist to create both tgz and zip
12010     archives
12011    
12012     * setup.py: increase version number to 0.1
12013     (data_dist): New command class for data distribution
12014    
12015 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12016    
12017 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12018     Handle the case of no layer (i.e. layer is None) properly.
12019    
12020 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12021 bh 70 Set the initial selection of the combo boxes to reflect the
12022     projection we're starting with in a way that works on windows,
12023     too.
12024    
12025 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12026     puiblisher's ids in hex to make it easier to compare them to the
12027     standard repr of python methods
12028    
12029     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12030     messages
12031    
12032 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12033    
12034 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12035     deselect the layer if no layer is selected
12036    
12037 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12038     idle time when there actually is something to draw. If there's
12039     nothing to draw simply clear the window
12040     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12041     (MapCanvas.SetMap): force a redraw in all cases because
12042     FitMapToWindow doesn't always do it.
12043     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12044     specify the point to move into the center of the window
12045     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12046     dragged, zoon in/out by a factor of 2
12047 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12048     index, i.e. reversed drawing order) so that objects appearing to
12049     be in from of others are selected first. This is probably mostly
12050     relevant for point shapes where the symbols used may overlap
12051 bh 59
12052     * Thuban/Model/session.py (create_empty_session): Unset the
12053     modified bit before returning it
12054    
12055     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12056     create_empty_session session to create the new, empty session.
12057    
12058     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12059     the tool bitmaps.
12060     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12061     the code that asks whether the session should be saved into the
12062     new method save_modified_session.
12063     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12064     method to save modified session here too.
12065    
12066 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12067    
12068     * setup.py (InnoIconItem): fix typo
12069    
12070     (thuban_bdist_inno.run):
12071     (bdist_inno.run): Move the decision not to create symlinks on
12072     non-nt platforms to thuban_bdist_inno and do it unconditinally
12073     since we never want to create the symlinks here
12074    
12075 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12076    
12077 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12078     identify view immediately
12079    
12080     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12081     and SelectableRecordListCtrl that implement the code shared by the
12082     identify view and the label dialog
12083    
12084     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12085     new class RecordListCtrl
12086    
12087     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12088     return value of GetValue is None instead of using it as a boolean
12089     directly so that Zero numbers are handled properly.
12090     (LabelListCtrl): Derive from the new class
12091     SelectableRecordListCtrl
12092    
12093 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12094     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12095     size of the text control explicitly to make the sizers work on
12096     both Windows and X.
12097    
12098 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12099    
12100     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12101     that can limit the search to the currently selected layer.
12102     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12103     layer stays selected even when no shape is found
12104 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12105     height do nothing (avoids zero division errors)
12106 bh 44
12107 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12108    
12109 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12110     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12111     convenient :-)
12112     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12113     a new instvar layer_to_item to map layers to tree items
12114     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12115     to match the current selection in the interactor
12116    
12117 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12118     (Interactor.HasSelectedLayer): New methods to query the current
12119     selection
12120    
12121     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12122     (MainWindow.has_selected_layer): Simply call the appropriate
12123     interactor method
12124    
12125     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12126     (MainWindow.LayerShowTable):
12127     (MainWindow.identify_view_on_demand): Store the interactor in an
12128     instvar and use that reference instead of going through main.app
12129    
12130 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12131     * Thuban/UI/application.py (ThubanApplication.OnInit):
12132 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12133     with the new mainwindow method ShowSessionTree and not directly
12134     the application's OnInit method
12135    
12136     * Thuban/UI/tree.py (myTreeCtrlPanel):
12137     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12138     TreeCtrl isntead of a panel. This affects most method since we now
12139     refer to self instead of self.tree
12140     (SessionTreeView): New class implementing a non-modal dialog
12141     showing the session tree.
12142    
12143 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12144     layer to the tableview dialog.
12145    
12146     * Thuban/UI/tableview.py: Add some doc-strings
12147 tkoester 403 (TableGrid):
12148 bh 35 (TableGrid.OnRangeSelect):
12149     (TableGrid.OnSelectCell):
12150     (TableFrame.__init__):
12151     (TableFrame.row_selected):
12152     Selecting rows in the grid view now updates the selected shapes
12153     through the TableFrame. To achieve this we derive TableGrid from
12154     Publisher and introduce the message type ROW_SELECTED which the
12155     TableFrame subscribes to and which is issued by OnRangeSelect and
12156     OnSelectCell
12157    
12158     (DataTable.SelectRow): Removed because it's no longer needed in
12159     the row/shape selection scheme
12160    
12161 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12162     dialogs
12163    
12164     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12165     the SELECTED_SHAPE message anymore. This is now handled by the
12166     parent.
12167     (TableGrid.select_shape): Only update the selection if the shape
12168     is not None.
12169     (TableFrame): Inherit from the new NonModalDialog class.
12170     (TableFrame.__init__, TableFrame.select_shape): Handle the
12171     SELECT_SHAPE message.
12172     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12173     SELECT_SHAPE
12174    
12175     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12176     (MainWindow.add_dialog):
12177     (MainWindow.dialog_open):
12178     (MainWindow.remove_dialog):
12179     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12180     of opened non-modal dialogs.
12181    
12182     (MainWindow.__init__): Initialize the new non-modal dictionary
12183     management code
12184     (MainWindow.LayerShowTable): maintain separate dialogs for each
12185     table using the non-modal dialog management code to only open a
12186     view once for each table.
12187    
12188     (MainWindow.IdentifyTool):
12189     (MainWindow.__init__):
12190     (MainWindow.identify_view_on_demand): Don't open the identify view
12191     in IdentifyTool anymore. This will be done automatically by the
12192     new method identify_view_on_demand which handles the
12193     SELECTED_SHAPE message so that the identify view will be opened on
12194     demand
12195    
12196     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12197     the interactor argument. The SELECTED_SHAPE message is now handled
12198     by the parent.
12199     (IdentifyView.__init__): Add the interactor argument so that we
12200     can handle the SELECTED_SHAPE message here
12201     (IdentifyView.selected_shape): New method to handle the
12202     SELECTED_SHAPE messages
12203    
12204     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12205     NonModalDialog class
12206     (IdentifyView.OnClose): Extend the inherited version to
12207     unsubscribe SELECT_SHAPE
12208    
12209     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12210    
12211 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12212    
12213     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12214 tkoester 403
12215 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12216     interactor to pass through to the MapCanvas
12217 tkoester 403
12218 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12219     argument to the MainWindow constructor to get rid of the ugly hack
12220     that made main.app available early just so that the mapcanvas
12221     could access the interactor object.
12222    
12223 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12224    
12225 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12226     that runs a modal message box
12227     (MainWindow.OnClose): Use the new method
12228     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12229     selected. The command should be grayed out anyway, so there's no
12230     need to pop up a message box.
12231     (MainWindow.AddLayer): Pop up a message box with an error message
12232     if the shape file can't be opened
12233    
12234     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12235     immediately. This will cause an exception in case the file can't
12236     be opened and we can display an appropriate message.
12237    
12238 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12239    
12240     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12241     specific bdist_rpm command.
12242    
12243     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12244     the locale module because it may not be available on some
12245     installations.
12246    
12247     * extensions/pyprojection/LICENSE: Copy of the license text in
12248     Projection.i. Having it in a separate file makes it easier to
12249     refer to license text in e.g. RPMs
12250    
12251 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12252    
12253 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12254     more generic
12255    
12256     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12257     <prefix>/bin to the outputs
12258     (ThubanInstall.link_file): New method to link files. We need this
12259     because the standard copy_files refuses to link non-existing
12260     files.
12261     (ThubanInstall.run): Remove the leading install root from the
12262     script filename if an install root was specified and use the new
12263     link_file method
12264 tkoester 403
12265 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12266     the window when the first layer is added to the map.
12267    
12268     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12269     when linking thuban.py to <prefix>/bin
12270    
12271 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12272    
12273     * setup.py: In the setup call, the install parameters shouldn't
12274     have trailing slashes because distutils on non-posix platforms
12275     doesn't like that. The same applies to other directories like
12276     "Resources/Bitmaps"
12277    
12278     In the configuration section for nt, move the wxWindows directory
12279     optins into the part clearly marked as editable.
12280    
12281     (InstallLocal.initialize_options):
12282     (InstallLocal.user_options): remove the currently unused debug
12283     flag
12284     (thuban_build_py.find_all_modules): Add this method so that it
12285     works for our case of having packages and modules in one
12286     distribution as well.
12287     (ThubanInstall.initialize_options):
12288     (ThubanInstall.finalize_options):
12289     (ThubanInstall.user_options):
12290     (ThubanInstall.boolean_options): Add new options, do-symlink and
12291     extra files. Since these are the first ThubanInstall specific
12292     options, override user_options and boolean_options
12293     (ThubanInstall.run): Honor the new do-symlink and extra-files
12294     options.
12295     (ThubanInstall.get_outputs): Add to override the base-class's
12296     version and add the extra-files to the outputs
12297     (bdist_inno): New class for windows distributions with Inno Setup
12298     (InnoIconItem): Helper class for bdist_inno
12299     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12300     this together with the appropriate parameters, to the setup call.
12301 tkoester 403
12302 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12303     installer
12304    
12305     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12306     changing_selection to avoid recursive selection events when
12307     modifying the selection in response to a selection event.
12308     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12309     changing the tree's selection.
12310     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12311     we're not being called indirectly from normalize_selection.
12312    
12313     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12314     event.Check only if the command is actuall checkable.
12315     (MainWindow.__init__): Call the toolbar's Realize method to make
12316     sure that the items are actually shown
12317    
12318 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12319    
12320 bh 9 * setup.py: Fix some doc strings
12321    
12322 bh 7 * ChangeLog: started
12323    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26