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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2636 - (show annotations)
Tue Jun 28 06:49:59 2005 UTC (19 years, 8 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 460167 byte(s)
fix part 2 of RT#3149

1 2005-06-28 Jan-Oliver Wagner <[email protected]>
2
3 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
4 Use the default size for rendering selected items of default type.
5 Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
6
7 2005-06-28 Jan-Oliver Wagner <[email protected]>
8
9 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
10 (APR_TClr.GetThubanColor): Fix bug in color interpretation.
11 Thanks to Frank Koormann who identified this problem.
12
13 * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
14 another symbol identified.
15
16 2005-06-27 Jan-Oliver Wagner <[email protected]>
17
18 * Doc/manual/thuban-manual-de.xml: More translations.
19
20 2005-05-12 Jonathan Coles <[email protected]>
21
22 * Thuban/UI/projdialog.py: Add missing import, which led to an
23 exception when opening a layer's projection.
24
25 2005-05-09 Bernhard Herzog <[email protected]>
26
27 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
28
29 2005-05-09 Bernhard Herzog <[email protected]>
30
31 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
32 connection to autoconnect. Fixes RT#3148.
33
34 * test/test_postgis_db.py
35 (TestPostGISSpecialCases.test_simple_error_handling): New test
36 that attempts to reproduce RT#3148.
37
38 2005-05-06 Jonathan Coles <[email protected]>
39
40 Add support for saving and loading the opacity and mask type
41 properties of RasterLayers. Also add support for proper use
42 of alpha information while drawing images not in 'RAW' format.
43 If transparency in an image format (e.g, PNG) is supported by
44 wxWidgets then the image would previously have been draw with
45 transparent regions, but the opaque regions would have been
46 unaffected by a change in the layer's opacity. This patch
47 corrects the problem.
48
49 * Thuban/Model/layer.py (RasterLayer): Added opacity and
50 masktype parameters to the constructor, and set the
51 appropriate variables to those values.
52
53 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
54 code to read the opacity and mask type of the layer and construct
55 a new layer with the additional parameters.
56
57 * Thuban/Model/save.py (SessionSaver.write_layer): Added code
58 to save the opacity and mask type of a layer.
59
60 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
61 the opacity of the layer to draw_raster_data rather than the layer.
62 (BaseRenderer.draw_raster_data): Remove the layer parameter because
63 the function doesn't need to know about the layer. Add the optional
64 opacity parameter whose default is 1.0. Add 'PNG' as a supported
65 graphics format.
66
67 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
68 signature to match that in BaseRenderer. Use the new opacity argument
69 in place of calling layer.Opacity(). In the case where the
70 format is not 'RAW', alpha_data is None and the loaded image has
71 alpha information, use the file's alpha information. This is
72 still subject to the layer's opacity setting.
73
74 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
75 Fixed signature to match that in BaseRenderer.
76
77 * test/test_load.py (TestRasterLayer): Change file_contents to
78 include opacity and masktype variables.
79 (TestRasterLayer.test): Include tests for opacity and masktype
80 changes.
81
82 * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
83 test to cover a variety of combinations of masktype and opacity
84 settings.
85
86 2005-05-02 Jan-Oliver Wagner <[email protected]>
87
88 * debian/rules: add --use-wx-python-swig-hack
89 to the build command.
90 Thanks to Moritz Lennert for pointing this out.
91
92 2005-04-28 Jan-Oliver Wagner <[email protected]>
93
94 Introduce OGRFileShapeStore in ogr extension.
95 This allows at least that loaded shapefile shape stores
96 can be saved correctly in the thuban session file
97 and reloaded again (reload is via core shapefile
98 routine, not OGR). For other types, .thuban files
99 can not be reloaded for the time being.
100
101 * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
102 class ist to be used for any file-based shape stores
103 accessed through OGR.
104
105 * Extensions/ogr/ogrstart.py (open_with_ogr): Added
106 forgotten _ for i18n. Adapted call OpenFileShapestore
107 regarding new parameter.
108 (OpenFileShapestore): Use OGRFileShapeStore instead of
109 OGRShapeStore. Fix return value (None instead of null).
110 Add new parameter "mainwindow" to avoid accessing global
111 context.
112
113 2005-04-27 Jan-Oliver Wagner <[email protected]>
114
115 Introduce FileShapeStore as generalization for
116 file-based shape stores. In a first instance
117 this allows additional modules to handle shapefile
118 format as well, namely the OGR extension.
119
120 * Thuban/Model/data.py: Various small fixes in doc-strings.
121 (FileShapeStore): New class.
122 (ShapefileStore): Derive from FileShapeStore.
123 (ShapefileStore.__init__): Call __init__ of FileShapeStore,
124 rename self.table to self._table, initialize self._bbox
125 (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
126 and self.FileName() instead of self.filename.
127 (ShapefileStore.Table): Use self._table instead of self.table.
128 (ShapefileStore.FileName): Removed (moved to FileShapeStore).
129 (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
130
131 * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
132 (SessionSaver.write_data_containers): Only use methods of the
133 base class FileShapeStore.
134
135 2005-04-26 Martin Schulze <[email protected]>
136
137 * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
138 function to the modified render engine
139
140 2005-04-25 Martin Schulze <[email protected]>
141
142 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
143 Added a description according to the CVS log message
144
145 2005-04-23 Martin Schulze <[email protected]>
146
147 * Thuban/UI/renderer.py: Added a missing import
148
149 2005-04-23 Russell Nelson <[email protected]>
150
151 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
152 way the previous tool is remembered, so that middle-button
153 panning works even if you haven't selected a tool.
154
155 2005-04-11 Bernhard Herzog <[email protected]>
156
157 * libraries/thuban/wxproj.cpp: Move the compatibility code that
158 deals with the wxPython 2.4 version of wxPython.h into the #ifdef
159 branch that includes wxPython.h because it's only needed when
160 wxPython.h is used. Also, it won't compile when
161 USE_WX_PYTHON_SWIG_HACK is set otherwise.
162
163 2005-04-07 Bernhard Herzog <[email protected]>
164
165 * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
166 (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
167 ClassGrid.__init__ and it's value is outside of the valid
168 range (must be < 32768). wxPython 2.5 complains about it with an
169 exception.
170
171 2005-04-05 Jan-Oliver Wagner <[email protected]>
172
173 * Doc/manual/thuban-manual-de.xml: More translations.
174
175 2005-04-05 Bernhard Herzog <[email protected]>
176
177 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
178 wxPython 2.4 as well. Also, remove a now obsolete comment.
179
180 2005-04-05 Bernhard Herzog <[email protected]>
181
182 Use wxPython.h by default but provide a workaround when it isn't
183 available.
184
185 * setup.py (wxproj_extension): New variable. Assign the Extension
186 instance for Lib.wxproj to this variable instead of putting it
187 directly into the listso that it can be accessed by other code
188 later.
189 (thuban_build_ext.user_options): Added boolean option
190 --use-wx-python-swig-hack.
191 (thuban_build_ext.initialize_options): Initialize the new option
192 to False.
193 (thuban_build_ext.finalize_options): If the new option was given,
194 define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
195 (thuban_build_ext): Update the doc-string
196
197 * libraries/thuban/wxproj.cpp: Normally we use
198 wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
199 defined, use swigPtrConvertHack.h instead.
200
201 * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
202 copied over from wxPython.h.
203 (decode_pointer_new): New. Equivalent of decode_pointer for
204 wxPython 2.5.
205 (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
206
207 * README: Add section on potential build problems which explains
208 how the work-around for a missing wxPython.h is activated.
209
210 2005-03-29 Bernhard Herzog <[email protected]>
211
212 * test/postgissupport.py (find_postgis_sql): Added yet another
213 potential location for (lw)postgis.sql because the file has moved
214 again in postgis 1.0.0 rc4.
215
216 2005-03-29 Bernhard Herzog <[email protected]>
217
218 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
219 match the site of the legend_icon_layer icon. Otherwise wxpython
220 2.5 complains when the legend is created with the error:
221
222 PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
223 bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
224 0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
225 in wxImageList: this might work on this platform but definitely
226 won't under Windows.
227
228 2005-03-23 Jonathan Coles <[email protected]>
229
230 These changes add support for adjusting the opacity of a raster layer.
231
232 * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
233 (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
234 a LAYER_CHANGED event if the opacity actually changes.
235
236 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
237 layer parameter needed in the implementation of this method in
238 renderer.py.
239
240 * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
241 typo 00 -> 0.
242
243 * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
244 control to adjust opacity.
245
246 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
247 alpha data based on the opacity level of the layer.
248
249 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
250 accepts a layer parameter.
251
252 * test/test_layer.py (TestLayerModification.test_raster_layer):
253 Rename opacity method calls and add test for LAYER_CHANGED.
254
255 2005-03-16 Bernhard Herzog <[email protected]>
256
257 * test/test_connector.py (DeletionTestMixin.check_deletions)
258 (DeletionTestMixin.check_deletetions): renamed to check_deletions.
259 update the callers.
260
261 2005-03-14 Jan-Oliver Wagner <[email protected]>
262
263 * Doc/manual/thuban-manual-de.xml: More translations.
264
265 2005-03-10 Jan-Oliver Wagner <[email protected]>
266
267 Introducing initialization callbacks for extensions.
268
269 * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
270 optional parameter init_callback.
271 (ExtensionDesc.init_ext): New. Executes the callback and sets
272 a status.
273
274 * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
275 initialization of the extensions.
276 (ThubanApplication.init_extensions): Init all extensions.
277
278 * Thuban/UI/about.py (About.__init__): Added status of the extensions
279 to the about text.
280
281 * Extensions/gns2shp/__init__.py: Added init method for Extension
282 description.
283 (init): New. Contains the initialization of the module.
284
285 2005-03-04 Nina Hüffmeyer <[email protected]>
286
287 * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
288 OGRConnection to open a datasource. Removed dialog to display all
289 available drivers. Added some doc strings.
290
291 * Extensions/ogr/ogrstart.py: Added menu entry for opening an
292 OGRDatasource with a string. Added two opening methods which return an
293 OGRDatasource (either data from file or from DB).
294
295 * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
296 represents a geometry reference of an OGRFeature. OGRShape now has a
297 list of referenced geometry objects (important for geometry
298 collections).
299 For OGRShapeStores loaded from a DB an ID column can be specified now.
300
301 2005-02-22 Jan-Oliver Wagner <[email protected]>
302
303 * test/test_map.py (TestMapWithContents.test_tree_info):
304 Added label layer for comparison.
305
306 2005-02-18 Jonathan Coles <[email protected]>
307
308 * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
309 which builds a mask. Handle the majority of an image in a loop,
310 creating 8 bits at a time. Later, handle the edge case where less
311 than 8 bits are packed.
312
313 2005-02-18 Bernhard Herzog <[email protected]>
314
315 * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
316 doc-string
317
318 2005-02-18 Jonathan Coles <[email protected]>
319
320 * setup.py: Remove wx_cs_params from gdal compile options.
321
322 2005-02-18 Jonathan Coles <[email protected]>
323
324 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
325 dependencies on wxPython. Added a new method projected_raster_layer()
326 that returns a raster layer image in projected space. This must be
327 implemented in classes derived from BaseRenderer. This also eliminates
328 the dependency on gdal in baserenderer.py.
329
330 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
331 new projected_raster_layer() to get projected raster image instead
332 of directly calling ProjectRasterFile().
333 (BaseRenderer.projected_raster_layer): New. This must be implemented
334 by derived classes. It takes almost the same arguments as ProjectRasterFile
335 did and returns a projected image with mask and alpha data (if requested).
336 (BaseRenderer.render_map_incrementally): Remove the check for gdal since
337 that check will be done in MapRenderer.projected_raster_layer(). This
338 also allows other implementations to use different projection code.
339
340 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
341 Implementation of BaseRenderer.projected_raster_layer. Checks for
342 gdal support and wxPython version. Also handles exceptions from
343 ProjectRasterFile.
344
345 * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
346 and added a variable which can be set through the options argument
347 of ProjectRasterFile.
348
349 * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
350 Calls ProjectRasterFile and returns the result.
351 (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
352 of calling projected_raster_layer() with different options.
353 (TestBaseRenderer.test_raster_no_projection): Removed tests based on
354 wxPython version and all tests of masks and alpha channels. These are
355 now in test_projected_raster_layer().
356
357 2005-02-17 Jan-Oliver Wagner <[email protected]>
358
359 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
360 doc-strings to comply with coding_guidelines.
361
362 2005-02-17 Jan-Oliver Wagner <[email protected]>
363
364 Docstring improvements and minor fixes for labellayer.
365
366 * Thuban/Model/map.py:
367 (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
368 Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
369 Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
370 Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
371 doc string.
372 (Map.BoundingBox): Removed superfluous test for label_layer
373 and improved doc string.
374 (Map.TreeInfo): Added label_layer and improved sdo string.
375
376 * Thuban/Model/label.py: Added import of _.
377 (Label, Label.__init__): Improved/added doc string.
378 (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
379 LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
380 Improved/added doc string.
381 (LabelLayer.AddLabel): Use already defined names for
382 align strings and improved doc string.
383 (LabelLayer.TreeInfo): New. Return the object data for
384 the tree view.
385
386 2005-02-16 Jonathan Coles <[email protected]>
387
388 Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
389 so that that wxproj doesn't crash. Added GUI support for selecting
390 alpha channel (opacity can't be selected yet).
391
392 NOTE: If wxPython.h is including in future distribution packages
393 then it will not be necessary to have the files swigPtrConvertHack.h
394 and wxPython_int.h included with Thuban. This is hopefully
395 a temporary workaround.
396
397 * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
398 access to the macro wxCHECK_VERSION so that it will properly
399 generate a bit mask. There was a problem between wx2.4 and wx2.5
400 that this works around.
401
402 * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
403 of RasterLayer.MaskType.
404 (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
405 (RasterLayer.MaskType): New. Returns the type of mask to use. Can
406 specify none, a bitmap, or an alpha channel.
407 (RasterLayer.SetMaskType): New. Set what kind of mask to use.
408
409 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
410 Set the raster warping options for the mask based on the value
411 of RasterLayer.MaskType.
412
413 * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
414 deprecated calls to SetItemSelectedImage in favor of SetItemImage
415 with wxTreeItemIcon_Selected.
416
417 * Thuban/UI/rasterlayerproperties.py: Support selecting to use
418 an alpha channel for the mask.
419
420 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
421 data if it is available and an alpha channel is supported under
422 the current version of wxPython.
423
424 * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
425 to select whether 1's or 0's select the desired portion of an image
426 in the bit mask. wx2.4 has a bug where the documentation is the opposite
427 from behavior.
428 (ProjectRasterFile): Only generate an alpha channel if the version
429 of wxPython is >= 2.5.3.
430
431 * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
432 When wxPython >= 2.5.3 use the special swig functions to decode an
433 object's address.
434
435 * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
436 based on the version of wxPython. If >= 2.5.3 use the special swig
437 functions from wxPython to decode wxPython objects, otherwise use
438 the old method of retrieving the address from the object __repr__ string.
439
440 * libraries/thuban/wxPython_int.h: Copied from wxPython source.
441 Unnecessary code was removed to make it smaller.
442
443 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
444 Add tests for returning an alpha channel.
445
446 * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
447 tests that used removed functions UseMask and SetUseMask
448
449
450 2005-02-08 Bernhard Herzog <[email protected]>
451
452 More wxPython 2.5 changes. This time taken from a patch from
453 Daniel Calvelo Aros.
454
455 * Thuban/UI/tableview.py (QueryTableFrame.__init__)
456 (QueryTableFrame.__init__): Pass the size of a spacer as a single
457 item.
458
459 * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
460 (ProjFrame.build_dialog): Pass the size of a spacer as a single
461 item.
462
463 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
464 size of a spacer as a single item.
465
466 * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
467 size of a spacer as a single item.
468
469 2005-02-08 Bernhard Herzog <[email protected]>
470
471 Compatibility with wxPython 2.5. The changes should make it work
472 better with 2.5 while still keeping compatibility with 2.4. There
473 are still problems with 2.5, though.
474
475 * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
476 of a spacer as a single item.
477
478 * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
479 from wxControl
480
481 * Thuban/UI/legend.py (LegendTree): When running with wxPython <
482 2.5, add an implementation of the GetFirstChild method that does
483 not require the second parameter.
484 (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
485 (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
486 (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
487 pass the second parameter to GetFirstChild
488
489 2005-02-08 Nina Hüffmeyer <[email protected]>
490
491 * Extensions/ogr/ogrshapes.py: Removed some print commands.
492
493 * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
494 additional menu but appears as a possibility in the menu Map.
495
496 2005-02-07 Jonathan Coles <[email protected]>
497 * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
498 and PYTHON_ERRF since they were no longer necessary.
499
500 2005-02-07 Bernhard Reiter <[email protected]>
501 * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
502 Enable translation for message string.
503
504 2005-02-06 Martin Schulze <[email protected]>
505
506 * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
507 the arguments of the contstructor to fit the global scheme
508
509 2005-01-31 Nina Hüffmeyer <[email protected]>
510
511 * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
512 some dialogs needed to start ogr.
513
514 * Extensions/ogr/__init__.py: Changed comments to avoid encoding
515 warnings.
516
517 * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
518 encoding warnings.
519
520 2005-01-28 Jonathan Coles <[email protected]>
521
522 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
523 mask is packed into a bit array. It's now slightly faster.
524
525 2005-01-28 Jonathan Coles <[email protected]>
526
527 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
528 default to true.
529
530 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
531 code that loads the state of the layer's use_mask flag. Its
532 usefulness is still being debated.
533
534 * Thuban/Model/save.py (SessionSaver.write_layer): Remove
535 code that saves the state of the layer's use_mask flag. Its
536 usefulness is still being debated.
537
538 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
539 options to ProjectRasterFile based on the state of layer.UseMask().
540 Catch more exceptions from ProjectRasterFile so that Thuban doesn't
541 quit is there is a problem projecting.
542 (BaseRenderer.draw_raster_data): Change the documentation to
543 describe the new format (XBM) that the mask data will be in.
544
545 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
546 data is in XBM format when format='RAW' which means it doesn't
547 need to be converted to a wxImage before being used as a mask
548 for a wxBitmap. Assume that if format != 'RAW' that the image
549 data and mask data are in the same format.
550
551 * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
552 and a mask is requested, convert the alpha band to a bit array in
553 XBM format. if an alpha channel is requested, simply return the
554 data in the alpha band. Provide better error handling by returning
555 python error messages (also fixes RT #2947).
556 (ProjectRasterFile): Support multiple mask options, rather than simply
557 a flag indicating that a mask should or should not be used. Provide
558 better error handling by returning python error messages.
559
560 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
561 Add mask data to test.
562
563 * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
564 should use the mask by default.
565 (TestLayerModificaton.test_raster_layer): Test that a layer should use
566 the mask by default.
567
568 * test/test_load.py (TestRasterLayer.test): Remove testing for
569 use_mask flag in file.
570
571 * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
572 for use_mask in file.
573
574 * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
575
576 2005-01-26 Jonathan Coles <[email protected]>
577
578 Add a new dialog box for raster layers. The dialog box allows
579 the user to toggle a mask that is generated by ProjectRasterFile
580 and is used to only draw the real parts of the projected image.
581
582 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
583 Instruct the warping code to generate a mask if the raster layer
584 requests one.
585 (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
586
587 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
588 obsolete optional mask argument.
589
590 * Thuban/UI/classifier.py (Classifier): Change the parent class
591 to LayerProperties and rework the code to support layout calls
592 from the parent.
593 (Classifier.dialog_layout): New. Layout the dialog box.
594 (Classifier.map_layers_removed): Removed. Moved to parent class.
595 (Classifier.map_replaced): Removed. Moved to parent class.
596 (Classifier._OnTry): Renamed to OnTry to support parent class.
597 (Classifier.OnClose): Removed. Supplied in parent class.
598 (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
599 (Classifier._OnOK): Renamed to OnOK to support parent class.
600 (Classifier._OnRevert): Renamed to OnRevert to support parent class.
601
602 * Thuban/UI/layerproperties.py: New. Base class for layer properties
603 dialog boxes.
604
605 * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
606 raster layer properties.
607
608 * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
609 with the non-simple version supplied with gdal. This allows added
610 features such as creating an alpha band.
611 (GetImageData): Generate a mask array from the alpha band that is
612 generated by gdal if the user has selected it. Try to support images
613 that have more than three bands, such as images with RGB plus an
614 alpha band.
615 (ProjectRasterFile): Convert python argument for mask and tell
616 gdal to enable or disable an alpha band.
617
618 * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
619 describing what kind of layer the class is. Defaults to "Unknown",
620 but should be overridden by subclasses.
621 (Layer.Type): New. Override base class method.
622 (RasterLayer.__init__): Create a flag for using a mask. Record extra
623 data from gdal for display in the properties dialog.
624 (RasterLayer.Type): New. Override base class method.
625 (RasterLayer.UseMask): New. Returns True if the mask should be used.
626 (RasterLayer.SetUseMask): New. Set if the mask should be used.
627 (RasterLayer.ImageInfo): New. Return extra information about the image.
628
629 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
630 the mask information.
631
632 * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
633
634 * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
635 Classifier classes as dialogs to use with the proper layer types.
636
637 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
638 Fix test.
639
640 * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
641 (TestLayerModification.build_path): New. Support function.
642 (TestLayerModification.test_raster_layer): New. Test new methods.
643
644 * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
645
646 * test/test_load.py (TestRasterLayer): Add tests for mask.
647
648 * test/test_load_1_0_1.py: New. Copied from test_load.py.
649
650 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
651 obsolete optional mask argument.
652
653 2005-01-26 Nina Hüffmeyer <[email protected]>
654
655 * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
656 which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
657 RowOrdinalToId() and ReadRowAsDict().
658
659 * Extensions/ogr/ogrstart.py: Added menu item which opens database
660 layers for existing database connections.
661
662 * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
663
664
665 2005-01-26 Jan-Oliver Wagner <[email protected]>
666
667 * Doc/manual/thuban-manual-de.xml: More translations.
668
669 2005-01-24 Bernhard Herzog <[email protected]>
670
671 Rework the status bar updates a bit to make sure the message about
672 the projections is produced at the right times.
673
674 * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
675 New class variable with messages that may require a status bar
676 update.
677 (MainWindow.view_position_changed)
678 (MainWindow.update_status_bar): Rename from view_position_changed
679 to update_status_bar. It's meaning has changed now that it may
680 also generate messages about problems with projection settings.
681 (MainWindow.__init__): Use the new update_status_bar_messages
682 class variable to subscribe update_status_bar
683 (MainWindow.set_position_text): Update doc-string. This method
684 has to be renamed at some point. See doc-string and comments.
685 (MainWindow.OnClose): Unsubscribe update_status_bar from all
686 messages in update_status_bar_messages
687
688 * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
689 class attribute. map messages to be forwarded by the viewport.
690 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
691 the messages in forwarded_map_messages
692
693 2005-01-21 Bernhard Herzog <[email protected]>
694
695 * test/postgissupport.py (PostGISDatabase.__init__): Tweak
696 doc-string
697 (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
698 different name for the initialization SQL file.
699
700 2005-01-21 Jonathan Coles <[email protected]>
701
702 * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
703 a projection and returns a formatted string representing the
704 parameters to feed to gdalwarp. This function eliminates
705 redundancy in draw_raster_layer().
706 (BaseRenderer.render_map_incrementally): Removed the optimization which
707 drew the top most raster layer first and then only those vector-
708 based layers that are above it. With the support for transparency
709 this optimization breaks correct behaviour.
710 (BaseRenderer.draw_raster_layer): Reorganize code to support possible
711 future enhancements to raster layer bounding box. The old behaviour has
712 not changed. Also, change calling parameters to draw_raster_data()
713 to specify new RAW data format and mask.
714 (BaseRenderer.draw_raster_data): Change signature to include an optional
715 parameter for mask information. Change documentation to mention
716 support for new parameter and added option for RAW data format.
717 The data argument is now a list of [width, height, data].
718
719 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
720 mask parameter. Add new condition for RAW format, which
721 significantly reduces rendering time. Add condition for
722 mask parameter.
723
724 * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
725 data array of RGB values from the projected image returned from
726 the gdal warping functions. In the case of palette based images, it
727 converts the NO_DATA index to the mask color.
728 (ProjectRasterFile): Removed all custom memory driver references
729 and replaced it with the standard in-memory dataset provided
730 by gdal. The return data is no longer a BMP file, but an array
731 of RGB values, one set triple per pixel.
732
733 * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
734 * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
735 * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
736
737 * setup.py (thuban_build_ext.finalize_options): Removed mention
738 of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
739 files. These are obsolete with the new version of gdalwarp.cpp
740
741 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
742 Updated signature.
743 (TestBaseRenderer.test_raster_no_projection): Changed the test
744 data to be data in the uncompressed RAW format returned from
745 ProjectRasterFile.
746
747 2005-01-21 Jan-Oliver Wagner <[email protected]>
748
749 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
750 string available for i18n.
751
752 2005-01-20 Russell Nelson <[email protected]>
753
754 * Resources/Projections/defaults.proj: Ruin the speling of the
755 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
756 It's the wrong thing to do in the long run, but it's necessary for
757 those users until that bug is fixed. Otherwise the projection
758 dialog segfaults. Better to annoy some Lambert-93 users with a
759 spelling mistake than every Fedora Core 3 user of Thuban-CVS.
760
761 2005-01-20 Bernhard Reiter <[email protected]>
762
763 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
764 docstring and comment that the warning code here is a hack.
765
766 2005-01-20 Russell Nelson <[email protected]>
767
768 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
769 user about misprojected layers when their lat/lon bounding
770 box exceeds rational lat/lon values.
771
772 2005-01-20 Bernhard Reiter <[email protected]>
773
774 * Thuban/UI/about.py (unicodeToLocale): Improved:
775 Use 'ascii' and then 'replace' for other characters
776 when getdefaultlocale returns None. Thanks to Bernhard H. .
777
778 2005-01-20 Bernhard Reiter <[email protected]>
779
780 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
781 that OnRangeText might be called twice and using None as argument.
782
783 2005-01-20 Bernhard Reiter <[email protected]>
784
785 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
786 OnRangeText(0) to work around a different in wx Behaviour noticed
787 on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
788
789 2005-01-20 Bernhard Reiter <[email protected]>
790
791 * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
792 None. (Fixes rt#2910.)
793
794 2005-01-18 Frank Koormann <[email protected]>
795
796 New Extension: mouseposition
797 Tool to collect mouse click positions (map coordinates) in a dialog.
798
799 * Extensions/mouseposition/__init__.py: New, extension registration
800
801 * Extensions/mouseposition/mouseposition.py: New, implements the
802 dialog and adds a tool to Thuban mainwindow.
803
804 * Extensions/mouseposition/position.xpm: New, icon for tool.
805
806 2005-01-14 Jan-Oliver Wagner <[email protected]>
807
808 * Doc/manual/thuban-manual-de.xml: More translations.
809
810 2005-01-11 Frank Koormann <[email protected]>
811
812 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
813 Fix indention bug.
814
815 2005-01-09 Frank Koormann <[email protected]>
816
817 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
818 BugFix 2901: Explicitly copy layers ClassificationColumn since it
819 is not part of the layers Classification.
820
821 2005-01-03 Frank Koormann <[email protected]>
822
823 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
824 BugFix 2883: Former implementation only worked on classified point
825 layers: KeyError was raised, now use the default size if field is None.
826
827 2004-12-27 Bernhard Reiter <[email protected]>
828
829 svgexport 1.0.0cvs: Fixed label export.
830
831 * Extensions/svgexport/test/test_svgmapwriter.py:
832 class TestSVGRenderer(): New class; new test test_label_font().
833
834 * Extensions/svgexport/svgmapwriter.py
835 (SVGRenderer.label_font()): initialised Font size with self.factor now,
836 makes test_label_font happy.
837
838 * Extensions/svgexport/TODO: crossed out fixed label export item.
839 Added item for options.
840
841 * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
842
843 2004-12-27 Russell Nelson <[email protected]>
844
845 Middle mouse button pans.
846
847 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
848 OnMiddleDown and OnMiddleUp events.
849 (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
850 previously used tool.
851 (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
852 pressing the middle mouse button.
853
854 2004-12-27 Jan-Oliver Wagner <[email protected]>
855
856 * Doc/manual/thuban-manual-de.xml: More translations.
857
858 2004-12-23 Jan-Oliver Wagner <[email protected]>
859
860 * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
861 \n to stderr after the warnings. Thanks to Russell Nelson.
862
863 2004-12-20 Nina Hueffmeyer <[email protected]>
864
865 * Extensions/ogr/ogrshapes.py: Fixed some issues from
866 Bernhard (coding guidelines etc.). Additionally it is now possible to
867 display shapefiles containing feature collections (e.g.polygons
868 with holes). Works with gdal 1.2.1 now.
869
870 * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
871 from Bernhard (coding guidelines etc.). If ogr can't be imported,
872 tests are skipped now.
873
874 * Extensions/ogr/ogrstart.py: Fixed some typings.
875
876 2004-12-20 Bernhard Reiter <[email protected]>
877
878 * Extensions/svgexport/TODO: updated to add support for
879 raster layers and labels for 1.0.1.
880
881 * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
882 Issue a warning now.
883
884 2004-12-19 Bernhard Reiter <[email protected]>
885
886 * Extensions/svgexport/TODO: Added idea to support triggering
887 the application down the pipe.
888
889 2004-12-19 Bernhard Reiter <[email protected]>
890
891 svgexport: Improved code quality, mainly by better naming.
892
893 * Extensions/svgexport/svgmapwriter.py:
894 DrawPath() renamed to DrawPolygonPath(),
895 added documentation, improved comments and variable names.
896
897 * Extensions/svgexport/svgmapwriter.py,
898 Extensions/svgexport/test/test_svgmapwriter.py:
899 All using DrawPolygonPath() now, the default parameter closed=True
900 omitted.
901
902 * Extensions/svgexport/test/test_svgmapwriter.py:
903 renamed test_polygon_opened() to test_polyline()
904 renamed test_transparent_polygon() to test_transparent_polyline()
905
906 2004-12-18 Jan-Oliver Wagner <[email protected]>
907
908 Some fixes of gns2shp extension.
909
910 * Extensions/gns2shp/test/__init__.py: New. Make this directory a
911 package.
912
913 * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
914 dynamically.
915
916 * Extensions/gns2shp/test/README: Simplified description how to test.
917
918 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
919 fixed some dimensions of fields according to the GNS documentation
920 which seems to change undocumented.
921 Now killing trailing \n and/or \r from MODIFY_DATE.
922 This fixes RT#2453.
923
924 2004-12-18 Bernhard Reiter <[email protected]>
925
926 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
927
928 * Extensions/svgexport/test/test_svgmapwriter.py:
929 Added new tests: test_export_polygon_with_hole()
930 and test_polygon_with_hole().
931
932 * Extensions/svgexport/svgmapwriter.py
933 (draw_polygon_shape()): Uses DrawPath correctly now.
934
935 * Doc/manual/thuban-manual.xml: Added documentation for stable
936 extention svgexport.
937 * Doc/manual/thuban-manual-de.xml: Copied English section about
938 svexport over.
939
940 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
941
942 * Extensions/svgexport/svgsaver.py,maplegend.py:
943 Moved from experimental to stable extension menu.
944
945 * Extensions/svgexport/TODO: updated.
946
947
948 2004-12-18 Bernhard Reiter <[email protected]>
949
950 Added Extensions/svgexport/TODO
951
952 2004-12-18 Bernhard Reiter <[email protected]>
953
954 Refactored in svgexport:
955 DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
956
957 * Extensions/svgexport/svgmapwriter.py
958 Added verbosity level 3 to print out polygon points.
959 (class Point): added __repr__
960 (class Brush, __str__()): Added space after ,.
961 (DrawPolygon): Renamed to DrawPath()
962 (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
963 (DrawLines): Using DrawPath now.
964
965 * Extensions/svgexport/test/test_svgmapwriter.py:
966 Replaced DrawPolygon() calls with DrawPath() and put the first argument
967 inside another list. Adapted test data with a newline before "M".
968
969 2004-12-18 Bernhard Reiter <[email protected]>
970
971 Refactored svgexport tests: 9 double tests runs eliminated;
972 code size reduced by 8 lines.
973
974 * Extensions/svgexport/test/test_svgmapwriter.py:
975 (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
976 (class BaseWithDCtools): New, subclass from BaseTestWithDC.
977 (class TestDrawSplines): now subclass from BaseTestWithDCtools,
978 this fixed the double running of the nine tests of TestVirtualDC.
979 (class TestVirtualDC): Using self.dc and self.file from setUp().
980
981 2004-12-17 Bernhard Herzog <[email protected]>
982
983 Two windows specific fixes ported from thuban-1­0-branch:
984
985 * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
986 instead of getlocale because getlocale doesn't return a usable
987 encoding name on a german windows 2000
988
989 * setup.py: windows build: Removed the absolute path names and
990 made all prfixes relative to the directory containing setup.py.
991 Makes it a little easier to adapt to a different system.
992
993 2004-12-16 Bernhard Herzog <[email protected]>
994
995 Add support for PostGIS tables with LINESTRING geometries.
996 Fixes RT#2299
997
998 * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
999
1000 * test/postgissupport.py
1001 (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1002 table to "roads-multi" because it now uses MULTILINESTRING
1003 geometries and introduce a new "roads" table that uses LINESTRING
1004 (coords_to_multilinestring): Make the doc string more precise
1005 (coords_to_linestring): New. Create a LINESTRING WKT
1006 representatin
1007 (wkt_converter): Add coords_to_linestring
1008 (upload_shapefile): Rephrase the doc-string a bit.
1009
1010 * test/test_postgis_db.py (TestPostGISShapestoreArc)
1011 (LineStringTests)
1012 (TestPostGISShapestoreLineString)
1013 (TestPostGISShapestoreMultiLineString): Split
1014 TestPostGISShapestoreArc into a base class LineStringTests and two
1015 derived classes TestPostGISShapestoreLineString for LINESTRING
1016 geometries and TestPostGISShapestoreMultiLineString for
1017 MULTILINESTRING geometries. Most test methods are in the base
1018 class with the exception of tests that explicitly check the raw
1019 format.
1020
1021 2004-12-16 Bernhard Herzog <[email protected]>
1022
1023 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1024
1025 * test/postgissupport.py (find_postgis_sql): Different postgis
1026 versions put the postgis.sql file into slightly different places
1027 so we have to look in both. The updated doc string describes this
1028 is more detail.
1029
1030 * test/test_postgis_db.py
1031 (TestPostGISSpecialCases.test_column_name_quoting): The return
1032 value of UniqueValues is unsorted, so it has to be sorted for
1033 comparison.
1034
1035 2004-12-16 Bernhard Herzog <[email protected]>
1036
1037 Fix for RT#2237
1038
1039 * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1040 panel to be shown is the UnknownProjPanel disable the OK and Try
1041 buttons. Otherwise enable them.
1042 (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1043 the parameters. In that case __GetProjection also returns None
1044 now.
1045
1046 2004-12-15 Bernhard Herzog <[email protected]>
1047
1048 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1049 minimum number of classes to 2. The calculate_quantiles needs at
1050 least two and raises an exception otherwise.
1051 Fixes RT#2549
1052
1053 2004-12-15 Bernhard Herzog <[email protected]>
1054
1055 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1056 so that it returns a result for select statements.
1057 (PostgreSQLServer.server_version): New. Return the version of the
1058 server software.
1059 (PostgreSQLServer.require_authentication): The format of
1060 pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1061 server version and generate the file in the correct format
1062
1063 2004-12-15 Bernhard Herzog <[email protected]>
1064
1065 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1066 in the doc string and rephrase it a little.
1067
1068 2004-12-15 Frank Koormann <[email protected]>
1069
1070 * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1071 session has been loaded successfully. The check is called by the relevant
1072 tests after executing load_session().
1073
1074 2004-12-13 Bernhard Herzog <[email protected]>
1075
1076 Make sure the region used to determine which shapes are visible
1077 actually matches the region on the printed page. If this isn't
1078 done properly some shapes might not be printed.
1079 Fixes RT #2692
1080
1081 * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1082 renderer has to be at the same position as the mapregion
1083
1084 * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1085 has to be moved by (self.shiftx, self.shifty) too.
1086
1087 2004-12-13 Bernhard Herzog <[email protected]>
1088
1089 * libraries/pyprojection/Projection.i: Work around a bug in the
1090 generated python code which leads to exception in the __del__
1091 method when the constructor fails. See the comments in the code
1092 for more details.
1093
1094 * libraries/pyprojection/Projection.py: Updated from Projection.i
1095 with SWIG.
1096
1097 2004-12-13 Bernhard Herzog <[email protected]>
1098
1099 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1100 (TestAltPath.test_02_path_error_fix_from_list)
1101 (TestAltPath.test_05_path_error_fix_from_list_changed)
1102 (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1103 is destroyed in tearDown, so there's no need to do it in a test
1104 case.
1105
1106 * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1107 debug print
1108
1109 2004-12-13 Bernhard Herzog <[email protected]>
1110
1111 * Extensions/svgexport/test/test_svgmapwriter.py
1112 (TestDrawSplines.setUp): Do not use super with the unittest
1113 classes because in Python 2.2 they're still old-style classes.
1114
1115 2004-12-13 Frank Koormann <[email protected]>
1116
1117 Alternative Path feature: When loading a (moved) session where
1118 shapefiles cannot be found, ask the user. Use the specified path
1119 if further shapefiles are missing. However, ask the usr for confirmation
1120 in such cases.
1121
1122 * test/test_load.py (TestAltPath): New, tests for alternative path feature
1123 in load_session()
1124 (Shapefile_CallBack): Helper, implements controllable callback.
1125
1126 * Thuban/UI/application.py (ThubanApplication.OnInit):
1127 Added "alt_path" to self.path
1128 (ThubanApplication.OpenSession): Added shapefile_callback as second
1129 callback similar to db_connection_callback.
1130 (ThubanApplication.run_alt_path_dialog): New, implementaion of
1131 shapefile_callback. In addition to raising the dialog the control of
1132 self.path('alt_path') is implemented here.
1133
1134 * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1135 (SessionLoader.open_shapefile): Open shapefile, eventually with
1136 alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1137 formerly used in start_fileshapesource()/start_layer().
1138 (SessionLoader.start_fileshapesource): Call open_shapefile().
1139 (SessionLoader.start_layer): Call open_shapefile().
1140 (load_session): Added shapefile_callback.
1141
1142 * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1143 feature (search / check).
1144
1145 * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1146
1147 2004-12-11 Bernhard Reiter <[email protected]>
1148
1149 svgexport 0.9.2: Point size supports for maps.
1150
1151 * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1152 (def draw_point_shape): new parameter size defaults to 2 as before.
1153 (draw_shape_layer_incrementally): Moved draw_func log line higher.
1154 Added draw_func call with size when dealing with a point layer.
1155
1156 * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1157
1158 2004-12-11 Bernhard Reiter <[email protected]>
1159
1160 Made sure that newlines are inserted in the svg path d attributes
1161 to raise the chance that the line length will be below 255 characters,
1162 as recommended by REC SVG 1.1 in section 8.3.1.
1163
1164 * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1165 Adding \n before L's and changed whitespace handling.
1166
1167 * Extensions/svgexport/test/test_svgmapwriter.py:
1168 Adapted tests to new whitespace handling of DrawPolygon.
1169
1170 2004-12-11 Bernhard Reiter <[email protected]>
1171
1172 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1173
1174 * Extensions/svgexport/test/test_svgmapwriter.py:
1175 Removed test_drawbezier in favour of new test_drawspline3 and
1176 test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1177 All only to test DrawSpline.
1178
1179 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1180 New implementation now really using the strange algorithm of
1181 xfig 3.1's approximated splines and its conversion to postscript
1182 with one twist: SVG can do quadratic beziers, so skipped translation
1183 to cubic beziers.
1184 (TestWithDC): Typo in comment fixed.
1185
1186 2004-12-09 Martin Schulze <[email protected]>
1187
1188 * Thuban/Model/classgen.py: Added missing character encoding
1189
1190 * Extensions/wms/properties.py (OpenWMSProperties): removed
1191
1192 * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1193 support for get_srs_discrepancies() since there are no
1194 discrepancies anymore (was a thinko)
1195
1196 * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1197 format priority now that more formats are supported globally by
1198 the render engine.
1199
1200 2004-12-08 Silke Reimer <[email protected]>
1201 * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1202 because it is not available in all versions of ogr
1203
1204 2004-12-08 Bernhard Reiter <[email protected]>
1205 * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1206 global tests until a real one is commited.
1207
1208 2004-12-07 Nina Hüffmeyer <[email protected]>
1209
1210 * /Extensions/ogr/: Adding a new extension to read shapefiles with
1211 ogr. It is planned to add other vector formats.
1212
1213 * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1214
1215 2004-12-07 Jan-Oliver Wagner <[email protected]>
1216
1217 * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1218 part of a (non-)fix to renable that the tests are always
1219 executed.
1220
1221 2004-12-07 Bernhard Reiter <[email protected]>
1222
1223 * Extensions/svgexport/test/test_svgmapwriter.py:
1224 Added test_drawbezier() to test DrawSpline().
1225
1226 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1227 Really implemented bezier drawing.
1228
1229 * Extensions/svgexport/__init__.py: Bumped version of svgexport
1230 to 0.9.1 because now the legend examples lines styles
1231 will be drawing with beziers.
1232
1233 2004-12-05 Martin Schulze <[email protected]>
1234
1235 * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1236 GIF as supported bitmap image formats (helpful for the WMS extension)
1237
1238 2004-11-30 Martin Schulze <[email protected]>
1239
1240 * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1241 Improved the test for the internal compare method
1242
1243 2004-11-27 Jan-Oliver Wagner <[email protected]>
1244
1245 * Thuban/UI/about.py (About.__init__): Added
1246 Norbert Solymosi for hungarian translation and Ole Rahn
1247 as contrbutor. Moved Bernhard Reiter from Contributor
1248 to Developer.
1249
1250 2004-11-27 Bernhard Reiter <[email protected]>
1251
1252 * Extensions/svgexport/test/test_svgmapwriter.py:
1253 Removed Jan from author list as he did not change enough significant
1254 lines yet.
1255
1256 * Extensions/svgexport/__init__.py: Added Bernhard as author
1257 of the Extension.
1258
1259 2004-11-27 Jan-Oliver Wagner <[email protected]>
1260
1261 * po/hu.po: New. Hungarian translation. Contributed
1262 by Norbert Solymosi.
1263
1264 2004-11-26 Bernhard Herzog <[email protected]>
1265
1266 * Extensions/svgexport/test/test_svgmapwriter.py
1267 (Testobjectexport.test_transparent_polygon): Commented out some
1268 debug prints
1269
1270 2004-11-24 Jan-Oliver Wagner <[email protected]>
1271
1272 Fix broken tests for svg extension and added svg legend
1273 to Experimental menu.
1274
1275 * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1276 the test run correctly even if the extension is a package.
1277 Also removed the "import Thuban" which makes no sense.
1278
1279 * Extensions/svgexport/__init__.py: Fix to have the extensions'
1280 test module also be executed from the global test routine.
1281 This is done by looking for the absense of the DISPLAY variable.
1282
1283 * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1284 to Experimental menu since this module has yet not reached a stable
1285 status (ie. 1.0).
1286
1287 2004-11-22 Bernhard Reiter <[email protected]>
1288
1289 * Extensions/svgexport/svgmapwriter.py:
1290 Added verbose variable and some logging depending on it.
1291 (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1292 because counting i is not necessary.
1293 (class Pen, class Brush): Added simple __str__ methods.
1294 (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1295 not exported to svg file) Note: holes still unhandled.
1296
1297 * Extensions/svgexport/test/test_svgmapwriter.py:
1298 Made a baseclass TestWithDC for test needed a DC.
1299 Added tests for bug #2698 (transparent polygons are not
1300 exported to svg file):
1301 Testobjectexport.test_transparent_polygon()
1302
1303 * Thuban/Model/base.py (UnsetModified):
1304 Fixed some typos in docstring.
1305
1306 * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1307 Added hints on the used algorithm for handling holes.
1308
1309 2004-11-20 Jan-Oliver Wagner <[email protected]>
1310
1311 Some face lifting for the examples.
1312
1313 * Examples/__init__.py: Make this directory a package.
1314
1315 * Examples/simple_extensions/__init__.py: Make this directory a package.
1316
1317 * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1318 menu to Examples menu.
1319
1320 * Examples/simple_extensions/simple_command.py: Some more comments,
1321 minor changes.
1322
1323 * Examples/simple_extensions/simple_tool.py: Minor changes.
1324
1325 2004-11-20 Jan-Oliver Wagner <[email protected]>
1326
1327 Changed way of extension registry for wms and added extension
1328 registry for umn_mapserver extension.
1329
1330 * Extensions/wms/__init__.py: Added registry entry and the importing
1331 of the actual wms module. Included a test for the required PyOGCLib.
1332
1333 * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1334
1335 * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1336 importing of the actual umn mapserver management modules.
1337 Included a test for the required Python MapScript.
1338
1339 2004-11-20 Jan-Oliver Wagner <[email protected]>
1340
1341 Changed way of extension registry for importAPR, bboxdump
1342 and added extension registry for svgexport.extension registry for
1343 svgexport.
1344
1345 * Extensions/importAPR/__init__.py: Added registry entry and the importing
1346 of the actual importAPR module.
1347
1348 * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1349 __init__.py).
1350
1351 * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1352 »···of the actual bboxdump module.
1353
1354 * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1355 »···__init__.py).
1356
1357 * Extensions/svgexport/__init__.py: Added registry entry and the importing
1358 of the svgsaver module.
1359
1360 * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1361 to Experimental menu since this module has yet not reached a stable
1362 status (ie. 1.0).
1363
1364 2004-11-18 Jan-Oliver Wagner <[email protected]>
1365
1366 Now the hit test considers the size of point symbols.
1367
1368 * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1369 'size' defaulting to the previously fixed value 5.
1370 Extended doc-string.
1371 (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1372 for symbols.
1373 Now the size of the largest point symbol is determined to find out
1374 about whether the point has been hit.
1375 This fixes the problem that only clicks inside a fixed distance of
1376 5 where found.
1377
1378 2004-11-17 Jan-Oliver Wagner <[email protected]>
1379
1380 Another open issue fixed regarding sizeable symbols: correct rendering of
1381 selected symbols.
1382
1383 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1384 Added consideration of the specific size of point symbols.
1385 The property for each point symbol is retrieved and the size applied
1386 for the rendering method.
1387 Added doc-string.
1388
1389 2004-11-16 Jan-Oliver Wagner <[email protected]>
1390
1391 Changed way of Extension Registry for gns2shp and profiling.
1392
1393 * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1394 __init__.py).
1395
1396 * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1397 of the actual gns2shp module.
1398
1399 * Extensions/profiling/profiling.py: Removed registry entry (moved to
1400 __init__.py).
1401
1402 * Extensions/profiling/__init__.py: Added registry entry and the importing
1403 of the actual profiling module.
1404
1405 2004-10-28 Bernhard Reiter <[email protected]>
1406
1407 * Extensions/svgexport/: Minor improvements to doc strings.
1408
1409 2004-10-07 Jan-Oliver Wagner <[email protected]>
1410
1411 Further elements for sizable point objects now
1412 making this feature usable though not yet complete.
1413
1414 * Thuban/Model/save.py (SessionSaver.write_classification): Write
1415 attribute 'size' for cldata when the shape layer is of point type.
1416 This also now make the test_load.py tests happy.
1417
1418 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1419 gradient.
1420
1421 * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1422 ID_SELPROP_SPINCTRL_LINEWIDTH.
1423 (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1424 (ID_SELPROP_SPINCTRL_SIZE): New Id.
1425 (SelectPropertiesDialog.__init__): Added a second spin control
1426 for the size in case the corresponding layer is of point type.
1427 (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1428 (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1429 (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1430 and refresh preview.
1431
1432
1433
1434 2004-10-04 Martin Schulze <[email protected]>
1435
1436 * Extensions/wms/test/test_parser.py
1437 (TestWMSCapabilitiesParser.test_compareLists): Added missing
1438 self-test for compareLists()
1439 (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1440 self-test for compareDicts()
1441 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1442 to verify the test routine fails with non-equal arguments
1443 (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1444 to verify the test routine fails with non-equal arguments
1445
1446 2004-10-03 Jan-Oliver Wagner <[email protected]>
1447
1448 First elements for sizeable point objects.
1449
1450 * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1451
1452 * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1453
1454 * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1455 of a corresponding argument is given.
1456 (TestSymbolSize): New. Test the size attribute of cldata.
1457
1458 * Thuban/Model/classification.py: Removed some trailing whitespaces.
1459 (ClassGroupProperties.__init__): Set default size.
1460 (ClassGroupProperties.SetProperties): Set the size.
1461 (ClassGroupProperties.GetSize): New. Return the size.
1462 (ClassGroupProperties.SetSize): New. Set the size.
1463 (ClassGroupProperties__eq__): Compare also size.
1464 (ClassGroupProperties__repr__): Print also size.
1465
1466 * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1467 the size attribute.
1468
1469 * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1470 Also, now there is a return value that indicates whether the drawing
1471 size exceeded the given rect extent and if so the new extent.
1472 Finally, point objects are drawn depending on the size. If either
1473 the width or height is exceeded, the new extent is returned.
1474 (ClassRenderer.Draw): Now when calling the previewer drawing function,
1475 evaluate the return value and, if not None, adapt the grid widget size
1476 accordingly and redraw again.
1477
1478 * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1479 If the draw function is for points, call it with the size as additional
1480 parameter.
1481 (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1482 the size. Compute the radius using the size.
1483
1484 * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1485 that Thuban supports size, apply this correctly.
1486
1487 * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1488
1489 2004-10-03 Jan-Oliver Wagner <[email protected]>
1490
1491 * Doc/manual/thuban-manual-de.xml: Started translation of
1492 Map chapter.
1493
1494 2004-10-01 Martin Schulze <[email protected]>
1495
1496 * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1497 argument for general use through properties-dialog selector
1498
1499 * Thuban/UI/classifier.py: Register properties dialog classes for
1500 both provided layer classes/types.
1501
1502 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1503 map can be retrieved through the parent which is passed to the
1504 constructor anyway and doesn't require an argument of its own,
1505 required for the unification of arguments for general use through
1506 properties-dialog selector.
1507 (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1508 whether a dialog is already opened (and raising it to the users
1509 attention) and creating a new dialog into a function of its own
1510 (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1511 method
1512 (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1513 global registration of properties dialog classes (which are indeed
1514 layer-specific).
1515
1516 * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1517 for general use through properties-dialog selector, the map can be
1518 retrieved through the parent and doesn't require an argument of
1519 its own.
1520
1521 * Extensions/wms/wms.py: Register the properties dialog class for
1522 the provided WMS layer
1523
1524 2004-09-28 Jan-Oliver Wagner <[email protected]>
1525
1526 New feature: Registry for Extensions.
1527
1528 * Thuban/UI/extensionregistry.py: This module defines a registry for
1529 Extensions.
1530
1531 * Thuban/UI/about.py (About.__init__): Added description
1532 of the registered extensions with all of the information.
1533
1534 * Thuban/Model/extension.py (Extension): Improved doc-string.
1535
1536 * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1537 Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1538 Extensions/wms/wms.py: Added registration of the extension.
1539
1540 2004-09-27 Bernhard Reiter <[email protected]>
1541
1542 More fixes to svgexport to make used ids unique and
1543 conforming to XML's Name production.
1544
1545 * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1546 test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1547 test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1548 Added Bernhard R. as author.
1549 * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1550 concatenation char now (makes test_make_ide_nosetbaseid() valid).
1551 Also transform second id part with "%d" and catch the TypeError
1552 to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1553 Corrected typo inBernhard's author line.
1554 (SetBaseID): Return the transformed base id. Transform characters
1555 which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1556 import binascii. If to be set string starts with "xml" or so, add "t".
1557 (draw_shape_layer_incrementally): use the returned value of SetBaseID
1558 for used_baseids checks.
1559
1560 2004-09-25 Bernhard Herzog <[email protected]>
1561
1562 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1563 Remove a debug print and some tab characters.
1564
1565 2004-09-25 Bernhard Reiter <[email protected]>
1566
1567 * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1568 (SetBaseID, SetID, make_id): Improved docstring comments to explain
1569 the interaction of the three functions and the XML id contrains.
1570
1571
1572 2004-09-23 Jan-Oliver Wagner <[email protected]>
1573
1574 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1575 Module.
1576
1577 * Doc/README: Added info on ThubanModel.xmi.
1578
1579 2004-09-23 Jan-Oliver Wagner <[email protected]>
1580
1581 * Doc/README: New. Some info about how to generate technical
1582 documentation from the source code.
1583 This text was send to the Thuban developer mailing list on
1584 September 21st 2004 by Bernhard Reiter.
1585
1586 2004-09-21 Bernhard Reiter <[email protected]>
1587
1588 Improved the svgexport to only use unique ids. Will issues
1589 an error message dialoge when two layer names are the same.
1590 ShapeIDs are now added with a dash within the svg ids.
1591
1592 * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1593 * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1594 (TestSVGRenderer): New test class with test_make_in() and
1595 test_check_for_layer_name_clash()
1596 * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1597 and draw_shape_layer_incrementally() to not use a baseid twice,
1598 satisfying test_check_for_layer_name_clash()
1599 (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1600 test_make_in().
1601 * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1602 and wxICON_HAND.
1603 (write_to_svg): Put dc and rendering in a try statement and on
1604 catching SVGmapWriterError notify the user and delete the target file.
1605
1606 2004-09-20 Bernhard Reiter <[email protected]>
1607
1608 * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1609
1610 2004-09-03 Jan Schüngel <[email protected]>
1611
1612 * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
1613 small bug with the line color. Now the line color will now only set
1614 if it is set in Thuban an not Transparent.
1615
1616 * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
1617 deleting the layers from mapfile. Now all layers will delete backwards
1618 from the last.
1619
1620 2004-08-20 Silke Reimer <[email protected]>
1621
1622 * Thuban/Model/layer.py:
1623 Fixes bug in projection handling: Otherwise very large region might not
1624 have valid values in the layer's projection.
1625
1626 2004-08-20 Silke Reimer <[email protected]>
1627
1628 * Thuban/UI/about.py:
1629 small changes to be consistent with coding style.
1630
1631 2004-08-13 Martin Schulze <[email protected]>
1632
1633 * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
1634 Adjusted a comment
1635
1636 2004-08-11 Silke Reimer <[email protected]>
1637
1638 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
1639 too many and too enhanced imports of locale
1640
1641 2004-08-10 Silke Reimer <[email protected]>
1642
1643 * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
1644 function unicodeToLocale() to convert special characters to users
1645 locale encoding
1646
1647 2004-08-10 Jan-Oliver Wagner <[email protected]>
1648
1649 * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
1650 lower case letter'
1651
1652 2004-08-09 Jan Schüngel <[email protected]>
1653
1654 * ChangeLog: Rewrite the last ChangeLog entry to follow
1655 the standard way.
1656
1657 * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
1658 the function where it is needed, because it don't works if it stands
1659 at the beginning.
1660 (MF_Layer.__init__): Removed the extra numclassed variable. Now
1661 numclasses from the mapscript will be used.
1662 (MF_Layer.get_index): New. Return the index of the layer in mapfile.
1663 (MF_Layer.set_classes): New. A Classlist will be set to the layer.
1664 (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
1665 (MF_Layer.remove_allclasses): New. All class of the layer will remove.
1666 (MF_Map.create_new_layer): New. A new Layer is created and associated
1667 with the mapscript object.
1668 (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
1669 the mapscript.
1670 (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
1671 linked to the layer in thuban, else the layerobject linked to the
1672 thubanlayer will be used.
1673 AnnotationLayer will now store the filename of the shapefile.
1674 (MF_Map.remove_layer): If a layer is removed the associated object
1675 must be set new.
1676
1677 * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
1678 layers which are exists in thuban to the mapobj. All removed Layers
1679 will be removed from the mapobj.
1680 Added comments to all functions.
1681 (thuban_to_map): No layer will be removed here.
1682
1683 * Extensions/umn_mapserver/mf_handle.py
1684 (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
1685 Layersettings for the mapserver kann be edited.
1686
1687 * Extensions/umn_mapserver/mf_import.py: Now all layers which are
1688 imported, will be linked with the associated MF_Layer.
1689 (import_mapfile): All layers, which are not selected, will be removed.
1690 Disable the "import layer from mapfile" menu option.
1691
1692 * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
1693 Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
1694 layer on permanently.
1695
1696 2004-08-03 Jan Schüngel <[email protected]>
1697
1698 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1699 New. This function removes all metadata
1700 (MF_Layer.set_group): New. Set the group setting.
1701 (MF_Layer.get_group): New. Get the group setting.
1702 (MF_Map): Removed the extra numlayers variable, used the mapscript
1703 parameter instead.
1704 (MF_Map.get_numlayers): New. This get numlayers.
1705 (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1706 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1707 if the object is an instance. Also added the annotation layer here to
1708 export, but only the layer is created in the mapfile.
1709
1710 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1711 the check if a mapobj exist, because its not needed anymore. The
1712 export function is only available if a mapobj exist.
1713 Use the new function to remove all layers.
1714
1715 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1716 option and the metadata button. The layer dialog is temporary disabled.
1717 (Metadata_CustomDataTable): Added some functions to show the grid
1718 correct.
1719
1720 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1721 the number of layer from import_mapfile to this function.
1722 (AnnotationLayer): New. This Class shows the Annotation layer in
1723 thuban. The layer don't do anything. It's only to show the layer
1724 and to save the layer order.
1725 (add_annotationlayer): New. Import an annotation layer to thuban.
1726 (select_layer2import): New. Import only layers to thuban and not
1727 the other settings like projection or scalebar.
1728 (create_new_mapfile): Moved the _has_umn_mapobj function and the
1729 create_new_mapfile functions from mf_handle.py to mf_import.py.
1730
1731 * Extensions/umn_mapserver/sample/iceland.map: Added the group
1732 parameter to the roads and cultural layers. Also added a new
1733 Annotation Layer for the cultural points.
1734
1735 * Extensions/umn_mapserver/sample/iceland.html: Added the select
1736 option for the annotation layer.
1737
1738 * Extensions/umn_mapserver/sample/index.html: Added the start
1739 parameter for the annotation layer.
1740
1741 2004-08-01 Jan-Oliver Wagner <[email protected]>
1742
1743 * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1744 translation completed.
1745
1746 * Doc/manual/thuban-manual.xml (Chapter Session Management):
1747 Fixed unprecise description for Save Session.
1748
1749 2004-07-31 Jan-Oliver Wagner <[email protected]>
1750
1751 Started translation of Users Manual into german.
1752
1753 * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1754
1755 * Doc/manual/Makefile: Added build instructions for german
1756 users manual.
1757
1758 * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1759
1760 2004-07-28 Jan Schüngel <[email protected]>
1761
1762 * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1763 functions. Now all metadata will handle by the function and its not
1764 needed to initialize it from outside. Therefor the associated mapobj
1765 will be stored in the Metadata Object. So we can use the special
1766 functions from the associated mapobj to get the Metadata.
1767 Therefor all initialization code for the metadata is removed from the
1768 other classes.
1769 (MF_Layer): Added a function to get the metadata object.
1770 (MF_Map): Added a function to set the mappath, the path where
1771 the mapfile ist stored.
1772
1773 * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1774 to set the extent in the mapfile. Now the code is set by the displayed
1775 data in the Thuban-view.
1776 (export_mapfile): The shapepath is now set empty, until relative
1777 pathnames are supported.
1778
1779 * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1780 metadata. Yet only mapfile metadata are supported. Layer and class
1781 supported are not implemented.
1782 Added a dialog to handle layer informations. The dialog only shows the
1783 selected layer at the moment.
1784
1785 * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1786 code for setting the extent in thuban. Now the extent is set to the
1787 given extent from the mapfile.
1788 Fixed a logical mistake. Now the extent is set when realy a layer is
1789 loaded, and not if one is selected to load.
1790
1791 * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1792 move the shown map in the browser.
1793
1794 * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1795 line to the mapobj and added metadata to the political layer.
1796
1797 * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1798 for Metadata.
1799
1800 2004-07-26 Martin Schulze <[email protected]>
1801
1802 * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1803 ClassMapper
1804
1805 * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1806 case for the new ClassMapper
1807
1808
1809 2004-07-22 Bernhard Herzog <[email protected]>
1810
1811 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1812 visible extent of the map in projected coordinates
1813
1814 * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1815 (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1816 tests.
1817 (SimpleViewPortTest.test_visible_extent): New. The real test for
1818 VisibleExtent()
1819
1820 2004-07-22 Bernhard Herzog <[email protected]>
1821
1822 * test/test_viewport.py: Use support.run_tests as the main
1823 function when running asa script.
1824
1825 2004-07-22 Jan Schüngel <[email protected]>
1826
1827 * Extensions/umn_mapserver/mf_export.py: Added "import os"
1828 Removed the old "import Thuban.UI.mainwindow" code.
1829 (tbextent_to_map): Removed the extra function and at the code direct
1830 to "thuban_to_map" function.
1831 (write_creatorcomment): Added. Now a short comment is added to the
1832 beginning of an generated mapfile.
1833 (export_mapfile): Now the Path and filename are saved in to variables,
1834 and not together in one variable. This is needed for the new
1835 write_creatorcomment function.
1836
1837 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1838 import module "re". Also added Range and the ClassGroupRange import
1839 from Thuban. Both are needed for the new range expression import.
1840 (create_rangeexpression): Added. Creates a Range Expression in Thuban
1841 style from a given mapfile expression.
1842 (added_rasterlayer): Make some small code changes. The shapepath is
1843 now stored in an extra variable and the clazz_name is set empty if no
1844 class name set in the mapfile.
1845 Changed the Error message for Range Expressions, becaus the new
1846 function create a error string which will be shown in the dialog.
1847
1848 * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1849 range expression import.
1850
1851 2004-07-21 Jan-Oliver Wagner <[email protected]>
1852
1853 * Extensions/umn_mapserver/README: Added hint that
1854 installation as root can be avoided. Removed all tabs.
1855
1856 2004-07-16 Bernhard Herzog <[email protected]>
1857
1858 * test/test_viewport.py
1859 (ViewPortTest.test_changing_map_projection): Check that changing
1860 the projection of an empty map shown in a viewport doesn't lead to
1861 exceptions in the viewport's handler for the
1862 MAP_PROJECTION_CHANGED messages
1863
1864 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1865 try to keep the same region visible when the map actually contains
1866 something
1867
1868 2004-07-15 Jan Schüngel <[email protected]>
1869
1870 * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1871 mappath directly from the mapobj. Is needed because of the changes
1872 in mf_import.py.
1873 (MF_Layer.add_thubanclass): Added a new comment.
1874 (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1875 mapobj is empty there is no extent get from thuban an so no one can
1876 set to th mapobj.
1877
1878 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1879 the discription.
1880 Split the funktion in to three smaller ones. The new functions are
1881 add_rasterlayer, add_polygonlayer and select_layer2import.
1882 Removed the mapfilepath and filepath initialisation, because its know
1883 include in the new functions.
1884 Now nothing will be imported if cancel is pressed in the
1885 layer choice dialog.
1886
1887 2004-07-14 Jan Schüngel <[email protected]>
1888
1889 * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1890 import.
1891 (MF_Symbolset): Removed the extra variable for numsymbols.
1892 (MF_Class.__init__): Added a comment to the exception clause.
1893 Removed the extent init, because it was not needed anymore.
1894 (MF_Layer.add_thubanclass): Added the code to set the class name to
1895 the expression value from thuban if no label is defined.
1896 Added the code to export Range expressions from thuban to the mapfile.
1897 (MF_Map.set_extent): Removed the exception and replace it by some if
1898 code. If the size of a map is not defined the size will be set to 1,1.
1899 This is necessary because if the extent is set, mapscript checks if
1900 the size is greater than zero.
1901 (MF_Web): Added the get and set function for the template.
1902
1903 * Extensions/umn_mapserver/mf_export.py: Added the function to check
1904 if a mapobject exists and used it to set the status of the menu items.
1905 If no mapfile exists the settings could not be edditied.
1906 Define after which menuitem the exportitem will include.
1907
1908 * Extensions/umn_mapserver/mf_handle.py: Removed the import
1909 Thuban.UI.mainwindow clause, because it is not needed.
1910 Added the command Refresh() to all "OnChangeColor()" functions,
1911 because the color preview window was not updated on a color change.
1912 Added the function to check if a mapobject exists and used it to set the
1913 status of the menu items. If no mapobject exists the settings could not
1914 be edditied.
1915 (Map_Dialog): Moved the imagetype selector from the
1916 Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1917 (Web_Dialog): Removed the name label and added the template textbox.
1918
1919 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1920 the exception handling on loading the layers by an if statement. It
1921 is not necessary to us the exception there.
1922 The Filepath creation now use os.path.join to build the path.
1923
1924 * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1925 definition from global to the setUp function. Now the testMap will
1926 initialize new on each test.
1927
1928 * Extensions/umn_mapserver/sample/iceland.map: Include three new
1929 classes in the Line Layer, to test logical Expressions.
1930 Set the status of the class "Point9" in the Point Layer to off
1931
1932 2004-07-13 Bernhard Herzog <[email protected]>
1933
1934 * Thuban/UI/baserenderer.py
1935 (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1936 optimization that tries not to draw layers under a raster layer.
1937 The bug was harmless. All it effectively did was to produce The a
1938 strange messages about not being able to draw Layer instances for
1939 all vector layers below a raster layer which would be invisible
1940 anyway because the raster layer currently always covers the entire
1941 window
1942
1943 2004-07-08 Jan Schüngel <[email protected]>
1944
1945 * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1946 a list of supported outputformats. This formats are not alle supported
1947 because there is no possibility to get the outputformat without the
1948 name known. Make some formal changes to the code.
1949 (MF_Map.set_name()): Fixed a bug if the name is None.
1950
1951 * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1952 statement, because its not needed anymore. The Outputformat is now
1953 given as string from the object. Make some formal changes to the code.
1954
1955 * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1956 most of the new setting which were added during the last changes.
1957 Removed the MF_Size Test.
1958
1959 * Extensions/umn_mapserver/test/test.map: Added a new class to the
1960 cultural Layer to test expressions and the the status of that layer
1961 from on to default.
1962 Changed the data path the the correct Thuban Data
1963 Added the Outputformat Object and Symbol Object
1964
1965 2004-07-07 Jan Schüngel <[email protected]>
1966
1967 * Extensions/umn_mapserver/mapfile.py: Added some new
1968 settings to edit (outputformat, label, imagetype)
1969
1970 * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1971 the Label Dialog and add the OutputDialog.
1972 Make some changes to the code order.
1973
1974 2004-07-06 Jan Schüngel <[email protected]>
1975
1976 * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1977 and line Obj and add the scalebar_status_type, scalebar_style_type and
1978 scalebar_position_type.
1979 Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1980 are only used to create a Symbol like the circle in Thuban.
1981 Added the scalebarObject (MF_Scalebar)
1982 (MF_Class): Added set_status and get_status.
1983 (MF_Layer.add_thubanclass): Added code to set the class status
1984 (MF_Map): Added code to handle the symbols and scalebar
1985 (MF_Label): Added the set_partials and get_partials functions
1986
1987 * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1988 from mapfile. Added a function to create a circle object like the one
1989 from thuban if no one exists.
1990
1991 * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1992 press ok in the assosiated dialog and not at the end of the
1993 colordialog.
1994 Added the Dialog for the Scalebar.
1995 (Label_Dialog): Added the offset option
1996
1997 * Extensions/umn_mapserver/mf_import.py: Added code to import the
1998 status of the Classes.
1999 Fixed a bug with the projection. Now the to_meter parameter will be
2000 added to the Projection only if it doesn't exists.
2001
2002 2004-07-01 Jan Schüngel <[email protected]>
2003
2004 Added the functionality to handle the content thuban is not
2005 able to handle directly.
2006
2007 * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2008 Thuban with the possibility to edit the mapfile content.
2009
2010 * Extensions/umn_mapserver/mf_import.py: Added the possibility
2011 to import mapfiles without any layer selected. So it is possible
2012 to edit the other settings in a mapfile.
2013 (import_mapfile): Added code to use the editing functions.
2014 Added the possibility to import the projection to a layer if one
2015 is defined.
2016 Status settings (On,Off) will now set in thuban (visible, invisible).
2017 fixed a bug with with classnames. If no classname is set in mapfile
2018 the value in Thuban will set to the expression.
2019
2020 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2021 possibility to save a new mapfile or use the old one which is
2022 imported or new created.
2023 Added code to use the editing functions.
2024 Remove some not needed import statements
2025
2026 * Extensions/umn_mapserver/mapfile.py: Added new types which are
2027 need for the editing functions.
2028 Added needed set-functions for the editing functions.
2029 Added the possibility to export rasterimages.
2030 Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2031 MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2032 moment.
2033 (MF_Class.set_thubanstyle): Now point layers will set to a default
2034 symbol to show a circle in mapserver and not only a 1px dot.
2035 (MF_Style.__init__): Fixed a bug with the color. Color was not set
2036 correct before.
2037 (MF_Size): Removed, because it is not needed.
2038
2039 * Extensions/umn_mapserver/README: Added the hints to use the
2040 export and editing functions, too.
2041
2042 * Extensions/umn_mapserver/sample/iceland.map: Added the
2043 new parameter "UNITS METERS".
2044 Change the political layer to status OFF.
2045
2046 * Extensions/umn_mapserver/sample/README: Added some
2047 more details to setup the sample in the MapServer.
2048
2049 2004-06-26 Bernhard Reiter <[email protected]>
2050
2051 * Extensions/svgexport/test/test_svgmapwriter.py:
2052 Removed class VFile and used standard StringIO instead.
2053
2054 2004-06-23 Jan Schüngel <[email protected]>
2055
2056 Add the export function to the umn_mapserver extension.
2057
2058 * Extension/umn_mapserver/mf_export.py: New. This module extents
2059 Thuban with the possibility to export the Thuban content.
2060
2061 * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2062 with the export module. Especially added the possibility to
2063 add thuban objects directly to the map objects.
2064
2065 * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2066 because of the hint from Bernhard Herzog.
2067 Corrected the handling of absolute pathnames.
2068 Changed the Text of the Menu-Item, now the beginning is upper case.
2069
2070 * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2071
2072 2004-06-16 Jan Schüngel <[email protected]>
2073
2074 Add a sample and make some changes.
2075
2076 * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2077 import from * to explicit used statements. Changed the
2078 Thuban.UI.mainwindow import phrase, too.
2079 (import_mapfile):Corrected a clerical mistake.
2080 Added wxCHANGE_DIR in OpenFile Dialog.
2081 Added a MultipleChoiceDialog, to select the layers to load from
2082 mapfile into thuban. Thereby the projection is only set if one layer
2083 is selected.
2084 Added the possibility to handle relative pathnames which uses
2085 up-level references.
2086 Removed some doubled code.
2087 Corrected an error with integer values used as label in thuban
2088 ClassGroup.
2089
2090 * Extensions/umn_mapserver/sample: New.
2091
2092 * Extensions/umn_mapserver/sample/README: New. Describes the
2093 usage of the sample files.
2094
2095 * Extensions/umn_mapserver/sample/iceland.map: New. This is
2096 a suitable .map-file for the iceland data.
2097
2098 * Extensions/umn_mapserver/sample/index.html: New. The template
2099 for the mapfile.
2100
2101 * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2102 file for the Iceland Application on web.
2103
2104 * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2105 some details.
2106
2107 * Extensions/umn_mapserver/test/test_mapserver
2108 (mapserver_import_Test_generalClasses.test_MF_Color):
2109 Corrected the thubancolor test.
2110
2111 2004-06-15 Jan Schüngel <[email protected]>
2112
2113 * Extensions/umn_mapserver/README: New. Install instruction.
2114
2115 2004-06-14 Bernhard Reiter <[email protected]>
2116
2117 * libraries/thuban/cpl_mfile.h: Added copyright header.
2118
2119 * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2120 Free Software License so that it is most useful with gdalwarp
2121 and bmpdataset.
2122
2123 2004-06-14 Bernhard Herzog <[email protected]>
2124
2125 * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2126 import of wxPython.wx itself (as opposed to the contents of
2127 wxPython.wx). For some reason wxPython.wx is available as
2128 wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2129 wrt. wxPython 2.4.
2130
2131 2004-06-10 Jan Schüngel <[email protected]>
2132
2133 Initial version of new extension "umn_mapserver". This extension aims
2134 to manage configuration for the UMN MapServer application. This
2135 inital version just imports the .map-files and displays all, Thuban is
2136 capable of.
2137
2138 * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2139
2140 * Extensions/umn_mapserver/test/README: New. Describes how to run the
2141 tests.
2142
2143 * Extensions/umn_mapserver/test/test.map: New. This is a test
2144 .map-file for automated tests of the umn_mapserver extension of
2145 Thuban.
2146
2147 * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2148 UMN Mapserver classes.
2149
2150 * Extensions/umn_mapserver/__init__.py: New. Init to make this
2151 directory a package.
2152
2153 * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2154 '.map'-file objects.
2155
2156 * Extensions/umn_mapserver/mf_import.py: New. This module extends
2157 Thuban with the possibility to handle UMN MapServer mapfiles.
2158
2159 2004-06-03 Bernhard Herzog <[email protected]>
2160
2161 * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2162 to a tuple before using it as arguments to the % operator. This
2163 fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2164 reported today on thuban-list by Jan Schüngel
2165
2166 * test/test_layer.py (TestLayerModification.setUp): Save the
2167 filename as an instance variable so we can refer to it in tests
2168 (TestLayerModification.test_tree_info): Uncomment this method
2169 again and make it work. This tests for the formatting issue
2170 filed in RT#2239 on 2004-01-13
2171
2172 2004-05-28 Bernhard Herzog <[email protected]>
2173
2174 * Thuban/UI/baserenderer.py: Fix some typos.
2175
2176 2004-05-18 Jan-Oliver Wagner <[email protected]>
2177
2178 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2179 by increasing a field size.
2180
2181 2004-05-17 Bernhard Herzog <[email protected]>
2182
2183 Update to newest shapelib and get rid of Thuban specific
2184 extensions, i.e. use the new DBFUpdateHeader instead of our
2185 DBFCommit kludge
2186
2187 * libraries/shapelib/shpopen.c: Update to version from current
2188 shapelib CVS.
2189
2190 * libraries/shapelib/shapefil.h: Update to version from current
2191 shapelib CVS.
2192
2193 * libraries/shapelib/dbfopen.c: Update to version from current
2194 shapelib CVS.
2195 (DBFCommit): Effectively removed since shapelib itself has
2196 DBFUpdateHeader now which is better for what DBFCommit wanted to
2197 achieve.
2198 We're now using an unmodified version of dbfopen.
2199
2200 * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2201 value '1' to the Lib.dbflibc extension. This simply reflects the
2202 shapelib and pyshapelib updates
2203
2204 2004-05-16 Jan-Oliver Wagner <[email protected]>
2205
2206 Finished introduction of Menu.FindOrInsertMenu.
2207
2208 * Extensions/drawshape/drawshape.py: Add the command
2209 to the experimental menu additionally to the toolbar.
2210
2211 * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2212 finding menu on its own.
2213
2214 * Doc/manual/thuban-manual.xml: updated sample file
2215 to use FindOrInsertMenu().
2216
2217 * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2218 instead of finding menu on its own.
2219
2220 2004-05-11 Jan-Oliver Wagner <[email protected]>
2221
2222 * test/test_menu.py (MenuTest.test): Added testing
2223 of method Menu.FindOrInsertMenu.
2224
2225 2004-05-10 Jan-Oliver Wagner <[email protected]>
2226
2227 Introduce and use Menu.FindOrInsertMenu.
2228
2229 * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2230 given menu or, if not found, insert it.
2231
2232 * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2233 /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2234 /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2235 menu on its own.
2236
2237 2004-05-06 Jan-Oliver Wagner <[email protected]>
2238
2239 Introduce a abstract ColorDialog class and remove
2240 and outdated file.
2241
2242 * Thuban/UI/proj4dialog.py: Removed. It is has been
2243 replaced by projdialog for quite a while and is not used
2244 anymore.
2245
2246 * Thuban/UI/colordialog.py: New. Abstraction for color selection
2247 dialog(s).
2248
2249 * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2250 Now calls the abstract ColorDialog instead of wxColourDialog.
2251 This also removed the dependency to Color class conversion
2252 from this function.
2253
2254 2004-05-04 Frank Koormann <[email protected]>
2255
2256 * Extensions/bboxdump/__init__.py: Fixed string left over from
2257 copying.
2258
2259 * Extensions/bboxdump/bboxdump.py (bboxdump):
2260 Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2261 xrange(layer.NumShapes()). Compile the bboxmessage from a list
2262 of formatted outputs (string.join) instead of appending to the
2263 message. Two progress bar dialogs to report progress on the sometimes
2264 lenghty processing.
2265
2266 2004-04-22 Frank Koormann <[email protected]>
2267
2268 New Extension to dump bounding boxes of all shapes of the selected
2269 layer. An optional column can be specified to group the objects,
2270 in this case the bounding box is a union of the separate boxes.
2271 Dump can be displayed in a ScrolledMessageDialog or written to file.
2272 The Extension is simply a combination of available and well tested
2273 Thuban functionality.
2274
2275 * Extensions/bboxdump/__init__.py: New: Init to make this
2276 directory a package.
2277
2278 * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2279 all shapes of the selected layer.
2280
2281 2004-04-22 Jan-Oliver Wagner <[email protected]>
2282
2283 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2284 strings to be i18n now.
2285
2286 2004-04-18 Jan-Oliver Wagner <[email protected]>
2287
2288 Changing popup menu of legend from direct building
2289 to using the Menu construction as used for the mainwindow.
2290
2291 * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2292 layer_to_bottom, layer_visibility
2293 (MainWindow.LayerToTop): New. Put current layer to the top.
2294 (MainWindow.LayerToBottom): New. Put current layer to bottom.
2295 (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2296 Replace 1,0 by True, False.
2297 (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2298 current layer.
2299 (MainWindow.LayerShowTable): Removed raising of dialog.
2300 (_has_selected_layer_visible): New. Support function.
2301
2302 * Thuban/UI/legend.py: ID_POP_xxx: removed.
2303 (LegendPanel.__init__): Removed EVT_MENU bindings.
2304 (LegendTree._OnRightClick): Replace direct creation of
2305 menu via wx Classes by applying the menu definition
2306 as of Menu class of menu.py.
2307
2308 2004-04-16 Jan-Oliver Wagner <[email protected]>
2309
2310 * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2311 button string to stronger clearify that Thuban will be closed when hitting
2312 the button.
2313
2314 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2315 Now for layers without a ShapeStore a corresponding message is given
2316 to the user, that this layer has no table to show.
2317
2318 2004-04-15 Martin Schulze <[email protected]>
2319
2320 * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2321 recalculate the format for the internal render engine as well.
2322
2323 * Extensions/wms/properties.py (wmsProperties): First start for a
2324 properties dialog. It's functional for a first selection of
2325 layers, but still has some weired wxWidgets/GTK problems but
2326 beautification can be done later.
2327
2328 * Extensions/wms/layer.py: Added more documentation
2329 (WMSLayer.getFormats): New: Return list of supported image formats
2330 by the WMS server
2331 (WMSLayer.getLayers): New: Return the list of layer names
2332 supported by the WMS server
2333 (WMSLayer.getLayerTitle): New: Return the title of the named layer
2334 (WMSLayer.getWMSFormat): New: Return the image format that is used
2335 for WMS GetMap requests
2336 (WMSLayer.setWMSFormat): New: Set the image format that is used
2337 for WMS GetMap requests
2338 (WMSLayer.__init__): Move away from using only one layer to using
2339 a list of layers (unsorted at the moment, though).
2340 (WMSLayer.getVisibleLayers): New: Return the list of names for all
2341 visible layers
2342 (WMSLayer.setVisibleLayers): New: Set the list of names for all
2343 visible layers
2344
2345 * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2346 order to establish a clean structure.
2347
2348 * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2349 own in order to establish a clean structure.
2350
2351 2004-04-13 Martin Schulze <[email protected]>
2352
2353 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2354 support for oldstyle (WMS 1.0 apparently) image format
2355 specification.
2356
2357 * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2358 supported graphic formats back to JPEG and BMP, PNG and others are
2359 too *cough* experimental... Sorry, I meant to filter this out
2360 before I committed this part. This should make the WMS extension
2361 run from CVS again.
2362 (wms_dialog): Reset an empty URL to None so that the subsequent
2363 program can depend on this, since the dialog will indeed return an
2364 empty URL, causing another declaration of love by Python.
2365
2366 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2367 Whenever a native BoundingBox request cannot be fulfilled, check
2368 whether the requested SRS is EPSG:3426, in which case return the
2369 LatLonBoundingBox values.
2370
2371 * Extensions/wms/test/test_parser.py
2372 (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2373 ignoring AUTO:* SRS.
2374 (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2375 Added another test method to test whether the LatLonBoundingBox
2376 values will be returned if BoundingBox values are requested with
2377 SRS set to EPSG:3426.
2378
2379 * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2380 Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2381 the moment by placing them into a variable which is currently
2382 unused. Also test whether the EPSG SRS is numerical as it should
2383 be and add an error message if it is not.
2384
2385 * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2386 appear in the real world as well. Since we cannot handle them yet
2387 (OGCLib can't either), we will ignore them for the moment.
2388
2389 * Extensions/wms/parser.py: Use a variable for denoting the sample
2390 filename
2391 (WMSCapabilitiesParser.peekLayers): Added support for error
2392 messages during grok(). They will be aggregated in an array and
2393 may be displayed later. We may have to add a classification
2394 "Warning" and "Error" to this. That requires more experience,
2395 though, since not every error may be lethal.
2396
2397 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2398 ShowTable() dialog/frame when the user attempts to display it
2399 while it has been opened before already and not closed again.
2400
2401 2004-04-11 Martin Schulze <[email protected]>
2402
2403 * Extensions/wms/infodialog.py: Adjusted the class documentation
2404
2405 * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2406 Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2407 wxWidgets variants.
2408 (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2409
2410 * Extensions/wms/infodialog.py: Added an information dialog that
2411 will display various information about the WMS current resource,
2412 so that additional information such as the title, the abstract,
2413 fees and access constraints can be displayed for the user if they
2414 are documented in the WMS XML.
2415
2416 2004-04-10 Martin Schulze <[email protected]>
2417
2418 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2419 string handling. It's "foo".lower() and not lower(foo) without
2420 lower imported from strings or something.
2421
2422 * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2423 from capabilities.py and parser.py. Implement priority list for
2424 supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2425 and GIF are supported here, but not yet by main Thuban. Hence,
2426 support for them may be removed later. Special contribution to
2427 usability: get wxWidgets to change the cursor when we're waiting
2428 for data from the network so the user won't start to worry. This
2429 causes a redrawing error/warning, though.
2430
2431 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2432 the DOM object.
2433
2434 2004-04-01 Martin Schulze <[email protected]>
2435
2436 * Extensions/wms/capabilities.py: Adjusted documentation
2437 (WMSCapabilities.__init__): Improved documentation, fixed syntax
2438 (WMSCapabilities.saveCapabilities): Only catch IOError when
2439 handling files
2440 (WMSCapabilities.loadCapabilities): Only catch IOError when
2441 handling files
2442 __main__: corrected variable naming
2443 (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2444 class a specialisation of WMSCapabilitiesParser as well. Also
2445 execute grok() after loading or fetching capabilities, if that
2446 went well, so that subsequent calls can already access the data.
2447 (WMSCapabilities.getVersion): Export the used version of the
2448 GetCapabilities request, so we can use it for subsequent calls,
2449 i.e. for GetMap requests.
2450 (WMSCapabilities.fetchCapabilities): Added proper error handling
2451 when the GetCapabilities request failed, so that the surrounding
2452 program can act accordingly.
2453
2454 2004-03-30 Martin Schulze <[email protected]>
2455
2456 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2457 Adjusted the getLayerSRS method to return the list of SRSes
2458 extracted from <SRS> elements instead of <BoundingBox> elements.
2459 Added a bit of documentation as well.
2460 (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2461 since it was only implemented due to a misunderstanding.
2462
2463 * Extensions/wms/test/test_parser.py
2464 (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2465 reflect the corrected interpretation of the standard: i.e. a layer
2466 does not have to define a BoundingBox for all SRSes it supports.
2467 Hence the <SRS></SRS> specification is authoritative, not the list
2468 of BoundingBoxes.
2469 (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2470 to ensure None is returned for a non-existing SRS.
2471 (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2472 since it is not applicable anymore. Listing more SRSes in <SRS>
2473 elements is valid according to the specs.
2474
2475 2004-03-26 Bernhard Reiter <[email protected]>
2476
2477 * README: Nicer formatting of text. Improved descriptions.
2478 Reflected wxWidgets name change.
2479
2480 * Thuban/UI/about.py: Extended copyright to 2004 and added
2481 information about the thuban-devel mailinglist.
2482
2483 2004-03-24 Martin Schulze <[email protected]>
2484
2485 * Extensions/wms/capabilities.py: Renamed the class to contain
2486 'WMS', also added a linebreak where required
2487
2488 * Extensions/wms/parser.py: Finally added the XML parser for the
2489 GetCapabilities response.
2490
2491 * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2492 <SRS> elements match the <BoundingBox> elements, except for the
2493 layer 'beschriftung'.
2494
2495 * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2496 since Python uses unicode strings internally, otherwise
2497 comparisons will fail. Removed tests for getLayerBBoxSRS() since
2498 the SRS will be calculated anyway and this method is obsoleted by
2499 getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2500 Move loading the sample file into the setUp method. Added a test
2501 for finding the integrity problem in the sample response.
2502 Improved formatting.
2503
2504 * Extensions/wms/domutils.py: Added convenience routines for
2505 handling of Document Object Model (DOM) nodes.
2506
2507 * Extensions/wms/test/test_domutils.py: Added a test for the
2508 domutils module
2509
2510 2004-03-19 Martin Schulze <[email protected]>
2511
2512 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2513 Moved path detection and adding into a module of its own,
2514 adjustpath, which exports thubandir as main Thuban directory.
2515
2516 * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2517 detection and adding into a module of its own, adjustpath, which
2518 exports thubandir as main Thuban directory. Reorganised the
2519 module in order to support the SkipTest feature for Thuban test
2520 cases.
2521
2522 * Extensions/wms/test/adjustpath.py: Moved path detection and
2523 adding into a module of its own.
2524
2525 2004-03-18 Martin Schulze <[email protected]>
2526
2527 * Extensions/wms/test/test_parser.py: Added another test for
2528 checking whether the WMS XML parser (to be implemented) returns
2529 the information we expect. This requires a sample WMS WML file
2530 (sample.xml) which has been extracted from the frida server and
2531 "improved" manually.
2532
2533 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2534 main Thuban directory to the path in order to be able to import
2535 random modules. Adjusted the PyOGCLib detection to reuse the
2536 information gathered. Also added a note about the PYTHONPATH
2537 environment variable.
2538
2539 * Extensions/wms/test/test_ogclib.py: The format specification is
2540 a mime-type, not a graphic format, hence image/jpeg wou ld be the
2541 proper format and not JPEG. We'll also have to take care of the
2542 encoding of / as %2F.
2543
2544 2004-03-16 Martin Schulze <[email protected]>
2545
2546 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2547 comprehensive test for the getMapURL method, built compare URLs
2548 according to the documentation in OGC 01-068r3
2549
2550 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2551 class WMSCapabilities to manage capabilites, will incorporate
2552 parsing the capabilities response and provide details for other
2553 classes.
2554
2555 2004-03-12 Bernhard Herzog <[email protected]>
2556
2557 Support views in addition to normal tables in the postgis
2558 shapestore
2559
2560 * Thuban/Model/postgisdb.py
2561 (PostGISShapeStore._fetch_table_information): Add a fallback for
2562 the case where the table name is not in the geometry_columns
2563 table. This is usually the case for views. Also, set
2564 self.shapestore here.
2565 (PostGISShapeStore.ShapeType): No need to query the database all
2566 the time. The shape type is now determined in
2567 _fetch_table_information
2568
2569 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2570 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2571 New parameter to specify views.
2572 (PostGISDatabase.has_data): Also compare the views. New views
2573 parameter
2574 (PostGISDatabase.initdb): Create the views.
2575 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2576 view
2577
2578 * test/test_postgis_db.py
2579 (TestPostGISShapestorePointFromViews): New. Test a
2580 PostGISShapeStore with a view
2581 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2582 the geometry_column explicitly to test whether that works
2583
2584 2004-03-12 Bernhard Herzog <[email protected]>
2585
2586 Final step for explicit id/geometry columns: Loading and saving
2587
2588 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
2589 with the following changes:
2590 (dbshapesource): Two new attributes id_column and geometry_column
2591
2592 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2593 (SessionSaver.write_session): Use the new namespace
2594 (SessionSaver.write_data_containers): Write the new dbshapesource
2595 parameters
2596
2597 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2598 the new file format version
2599 (SessionLoader.start_dbshapesource): Handle the new db parameters
2600
2601 * test/test_save.py: Update to the new dtd and namespace
2602 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2603 mock object to provide a working IDColumn method.
2604
2605 * test/test_load_1_0.py: New. Copy of the test_load.py before
2606 today's changes but with the round-trip tests removed.
2607
2608 * test/test_load_0_9.py: Update doc-string.
2609
2610 * test/test_load.py: Update all .thuban files to the new dtd and
2611 namespace.
2612 (TestPostGISLayer.file_contents): Add the new dbshapesource
2613 paramters
2614
2615 2004-03-11 Bernhard Herzog <[email protected]>
2616
2617 Next step for explicit id/geometry columns: User interaction
2618
2619 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
2620 the dialog is constructed. Add combo boxes to select id and
2621 geometry column. Rename some instance variables.
2622 (ChooseDBTableDialog.GetTable): Return id and geometry column
2623 names
2624 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
2625 selections in the table list
2626
2627 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
2628 and geometry_column
2629
2630 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
2631 parameters for id_column and geometry column of PostGISShapeStore
2632 here as well.
2633
2634 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
2635 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
2636 (PostGISConnection.GeometryTables): Use a better query to
2637 determine which relations in the database might be usable for
2638 shapestores. Now supports views as well but is more PostgreSQL
2639 specific
2640 (PostGISConnection.table_columns): New. Somewhat experimental
2641 method to let the db dialogs provide lists of columns to users so
2642 that they can select id and geometry columns.
2643 (PostGISTable.__init__): The default value of the id_column
2644 parameter is now None it still means "gid" effectively, though.
2645 (PostGISTable.IDColumn): New introspection method to return a
2646 column object for the id column
2647 (PostGISShapeStore.GeometryColumn): New introspection method to
2648 return a column object for the geometry column
2649
2650 * test/test_postgis_db.py
2651 (TestPostGISConnection.test_gis_tables_non_empty):
2652 Removed. Subsumed by the new:
2653 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
2654 New. Tes the GeometryTables and table_columns methods with actual
2655 tables and views.
2656 (PointTests.test_id_column, PointTests.test_geometry_column):
2657 New. tests for the new methods.
2658 (TestPostGISShapestorePoint.setUp)
2659 (TestPostGISShapestorePointSRID.setUp)
2660 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
2661 instance variables needed by the new tests
2662
2663 2004-03-11 Bernhard Herzog <[email protected]>
2664
2665 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
2666 numbers given to ReadValue are ordinals.
2667
2668 2004-03-11 Bernhard Herzog <[email protected]>
2669
2670 Elimiate the requirement for PostGIS tables to have a column
2671 called "gid".
2672
2673 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
2674 id_column to specify which column to use to identify rows. Also
2675 new instance variables id_column and quoted_id_column
2676 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
2677 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
2678 (PostGISTable.SimpleQuery): Use the id column name provided to the
2679 constructor instead of "gid"
2680 (PostGISShapeStore.__init__): New parameter id_column analogously
2681 to PostGISTable.__init__. This parameter is simply passed through
2682 to the base class constructor
2683 (PostGISShapeStore._create_col_from_description): Fix typo in
2684 doc-string
2685 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
2686 (PostGISShapeStore.ShapesInRegion): Use the id column name
2687 provided to the constructor instead of "gid"
2688
2689 * test/postgissupport.py
2690 (PostgreSQLServer.get_default_static_data_db): New static table
2691 landmarks_point_id with an id column != "gid. Update the comments
2692 a bit.
2693 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
2694 doc-
2695 (upload_shapefile): New parameter gid_column to use a name other
2696 than "gid" for the column to store the shape ids
2697
2698 * test/test_postgis_db.py (TableTests): New. Mixin-class
2699 containing all tests previously in TestPostGISTable. The actual
2700 tests are the same but the code is a bit more configurable to
2701 allow for different id columns etc.
2702 (TestPostGISTable): Derive from TableTests now for the actual
2703 tests.
2704 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2705 except that it the landmarks_point_id table to test the id_column
2706 parameter
2707 (PointTests): Extend the doc-string
2708 (TestPostGISShapestorePointExplicitGIDColumn)
2709 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2710 from PointTests to test the explicit id_column parameter. One
2711 tests with the name of the column holding the shape ids, the other
2712 uses PostgreSQL's OID column. For the latter a number of methods
2713 have to be overwritten to make them independent of the actual id
2714 values.
2715
2716 2004-03-08 Silke Reimer <[email protected]>
2717
2718 Update debian directory:
2719
2720 * debian/changelog: Added new version.
2721 * deiban/rules: Updated management of patches (with cbds)
2722 * debian/control: Added cbds to dependencies
2723 * debian/patches/*: New. Adds better support for patches of thuban in
2724 debian
2725 * debian/menu: Syntax of menu changed slightly
2726 * debian/setup.py.patch: removed because it has been moved to
2727 debian/patechs/setup.py.patch
2728
2729
2730 2004-02-26 Bernhard Herzog <[email protected]>
2731
2732 Create the Doc/technotes directory for text files with information
2733 for developers
2734
2735 * Doc/technotes/README: New. README for the technotes
2736
2737 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2738 Thuban
2739
2740 * Doc/technotes/release_process.txt: New. Used to be
2741 HOWTO-Release. Now slightly adapted to technote formatting style.
2742
2743 * HOWTO-Release: Removed. It's contents are now in
2744 Doc/technotes/release_process.txt
2745
2746 2004-02-25 Bernhard Herzog <[email protected]>
2747
2748 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2749 version of wxWindows the module was compiled with so we can check
2750 that against the wxPython version.
2751
2752 * Thuban/version.py (thuban_branch, thuban_release): New variables
2753 controlling which and how Thuban versions are shown. See the
2754 comments for details.
2755 (verify_versions): Also check that the wx version that wxproj is
2756 compiled against matches that of the wxPython we use at runtime
2757
2758 2004-02-20 Bernhard Herzog <[email protected]>
2759
2760 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2761 get_system_proj_file to read the epsg projections. The old way
2762 depended on the current directory being the top Thuban directory.
2763
2764 2004-02-20 Bernhard Herzog <[email protected]>
2765
2766 * Extensions/svgexport/test/test_svgmapwriter.py
2767 (TestVirtualDC.test_clippath): Remove a debug print
2768
2769 2004-02-20 Bernhard Herzog <[email protected]>
2770
2771 * Extensions/svgexport/__init__.py: New. Turn
2772 Extensions/svgexport into a package.
2773
2774 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2775 doc-string a bit. The doc-string must come first, otherwise it's
2776 not a doc-string. The __future__ import must be the first thing
2777 after the doc-string. Use only double quotes in doc-strings.
2778 Single quotes trip up emacs syntax highlighting if the text
2779 contains apostrophes.
2780
2781 2004-02-20 Bernhard Herzog <[email protected]>
2782
2783 * Extensions/svgexport/test/__init__.py,
2784 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2785 suite for svgexport
2786
2787 * test/runtests.py (find_test_modules): New. Function with the
2788 module finding code from main.
2789 (main): Use find_test_modules to figure out the default test
2790 modules and take modules from Extensions.svgexport.test too.
2791
2792 2004-02-19 Bernhard Herzog <[email protected]>
2793
2794 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2795 the mainwindow has a reference to the map of the initial session.
2796 This fixes a bug introduced with the fix for RT#2245
2797
2798 2004-02-19 Bernhard Herzog <[email protected]>
2799
2800 * Extensions/svgexport/svgsaver.py,
2801 Extensions/svgexport/svgmapwriter.py,
2802 Extensions/svgexport/maplegend.py: Added again. This time in the
2803 correct place.
2804
2805 2004-02-17 Bernhard Herzog <[email protected]>
2806
2807 Fix for RT#2245
2808
2809 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2810 instance variables before trying to create any windows. Creating
2811 windows can start an event loop if e.g. message boxes are popped
2812 up for some reason, and event handlers, especially EVT_UPDATE_UI
2813 may want to access things from the application.
2814 (ThubanApplication.maps_changed): The mainwindow may not have been
2815 created yet, so check whether it has been created before calling
2816 its methods
2817
2818 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2819 have a map
2820
2821 2004-02-17 Bernhard Herzog <[email protected]>
2822
2823 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2824 Extensions/svgmapwriter.py, Extensions/maplegend.py,
2825 extensions/svgexport/svgsaver.py,
2826 extensions/svgexport/svgmapwriter.py,
2827 extensions/svgexport/maplegend.py: Removed. These files were in
2828 the wrong places or didn't work at all.
2829
2830 2004-02-16 Bernhard Herzog <[email protected]>
2831
2832 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2833 line
2834
2835 2004-02-16 Bernhard Herzog <[email protected]>
2836
2837 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2838
2839 2004-02-15 Markus Rechtien <[email protected]>
2840
2841 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2842 to write a session to a file in SVG format.
2843 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2844 to write a SVG map of a session.
2845 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2846 in SVG format for the current session.
2847
2848 2004-02-13 Bernhard Herzog <[email protected]>
2849
2850 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2851 can't be created, return immediately after displaying the error
2852 message.
2853
2854 2004-02-11 Bernhard Herzog <[email protected]>
2855
2856 Handle postgis tables with more than one geometry column.
2857
2858 * Thuban/Model/postgisdb.py
2859 (PostGISTable._fetch_table_information): Delegate the creation of
2860 column objects to a different method so that we can extend that in
2861 derived classes
2862 (PostGISTable._create_col_from_description): New. Column object
2863 creation part of _fetch_table_information
2864 (PostGISShapeStore._create_col_from_description): New. Extend
2865 inherited method to handle geometry columns
2866 (PostGISShapeStore.__init__): New parameter geometry_column to
2867 specify which geometry column to use. Optional but mandatory for
2868 tables with more than one geometry column
2869 (PostGISShapeStore._fetch_table_information): Also use the name of
2870 the geometry column when looking for the srid
2871 (PostGISShapeStore.ShapeType): Also use the name of the geometry
2872 column when looking for the shape type
2873
2874 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2875 NonConnectionStore to changes in the PostGISShapeStore
2876
2877 * test/test_postgis_db.py
2878 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2879 PostGISShapeStore with tables having two geometry columns.
2880
2881 2004-02-10 Bernhard Herzog <[email protected]>
2882
2883 Fix some postgis problems. What remains to be done is real
2884 handling of SRIDs as they affect how reprojection is done
2885
2886 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2887 doc-string
2888 (PostGISShapeStore._fetch_table_information): New. Extend
2889 inherited method to retrieve srid
2890 (PostGISShapeStore.BoundingBox): Handle tables without data.
2891 extent yields NULL for those
2892 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2893
2894 * test/test_postgis_db.py
2895 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2896 for the special case of a table without any data
2897 (TestPostGISShapestorePointSRID): New class with tests for a table
2898 that uses srids
2899 (PolygonTests): Fix a doc-string typo
2900
2901 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2902 reference_systems with a specification of spacial reference
2903 systems to create in the new db.
2904 (PostgreSQLServer.new_postgis_db)
2905 (PostgreSQLServer.get_static_data_db): New parameter
2906 reference_systems to be passed through ultimately to
2907 PostGISDatabase. In new_postgis_db also check whether an existing
2908 db already has the right srids
2909 (PostgreSQLServer.get_default_static_data_db): Add srids and a
2910 table that uses srids
2911 (PostGISDatabase.initdb): Create the entries for the reference
2912 systems
2913 (PostGISDatabase.has_data): Add reference_systems parameter to
2914 check for those too
2915 (upload_shapefile): New parameter srid to create tables with a
2916 specific srid
2917
2918 2004-02-06 Frank Koormann <[email protected]>
2919
2920 * po/pt_BR.po: Fixed charset
2921
2922 2004-02-05 Frank Koormann <[email protected]>
2923
2924 * po/pt_BR.po: Fixed format string for error message, missing %s
2925 added (Thuban/UI/application.py:273)
2926
2927 2004-02-03 Frank Koormann <[email protected]>
2928
2929 First version of Portuguese (Brazilian) translation
2930
2931 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2932 Brazilian Portuguese by Eduardo Patto Kanegae.
2933
2934 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2935 translators.
2936
2937
2938 2004-01-22 Frank Koormann <[email protected]>
2939
2940 * Doc/manual/thuban-manual.xml: Added section on installation of
2941 Thuban under Win32 systems. Fixed image path references in the postgis
2942 section. Some minor source formattings.
2943
2944 2004-01-21 Frank Koormann <[email protected]>
2945
2946 Make Thuban remember path selections (at least for one application run).
2947
2948 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2949 attribute of application object. Path is a dictionary of
2950 strings, currently with the items "data" and "projection".
2951 (Application.SetPath): New, stores path for the specified item.
2952 (Application.Path): New, return path for the specified item.
2953
2954 * Thuban/UI/mainwindow.py
2955 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2956 MainWindow.AddLayer, MainWindow.AddRasterLayer,
2957 MainWindow.TableOpen): Access "data" path information of the
2958 application.
2959
2960 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2961 Access "projection" path information of the application.
2962
2963 2004-01-05 Bernhard Herzog <[email protected]>
2964
2965 * po/ru.po: Updated translations from Alex Shevlakov
2966
2967 2004-01-05 Bernhard Herzog <[email protected]>
2968
2969 * po/Makefile, po/README: Move the description of how to generate
2970 the translation statistics to the README.
2971
2972 2003-12-23 Bernhard Herzog <[email protected]>
2973
2974 * NEWS: Update for 1.0.0
2975
2976 * po/it.po: Another update from Maurizio Napolitano
2977
2978 2003-12-23 Bernhard Herzog <[email protected]>
2979
2980 * po/it.po: Updated translation from Maurizio Napolitano
2981
2982 2003-12-23 Bernhard Herzog <[email protected]>
2983
2984 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2985 for translation
2986
2987 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2988 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2989 strings for translation
2990
2991 * po/de.po: Update with the newly marked strings.
2992
2993 2003-12-22 Bernhard Herzog <[email protected]>
2994
2995 * HOWTO-Release: Fix the places where version numbers have to be
2996 updated
2997
2998 2003-12-22 Bernhard Herzog <[email protected]>
2999
3000 * setup.py (setup call): 1.0.0, yeah!
3001
3002 * Thuban/version.py (longversion): 1.0.0, yeah!
3003
3004 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3005 1.0.0 namespace too
3006
3007 * Thuban/Model/save.py (SessionSaver.write_session): Save with
3008 1.0.0 namespace
3009
3010 * test/test_load.py (LoadSessionTest.dtd)
3011 (TestSingleLayer.file_contents)
3012 (TestNonAsciiColumnName.file_contents)
3013 (TestLayerVisibility.file_contents)
3014 (TestClassification.file_contents, TestLabels.file_contents)
3015 (TestLayerProjection.file_contents)
3016 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3017 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3018 (TestPostGISLayerPassword.file_contents)
3019 (TestLoadError.file_contents, TestLoadError.test): Update for
3020 1.0.0 namespace
3021
3022 * test/test_save.py (SaveSessionTest.dtd)
3023 (SaveSessionTest.testEmptySession)
3024 (SaveSessionTest.testSingleLayer)
3025 (SaveSessionTest.testLayerProjection)
3026 (SaveSessionTest.testRasterLayer)
3027 (SaveSessionTest.testClassifiedLayer)
3028 (SaveSessionTest.test_dbf_table)
3029 (SaveSessionTest.test_joined_table)
3030 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3031
3032 2003-12-22 Bernhard Herzog <[email protected]>
3033
3034 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3035 alignment flags are byte strings not unicode and that they have
3036 valid values
3037
3038 * test/test_load.py (TestLabelLayer): New. Test loading (and
3039 indirectly saving) of maps with labels.
3040
3041 2003-12-22 Bernhard Herzog <[email protected]>
3042
3043 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3044 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3045 unsubscribe all subscribers.
3046 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3047 self.grid since it may already have been destroyed.
3048 Fixes RT #2256
3049
3050 2003-12-19 Bernhard Herzog <[email protected]>
3051
3052 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3053
3054 2003-12-16 Bernhard Herzog <[email protected]>
3055
3056 * debian/bitmappath.patch, debian/setup.py.patch:
3057 added to ensure compliance with FHS for debian
3058 * debian/rules, debian/changelog:
3059 added patches in rules to ensure compliance with FHS for debian
3060
3061 2003-12-16 Bernhard Herzog <[email protected]>
3062
3063 * po/Makefile (mo): Make the output a bit nicer so that it prints
3064 statistics about the translations. Add a comment how produce even
3065 nicer statistics with sed.
3066
3067 2003-12-09 Frank Koormann <[email protected]>
3068
3069 * Resources/Projections/defaults.proj:
3070 French projection sample with correct accents (UNICODE).
3071
3072 2003-12-05 Bernhard Herzog <[email protected]>
3073
3074 * MANIFEST.in: Add the devtools directory
3075
3076 * setup.py (setup call): Use license instead of licence. This
3077 silences a deprecation warning on Python 2.3
3078
3079 2003-12-05 Frank Koormann <[email protected]>
3080
3081 Documentation synced with 1.0rc1
3082
3083 * Doc/manual/thuban-manual.xml:
3084 Minor formatting changes and references to database layers .
3085 Introduction.Internationalization: New section on i18n.
3086 MapManagement.AddingandRemovingLayers: Added item on database layers.
3087 MapManagement.TheLegend: Added section and screenshot on popup menu.
3088 ProjectionManagement: Updated screenshot and sentence on EPSG.
3089 Appendix.SupportedDataSources: Added PostGIS.
3090 Appendix.WorkingwithPostGIS: New section.
3091
3092 * Doc/manual/images/6_projection.png: Updated screenshot including
3093 EPSG checkboxes.
3094
3095 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3096
3097 * Doc/manual/images/app_postgis_add_layer.png,
3098 Doc/manual/images/app_postgis_db_add.png,
3099 Doc/manual/images/app_postgis_db_management.png:
3100 New screenshots focussing on database layers
3101
3102 2003-12-05 Frank Koormann <[email protected]>
3103
3104 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3105 write warning to stderr instead of rising a warning dialog
3106
3107 2003-12-03 Bernhard Herzog <[email protected]>
3108
3109 Fix for RT #2243
3110
3111 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3112 New. Like has_selected_layer but for shape layers only
3113 (_has_selected_shape_layer): New. Like _has_selected_layer but for
3114 shape layers only
3115 (layer_show_table command, layer_jointable command): Use these
3116 commands should only be available for shape layers
3117
3118 2003-12-03 Bernhard Herzog <[email protected]>
3119
3120 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3121 publishers that are wx objects and may have been destroyed by wx
3122 already. Fixes RT #2242.
3123
3124 2003-12-03 Bernhard Herzog <[email protected]>
3125
3126 * po/ru.po: Updates from Alex Shevlakov
3127
3128 2003-12-03 Silke Reimer <silkeintevation.de>
3129
3130 * debian/control, debian/changelog: Added gdal-support to
3131 debian package, updated to new thuban version
3132
3133
3134 2003-12-03 Bernhard Herzog <[email protected]>
3135
3136 * Thuban/Lib/version.py: New. Module for version number
3137 manipulations. The version of make_tuple here also deals better
3138 with more unusual version number strings, such as e.g.
3139 "1.2+cvs20031111"
3140
3141 * Thuban/version.py (make_tuple): Removed. It's now in
3142 Thuban.Lib.version. Use that implementation instead.
3143
3144 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3145
3146 2003-12-02 Bernhard Herzog <[email protected]>
3147
3148 * MANIFEST.in: Add debian files
3149
3150 * setup.py (setup call): Add packages for the Extensions so that
3151 they're installed too
3152 (data_files): Add READMEs and sample data from some Extensions
3153
3154 * NEWS: Add note about the extensions in binary packages
3155
3156 2003-12-02 Bernhard Herzog <[email protected]>
3157
3158 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3159 with the thuban-1.0rc1
3160
3161 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3162 thuban-1.0rc1 namespace too
3163
3164 * test/test_save.py (SaveSessionTest.dtd)
3165 (SaveSessionTest.testEmptySession)
3166 (SaveSessionTest.testSingleLayer)
3167 (SaveSessionTest.testLayerProjection)
3168 (SaveSessionTest.testRasterLayer)
3169 (SaveSessionTest.testClassifiedLayer)
3170 (SaveSessionTest.test_dbf_table)
3171 (SaveSessionTest.test_joined_table)
3172 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3173 namespace
3174
3175 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3176 namespace
3177 (TestSingleLayer.file_contents)
3178 (TestNonAsciiColumnName.file_contents)
3179 (TestLayerVisibility.file_contents)
3180 (TestClassification.file_contents, TestLabels.file_contents)
3181 (TestLayerProjection.file_contents)
3182 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3183 (TestPostGISLayer.file_contents)
3184 (TestPostGISLayerPassword.file_contents)
3185 (TestLoadError.file_contents, TestLoadError.test): Update to
3186 thuban-1.0rc1 namespace
3187
3188 2003-12-01 Bernhard Herzog <[email protected]>
3189
3190 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3191 nt to better match Intevation's current w32 setup
3192
3193 * HOWTO-Release: Add note about updating MANIFEST.in
3194
3195 * MANIFEST.in: Add the Extensions
3196
3197 * NEWS: Update for 1.0rc1
3198
3199 2003-12-01 Bernhard Herzog <[email protected]>
3200
3201 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3202 cards for the dialog so that shapefiles ending in all uppercase
3203 SHP are listed too
3204
3205 2003-11-28 Bernhard Herzog <[email protected]>
3206
3207 * Thuban/version.py (longversion): Update to 1.0rc1
3208
3209 * setup.py (setup call): Update version to 1.0rc1. Use the
3210 [email protected] email address as author email instead of my
3211 personal one.
3212
3213 2003-11-28 Bernhard Herzog <[email protected]>
3214
3215 * po/de.po: Update german translation.
3216
3217 2003-11-28 Bernhard Herzog <[email protected]>
3218
3219 Unify the filenames stored in .thuban files so that the .thuban
3220 files are more platform independend
3221
3222 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3223 that they can be used on both windows and unix
3224 (SessionSaver.prepare_filename): New. Handle all filename
3225 transformations for filenames stored in the thuban file
3226 (SessionSaver.write_data_containers, SessionSaver.write_layer):
3227 Use prepare_filename
3228
3229 * test/test_save.py (SaveSessionTest.testSingleLayer)
3230 (SaveSessionTest.testLayerProjection)
3231 (SaveSessionTest.testRasterLayer)
3232 (SaveSessionTest.testClassifiedLayer)
3233 (SaveSessionTest.test_dbf_table)
3234 (SaveSessionTest.test_joined_table): Filenames are always stored
3235 with slashes on all currently supported platforms so adapt all
3236 tests to this
3237
3238 * test/test_load.py (LoadSessionTest.filenames): With the new
3239 filename scheme the filenames in the tests should be
3240 understandable on all currently supported platforms so we turn
3241 this into an empty list because we don't have to normalize them
3242 anymore
3243
3244 2003-11-28 Bernhard Herzog <[email protected]>
3245
3246 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3247 Add the ellipsoid to the projection since some Proj versions
3248 complain if it's missing.
3249
3250 2003-11-27 Bernhard Herzog <[email protected]>
3251
3252 Corect some bounding box projection problems
3253
3254 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3255 version of ForwardBBox
3256 (Projection._transform_bbox): New. common implementation of
3257 ForwardBBox and InverseBBox
3258 (Projection.ForwardBBox): Use _transform_bbox.
3259
3260 * test/test_proj.py (TestProjection.test): Add test for
3261 InverseBBox
3262
3263 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3264 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3265 new InverseBBox method to determine the unprojected bounding box
3266 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3267 bbox.
3268
3269 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3270 Removed.
3271 (TestLayer.test_arc_layer_with_projection): New. This test is
3272 better able to test whether bounding boxes are projected correctly
3273 than test_point_layer_with_projection
3274
3275 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3276 InverseBBox to unproject bboxes
3277
3278 2003-11-25 Bernhard Herzog <[email protected]>
3279
3280 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3281 source code.
3282
3283 2003-11-25 Bernhard Herzog <[email protected]>
3284
3285 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3286 there for backwards compatibility and all code relying on that
3287 should have been updated by now.
3288
3289 2003-11-25 Bernhard Herzog <[email protected]>
3290
3291 * test/test_load.py (TestClassification.test): Add the missing
3292 round trip test.
3293 (TestClassification.file_contents): Update to the newest file
3294 format
3295
3296 2003-11-25 Bernhard Herzog <[email protected]>
3297
3298 Add very experimental (and possibly dangerous) extension to draw
3299 polygons:
3300
3301 * Extensions/drawshape/README: New. Brief installation
3302 instructions
3303
3304 * Extensions/drawshape/drawshape.py: New. Implementation of the
3305 drawshape extensions
3306
3307 * Extensions/drawshape/patch.diff: Patch to apply before the
3308 extension can be used.
3309
3310 2003-11-24 Bernhard Herzog <[email protected]>
3311
3312 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3313 (ShapefileStore.__init__): Factor opening the shapefile into a
3314 separate method (the new _open_shapefile). This makes the code a
3315 bit more readable but the real reason is that it makes some evil
3316 hacks easier. :-)
3317
3318 2003-11-24 Bernhard Herzog <[email protected]>
3319
3320 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3321 converter is specified for an attribute assume it's a string
3322 containing only Latin1 characters. Update doc-string accordingly.
3323 This change should fix many places where unicode objects might
3324 accidentally enter Thuban.
3325
3326 * test/test_load.py (TestNonAsciiColumnName): New test to check
3327 what happens with column names in DBF files that contain non-ascii
3328 characters
3329
3330 2003-11-21 Bernhard Herzog <[email protected]>
3331
3332 Enable the experimental attribute editing again and introduce a
3333 command line switch to actually activate it
3334
3335 * Thuban/UI/main.py (options): New. Container for options set on
3336 the commmand line
3337 (main): Add the --enable-attribute-editing flag.
3338
3339 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3340 editing is enabled use the grid ctrl which allows editing of the
3341 values
3342
3343 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3344 New. Just delegate this to the underlying table.
3345
3346 2003-11-20 Bernhard Herzog <[email protected]>
3347
3348 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3349 Skip this test if run under non-posix systems since it only works
3350 there
3351
3352 2003-11-19 Bernhard Herzog <[email protected]>
3353
3354 * Thuban/Model/resource.py: Rework the way gdal support is
3355 determined so that we can give a reason in the about why gdal is
3356 not supported.
3357 (gdal_support_status): New. Variable holding a string with the
3358 reason for no gdal support
3359
3360 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3361 not supported to the message
3362
3363 2003-11-19 Bernhard Herzog <[email protected]>
3364
3365 Remove the old table interface and its test cases
3366
3367 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3368 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3369 anymore
3370
3371 * Thuban/Model/transientdb.py (TransientTableBase)
3372 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3373 anymore
3374
3375 * test/test_table.py: Removed since the old interface it tests is
3376 gone.
3377
3378 * test/runtests.py (main): The old table interface is gone and
3379 with it the deprecation warnings so remove the code that turns
3380 these warnings into errors
3381
3382 2003-11-19 Bernhard Herzog <[email protected]>
3383
3384 * test/test_table.py: Revert to revision 1.5 again. Changing the
3385 tests to use the new table interface is completely wrong since the
3386 whole purpose of the tests in this module is to test the old
3387 interface.
3388
3389 2003-11-18 Bernhard Herzog <[email protected]>
3390
3391 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3392 New. Test whether the connection matches a set of connection
3393 parameters
3394
3395 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3396 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3397 for existing connections with the same parameters and break out of
3398 the loop correctly.
3399
3400 * test/test_postgis_db.py (TestBriefDescription)
3401 (TestPostGISSimple.test_brief_description): Rename
3402 TestBriefDescription to TestPostGISSimple and the test method to
3403 test_brief_description so that we can add more test methods.
3404 (TestPostGISSimple.test_matches_parameters): New. Test the new
3405 MatchesParameters method
3406
3407 2003-11-18 Bernhard Herzog <[email protected]>
3408
3409 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3410 _was_destroyed, to indicate whether an publisher instance has
3411 already been destroyed.
3412 (Publisher.Unsubscribe): Only disconnect if the publisher has not
3413 been destroyed yet.
3414 (Publisher.Destroy): Set the _was_destroyed flag to true.
3415
3416 * test/test_connector.py
3417 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3418 calling Unsubscribe after Destroy doesn't raise an exception
3419
3420 2003-11-14 Bernhard Herzog <[email protected]>
3421
3422 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3423 typo in doc-string
3424
3425 2003-11-13 Bernhard Herzog <[email protected]>
3426
3427 Quote table and column names properly for postgis.
3428
3429 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3430 quote an identifier for use in an sql statement
3431 (PostGISColumn.__init__): Add the quoted_name attribute
3432 (PostGISTable.__init__): New instance variable quoted_tablename
3433 (PostGISTable._fetch_table_information): Use the quoted table
3434 name. New isntance variable quoted_geo_col with a quoted version
3435 of geometry_column
3436 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3437 (PostGISTable.RowOrdinalToId): Use the quoted table name
3438 (PostGISTable.ReadValue, PostGISTable.ValueRange)
3439 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3440 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3441 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3442 Use quoted table and column names
3443
3444 * test/test_postgis_db.py (TestPostGISSpecialCases)
3445 (TestPostGISIgnoredColumns): Rename the class to
3446 TestPostGISSpecialCases because that better describes the new
3447 cases
3448 (TestPostGISSpecialCases.test_unsupported_types)
3449 (TestPostGISSpecialCases.test): Rename the method to
3450 test_unsupported_types because we need a more descriptive name now
3451 that there are more methods
3452 (TestPostGISSpecialCases.test_table_name_quoting)
3453 (TestPostGISSpecialCases.test_column_name_quoting)
3454 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3455 cases to test quoting of table and column names in PostGISTable
3456 and PostGISShapeStore
3457
3458 * test/postgissupport.py
3459 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3460 AddGeometryColumn desn't support table or column names with sapces
3461 or double quotes
3462
3463 2003-11-12 Jan-Oliver Wagner <[email protected]>
3464
3465 * Extensions/wms/__init__.py: New: Init to make this
3466 directory a package.
3467
3468 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3469
3470 2003-11-11 Bernhard Herzog <[email protected]>
3471
3472 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3473 Constant for the file woth deprecated epsg projections
3474 (get_system_proj_file): Update doc-string
3475
3476 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3477 above the EPS widgets, introduce a check box for the deprecated
3478 eps projections and a label for the epsg widgets
3479 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3480 too
3481
3482 2003-11-11 Bernhard Herzog <[email protected]>
3483
3484 Avoid warnings when run under Python 2.3
3485
3486 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3487 (BaseRenderer.draw_label_layer): Coordinates must be ints.
3488
3489 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3490 real method so that we can convert to int.
3491 (MapRenderer.label_font): The font size mist be an int.
3492
3493 * Thuban/UI/common.py (Color2wxColour): The color values must be
3494 ints. Also, remove the unnecessary asserts.
3495
3496 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3497 (TestUnicodeStrings.test): Python source code should not contain
3498 non-ascii characters unless an encoding is specified in the file.
3499 Therefore use \x escapes in the string literals for non-ascii
3500 characters.
3501
3502 2003-11-11 Bernhard Herzog <[email protected]>
3503
3504 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3505 parameter so that this function can be used for all proj files in
3506 Resource/Projections
3507 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3508 get_system_proj_file
3509
3510 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3511 ProjFile self.__sysProjFile use a dictionary of system ProjFile
3512 objects self._sys_proj_files
3513 (ProjFrame.build_dialog): Adapt to the new changes in the
3514 ProjectionList constructor. Add a check button to toggle whether
3515 EPSG projections are shown
3516 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3517 events.
3518 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3519 the busy cursor if the files have not yet been loaded by the
3520 dialog.
3521 (ProjFrame.load_system_proj): Add a parameter for the name of the
3522 proj file. Maintain the dictionary of system projections
3523 self._sys_proj_files
3524
3525 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3526 user_projs parameters into one parameter proj_files which is a
3527 list of proj files.
3528 (ProjectionList._subscribe_proj_files)
3529 (ProjectionList._unsubscribe_proj_files): New. Move
3530 subscription/unsubscription of projfile messages to separate
3531 methods
3532 (ProjectionList.Destroy): The unsubscribe is now done in
3533 _unsubscribe_proj_files
3534 (ProjectionList.update_projections): We now have a list of proj
3535 file objects
3536 (ProjectionList.SetProjFiles): New method to set a new list of
3537 proj file objects
3538
3539 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3540 Specify explicitly which system proj file to load.
3541
3542 2003-11-11 Bernhard Herzog <[email protected]>
3543
3544 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3545 instance variables to cut cyclic references. The GC would have
3546 collected the loader eventually but it can happen that it doesn't
3547 run at all until thuban is closed (2.3 but not 2.2 tries a bit
3548 harder and forces a collection when the interpreter terminates)
3549 (load_session): Call the handler's Destroy method to make sure
3550 that it gets garbage collected early. Otherwise it will be
3551 collected very late if at all and it holds some references to e.g.
3552 shapestores and the session which can lead to leaks (of e.g. the
3553 temporary files)
3554
3555 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3556 resource leak in load_session
3557
3558 2003-11-10 Bernhard Herzog <[email protected]>
3559
3560 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3561 extensions are to be rendered.
3562 (_renderer_extensions): New. List with renderer for layers in
3563 extensions
3564 (add_renderer_extension): New. Add a renderer extension
3565 (init_renderer_extensions): New. Init the renderer extensions
3566 (BaseRenderer.render_map_incrementally): Search
3567 _renderer_extensions for how to draw unknown layer types
3568 (BaseRenderer.draw_raster_data): Add format parameter so that
3569 formats other than BMP can be drawn
3570 (BaseRenderer.draw_raster_layer): Pass an explicit format to
3571 draw_raster_data
3572
3573 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3574 strings of the format parameter of draw_raster_data method to wx
3575 constants
3576 (MapRenderer.draw_raster_data): Add the format parameter and use
3577 raster_format_map to map it to the right wxwindows constant for
3578 wxImageFromStream
3579
3580 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3581 the format parameter and record it
3582 (TestBaseRenderer.test_raster_no_projection): check the format
3583 paramter of the draw_raster_data method
3584 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3585 extension facility
3586
3587 2003-11-07 Bernhard Herzog <[email protected]>
3588
3589 Tweak the usage of the sqlite database to make common use cases
3590 more responsive. In most cases copying the data to the sqlite
3591 database takes so long that using sqlite doesn't have enough
3592 advantages.
3593
3594 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3595 comments about performance and query the min and max in separate
3596 statements because only that way will indexes be used.
3597 (TransientTableBase.UniqueValues): Add some comments about
3598 performance.
3599 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3600 Do not copy the data to the transient DB but use the transient
3601 copy if it exists. See the new comments for the performance trade
3602 offs
3603
3604 * test/test_transientdb.py
3605 (TestTransientTable.test_auto_transient_table): Make sure that the
3606 data is copied to the transient database at some point.
3607
3608 2003-11-03 Bernhard Herzog <[email protected]>
3609
3610 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
3611 globals to locals so that it's a bit faster
3612
3613 2003-11-03 Bernhard Herzog <[email protected]>
3614
3615 * Thuban/UI/baserenderer.py
3616 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
3617 method. ReadValue is faster than ReadRowAsDict since it only reads
3618 one cell especially now that the dbf file objects actually
3619 implement it.
3620
3621 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
3622 read_attribute method of the dbf objects
3623
3624 2003-11-03 Bernhard Herzog <[email protected]>
3625
3626 * Extensions/profiling/profiling.py (popup_dialog_box): New config
3627 variable to indicate whether the result should be shown in a
3628 dialog box
3629 (profile_screen_renderer, time_screen_renderer): Only show a
3630 dialog box if popup_dialog_box is true.
3631 (profile_screen_renderer): Flush stdout after the printing the
3632 first part of the "profiling..." message
3633
3634 * Thuban/UI/baserenderer.py
3635 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
3636 brushes for the groups so that they're not created over and over
3637 again
3638
3639 * Thuban/Model/classification.py (Classification.__getattr__)
3640 (Classification._compile_classification)
3641 (Classification._clear_compiled_classification): New. Methods to
3642 manage a 'compiled' representation of the classification groups
3643 which is created on demand
3644 (Classification.InsertGroup, Classification.RemoveGroup)
3645 (Classification.ReplaceGroup): reset the compiled representation
3646 (Classification.FindGroup): Use the compiled representation to
3647 find the matching group
3648 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
3649
3650 2003-10-31 Bernhard Herzog <[email protected]>
3651
3652 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
3653 Send a CLASS_CHANGED message
3654 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
3655 not return the removed group since it wasn't used.
3656
3657 * test/test_classification.py
3658 (TestClassification.test_set_default_group): New. Test the
3659 SetDefaultGroup method
3660 (TestClassification.test_insert_group): New. Test the InsertGroup
3661 method
3662 (TestClassification.test_remove_group): New. Test the RemoveGroup
3663 method
3664 (TestClassification.test_replace_group): New. Test the
3665 ReplaceGroup method
3666
3667 2003-10-31 Bernhard Herzog <[email protected]>
3668
3669 * test/test_classification.py (TestClassification.setUp):
3670 Subscribe to the CLASS_CHANGED messages
3671 (TestClassification.tearDown): New. Destroy the classification
3672 properly
3673 (TestClassification.test_defaults): Add tests for the default line
3674 width and whether no messages were sent yet
3675 (TestClassification.test_set_default_properties): Add tests for
3676 messages and setting the default line width
3677 (TestClassification.test_add_singleton)
3678 (TestClassification.test_add_range)
3679 (TestClassification.test_multiple_groups): Add tests for messages
3680
3681 2003-10-31 Bernhard Herzog <[email protected]>
3682
3683 Some more refactoring in preparation for new tests:
3684
3685 * test/test_classification.py (TestClassification.setUp): New.
3686 Instantiate the classification here. Update the test methods
3687 accordingly.
3688 (TestClassification.test_multiple_groups): Make sure that the two
3689 singletons matching 1 are considered different.
3690
3691 2003-10-31 Bernhard Herzog <[email protected]>
3692
3693 * test/test_classification.py (red, green, blue): New. These
3694 constants were used in several cases. Update the relevant methods.
3695 (TestClassification.test_defaults)
3696 (TestClassification.test_set_default_properties)
3697 (TestClassification.test_add_singleton)
3698 (TestClassification.test_add_range)
3699 (TestClassification.test_multiple_groups)
3700 (TestClassification.test_deepcopy): New. These were formerly all
3701 part of the single method test.
3702 (TestClassification.test_deepcopy): Removed.
3703 (TestClassIterator): Removed. The test case is now a method of
3704 TestClassification since it tests part of the public interface of
3705 Classification
3706 (TestClassification.test_iterator): New. Used to be
3707 TestClassIterator effectively
3708
3709 2003-10-31 Jan-Oliver Wagner <[email protected]>
3710
3711 GUIfied the functions of the profiling extension.
3712
3713 * /Extensions/profiling/__init__.py: New: Init to make this
3714 directory a package.
3715
3716 * Extensions/profiling/profiling.py: Moved menu entries to
3717 the Extensions menu. Applied _() for strings.
3718 (profile_screen_renderer): Catch the detailed printout and present
3719 it in a dialog.
3720 (time_screen_renderer): Raise a dialog to present the result instead
3721 of printing it to stdout.
3722
3723 2003-10-31 Bernhard Herzog <[email protected]>
3724
3725 * test/test_classification.py (TestClassGroupProperties)
3726 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3727 (TestClassGroupSingleton, TestClassIterator, TestClassification):
3728 Split TestClassification into several classes, one for each class
3729 being tested. TestClassification itself now only tests
3730 Classification. This split makes changes to the tests a bit easier
3731
3732 2003-10-31 Bernhard Herzog <[email protected]>
3733
3734 * Extensions/profiling/profiling.py: New. Extension to measure
3735 Thuban performance
3736
3737 2003-10-31 Frank Koormann <[email protected]>
3738
3739 Added two items to legend popup menu: Remove Layer and Show Layer Table
3740
3741 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3742 LegendPanel._OnShowTable): New event handlers, call the corresponding
3743 mainwindow methods.
3744 (LegendTree._OnRightClick): Added items to popup menu.
3745
3746 2003-10-30 Bernhard Herzog <[email protected]>
3747
3748 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3749 EVT_WINDOW_DESTROY
3750 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3751 nothing but is convenient for the derived classes.
3752
3753 * Thuban/UI/tableview.py
3754 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3755 Unsubscribe the messages here not in OnClose because that might
3756 get called multiple times. Fixes RT #2196
3757 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3758 anymore.
3759
3760 * README: Update the minimum requirement for wxPython. Since we
3761 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3762 the version in which that was introduced for all platforms
3763
3764 2003-10-30 Frank Koormann <[email protected]>
3765
3766 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3767 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3768 frame.
3769
3770 2003-10-30 Jan-Oliver Wagner <[email protected]>
3771
3772 Improved APR import extension, added further EPSG definitions
3773 and some cleanup regarding string class.
3774
3775 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3776 Added test for alias 'longlat'.
3777
3778 * Resources/Projections/epsg-deprecated.proj: New. Contains
3779 deprecated EPSG definitions.
3780
3781 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3782 the variable names for objects.
3783
3784 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3785 Copied from importAPR and provided with documentation.
3786
3787 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3788 Moved to apr.py.
3789 (APR_View): Added object ref 'ITheme'.
3790
3791 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3792 split function by corresponding use of the string class method.
3793
3794 * Thuban/Model/xmlwriter.py: Replaced string replace function by
3795 corresponding string method.
3796
3797 2003-10-29 Bernhard Herzog <[email protected]>
3798
3799 * Thuban/UI/baserenderer.py
3800 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3801 special case of a classification that only has the default group
3802
3803 2003-10-27 Bernhard Herzog <[email protected]>
3804
3805 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3806
3807 * po/de.po: Update.
3808
3809 * Thuban/UI/application.py
3810 (ThubanApplication.ShowExceptionDialog): Handle translation of the
3811 dialog message properly
3812
3813 2003-10-27 Bernhard Herzog <[email protected]>
3814
3815 Rework how localization works so that we use wx's translation
3816 functions when running Thuban as a normal application but not when
3817 we don't need any UI, such as in the test suite. See the comment
3818 in Thuban/__init__.py for details
3819
3820 * Thuban/__init__.py (_): Add one level of indirection to make the
3821 translation handling more flexible and to make it possible to use
3822 either wx's translation services or not.
3823 (gettext_identity, translation_function_installed)
3824 (install_translation_function): New function to help with this
3825
3826 * Thuban/UI/__init__.py: Install the wx specific translation
3827 function if it's OK to do that
3828
3829 * test/support.py (initthuban): Install a dummy translation
3830 function so that importing Thuban.UI doesn't install a wx specific
3831 one for which would need to import wxPython
3832
3833 2003-10-27 Bernhard Herzog <[email protected]>
3834
3835 * HOWTO-Release: Source archives should be created first and the
3836 binary packages should be created from the source archives.
3837 There's an official debian package now so there's no need to test
3838 the rpm on debian anymore
3839
3840 2003-10-27 Bernhard Herzog <[email protected]>
3841
3842 Several rendering changes:
3843
3844 - Render the selection into a separate bitmap so that only that
3845 bitmap needs to be redrawn when the selection changes
3846
3847 - Render incrementally showing previews and allowing interaction
3848 before rendering is complete
3849
3850 - Update the renderer interface a bit. Most parameters of
3851 RenderMap are now parameters of the constructor
3852
3853 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3854 and the update region as parameters. Update the doc-string
3855 (BaseRenderer.render_map_incrementally): New. Generator function
3856 to renders the map incrementally
3857 (BaseRenderer.render_map): Remove the map argument (it's now in
3858 the constructor) and simply iterate over the
3859 render_map_incrementally generator to draw the map.
3860 (BaseRenderer.draw_shape_layer_incrementally)
3861 (BaseRenderer.draw_shape_layer): Renamed to
3862 draw_shape_layer_incrementally and changed into a generator that
3863 yields True every 500 shapes. Used by render_map_incrementally to
3864 render shape layers incrementally
3865
3866 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3867 map and region parameters which are now in the constructor
3868 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3869 the inherited render_map_incrementally.
3870 (BaseRenderer.draw_shape_layer): Removed.
3871 (ScreenRenderer.draw_selection_incrementally): New. The selection
3872 drawing part of the removed draw_shape_layer as a generator
3873 (ScreenRenderer.layer_shapes): Update because of the region
3874 parameter change
3875 (ExportRenderer.__init__): New. Extend the inherited constructor
3876 with the destination region for the drawing
3877 (ExportRenderer.RenderMap): Removed the map and region parameters
3878 which are now in the constructor
3879
3880 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3881 bitmap suitable for a preview in a tool
3882 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3883 bitmap
3884 (MapPrintout.draw_on_dc): Adapt to new renderer interface
3885 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3886 exists
3887 (MapCanvas.OnIdle): Update the logic to deal with incremental
3888 rendering and the selection bitmap
3889 (MapCanvas._do_redraw): Handle the instantiation of the render
3890 iterator and the redraws during rendering
3891 (MapCanvas._render_iterator): New. Generator to incrementally
3892 redraw both bitmaps
3893 (MapCanvas.Export): Adapt to new renderer interface.
3894 (MapCanvas.full_redraw): Reset the selection bitmap and the
3895 renderer iterator too
3896 (MapCanvas.redraw_selection): New. Force a redraw of the selection
3897 bitmap
3898 (MapCanvas.shape_selected): Only redraw the selection bitmap
3899
3900 * test/test_baserenderer.py
3901 (TestBaseRenderer.test_polygon_no_projection)
3902 (TestBaseRenderer.test_raster_no_projection)
3903 (TestBaseRenderer.test_point_map_projection)
3904 (TestBaseRenderer.test_point_layer_and_map_projection)
3905 (TestBaseRenderer.test_point_layer_projection)
3906 (TestBaseRenderer.test_point_with_classification): Adapt to new
3907 renderer interface
3908
3909 2003-10-24 Bernhard Herzog <[email protected]>
3910
3911 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3912 (point_in_polygon_shape, shape_centroid): Raise an exception if
3913 the shape can't be read. Previously invalid shape ids would lead
3914 to a segfault.
3915
3916 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3917 New. test whether an exception is raised for invalid shape ids
3918
3919 2003-10-24 Jan-Oliver Wagner <[email protected]>
3920
3921 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3922 as alias for 'latlong'.
3923
3924 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3925 as alias for 'latlong'.
3926
3927 2003-10-24 Jan-Oliver Wagner <[email protected]>
3928
3929 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3930 the projection even for the UnknownPanel.
3931 (UnknownProjPanel.__init__): Define the text and create the textctrl
3932 widget.
3933 (UnknownProjPanel._DoLayout): Replaced static text widget by the
3934 textctrl created in __init__.
3935 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3936 including the parameters of the projection.
3937
3938 2003-10-24 Jan-Oliver Wagner <[email protected]>
3939
3940 * Resources/Projections/epsg.proj: New. This is a list of
3941 EPSG codes with parameters for proj. The list has been
3942 generated using devtools/create_epsg.py based on the
3943 file nad/epsg of the proj 4.4.7 package. Four projection
3944 definitions have been deleted as they are not accepted by proj:
3945 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3946 and "HD72 / EOV".
3947
3948 2003-10-22 Bernhard Herzog <[email protected]>
3949
3950 Some more tweaks to the projection dialog which should fix RT
3951 #1886.
3952
3953 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3954 the ProjFile's messages and call the base class methods correctly
3955 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3956 flag on the newly selected item too. Otherwise some other item is
3957 focused and the first time the focus is moved with the keyboard
3958 the selection moves in unexpected ways.
3959
3960 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3961 focus on the OK button, only on the projection list. That way the
3962 list really has the focus initially
3963 (ProjFrame.OnClose): Call the projection list's Destroy method to
3964 make it unsubscribe all messages
3965
3966 2003-10-21 Bernhard Herzog <[email protected]>
3967
3968 Rework the projection dialog to fix a few bugs, including RT 2166
3969 and most of 2168
3970
3971 * Thuban/UI/projlist.py: New. The class ProjectionList is a
3972 special wxListCtrl to show a list of projections in a more MVC
3973 fashion
3974
3975 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3976 throughout the class. The main change is to use the ProjectionList
3977 class instead of a normal wxListBox. Also, add an explicit
3978 "Unknown" projection to the projection choice control.
3979 (ProjPanel.__init__): Add an "unknown" ellipsoid
3980 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3981 instantiation of the panel's controls to make the tab-order more
3982 natural
3983
3984 2003-10-21 Bernhard Herzog <[email protected]>
3985
3986 * test/test_load.py (TestSingleLayer.file_contents)
3987 (TestSingleLayer.test): Add non-ascii characters to the titles of
3988 session, map and layer. This is effectively a port of the
3989 TestUnicodeStrings test in test_load_0_8.py which for some reason
3990 was only added there.
3991
3992 * test/test_load_0_9.py (TestSingleLayer.file_contents)
3993 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3994 characters to the titles of session, map and layer,.
3995
3996 2003-10-21 Bernhard Herzog <[email protected]>
3997
3998 Add EPSG projection handling to .thuban files
3999
4000 * test/test_save.py (SaveSessionTest.dtd)
4001 (SaveSessionTest.testEmptySession)
4002 (SaveSessionTest.testLayerProjection)
4003 (SaveSessionTest.testRasterLayer)
4004 (SaveSessionTest.testClassifiedLayer)
4005 (SaveSessionTest.test_dbf_table)
4006 (SaveSessionTest.test_joined_table)
4007 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4008 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4009 use a and epsg projection to test saving them
4010
4011 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4012 namespace
4013 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4014 (TestLayerProjection.file_contents)
4015 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4016 (TestPostGISLayer.file_contents)
4017 (TestPostGISLayerPassword.file_contents)
4018 (TestLoadError.file_contents, TestLoadError.test): Update to use
4019 1.0-dev namespace
4020 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4021 use 1.0-dev namespace and use an EPSG projection to test whether
4022 loading it works
4023
4024 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4025 as of Thuban 0.9. These are now tests to determine whether Thuban
4026 can still read files generated by Thuban 0.9
4027
4028 * Thuban/Model/save.py (SessionSaver.write)
4029 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4030 namespace
4031 (SessionSaver.write_projection): Write the projection's epsg
4032 attribute
4033
4034 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4035 thuban-1.0-dev.dtd namespace
4036 (SessionLoader.check_attrs): Allow a callable object as conversion
4037 too
4038 (SessionLoader.start_projection, SessionLoader.end_projection)
4039 (SessionLoader.start_parameter): Handle the epsg attribute and
4040 rename a few instance variables to lower case
4041
4042 * Resources/XML/thuban-1.0.dtd: New. Only difference to
4043 thuban-0.9.dtd is the epsg attribute for projections.
4044
4045 2003-10-21 Bernhard Herzog <[email protected]>
4046
4047 * test/runtests.py (main): Let the user specify which tests to run
4048 on the command line
4049
4050 * test/support.py (ThubanTestResult.getDescription): Override to
4051 give a better short description. The description can be used as a
4052 parameter to run_tests to run that particular test in isolation.
4053
4054 2003-10-21 Frank Koormann <[email protected]>
4055
4056 Popup menu for legend. Scheduled for the 1.2 release this was too
4057 simple to implement: The popup menu is bound to the legend tree, while
4058 the events are hanlded by its anchestor, the legend panel. This
4059 allows reuse of all the event handlers already implemented for the
4060 legend toolbar buttons.
4061
4062 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4063 to add handlers for the events issued by the popup menu.
4064 (LegendPanel._OnToggleVisibility): Handler for toggling layer
4065 visibility event
4066 (LegendPanel._OnProjection): Handler for layer projection event.
4067 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4068 (LegendTree._OnRightClick): Event handler for right click, select item
4069 and pop up menu.
4070 (LegendTree.ToggleVisibility): Toggle layer visibility
4071 (LegendTree.LayerProjection): Raise layer projection dialog for
4072 current layer.
4073
4074 2003-10-21 Bernhard Herzog <[email protected]>
4075
4076 * Resources/Projections/defaults.proj: Use correct DOCTYPE
4077 declaration. The top-level element is projectionlist not projfile
4078
4079 2003-10-20 Bernhard Herzog <[email protected]>
4080
4081 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4082 method to write a projfile and display a busy cursor and error
4083 dialogs.
4084 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4085 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4086 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4087 busy cursor while loading the user and system prj files.
4088
4089 2003-10-16 Bernhard Herzog <[email protected]>
4090
4091 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4092 ProjFile objects
4093 (clear_proj_file_cache): New function to clear the cache. Mainly
4094 useful for use by the test suite
4095 (read_proj_file): Use the cache.
4096
4097 * test/test_proj.py (TestProjFile): Clarify the doc-string
4098 (ProjFileReadTests): Update doc-string
4099 (ProjFileReadTests.test_get_system_proj_file): Check whether the
4100 system proj files is cached.
4101 (ProjFileLoadTestCase): New base class for the proj file tests
4102 derived from support.FileLoadTestCase to provide some common
4103 behavior.
4104 (TestLoadingProjFile)
4105 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4106 (TestProjFileWithInvalidParameters.file_contents): Derive from
4107 ProjFileLoadTestCase
4108 (TestLoadingProjFile.test_caching): New. Test whether the cache
4109 works
4110
4111 2003-10-16 Silke Reimer <[email protected]>
4112
4113 * debian/*: New directory with configuration files for building a thuban
4114 deb-package.
4115
4116 2003-10-14 Bernhard Herzog <[email protected]>
4117
4118 * test/test_proj.py: Execute support.run_tests when run as
4119 __main__ so that missing unsubscribes are detected
4120 (TestProjFile.tearDown): Destroy the proj_file properly
4121
4122 2003-10-14 Bernhard Herzog <[email protected]>
4123
4124 * Thuban/Model/messages.py (PROJECTION_ADDED)
4125 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4126 the ProjFile objects
4127
4128 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4129 easily send messages when the projections change
4130 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4131 when the change was successful
4132
4133 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4134 proj file messages
4135 (TestProjFile.test_add_remove)
4136 (TestProjFile.test_remove_non_existing)
4137 (TestProjFile.test_replace)
4138 (TestProjFile.test_replace_non_existing): Test whether the right
4139 messages are sent
4140
4141 2003-10-14 Bernhard Herzog <[email protected]>
4142
4143 * test/test_proj.py (TestProjFile.test): Refactor into several
4144 tests
4145 (TestProjFile.test_add_remove)
4146 (TestProjFile.test_remove_non_existing)
4147 (TestProjFile.test_replace)
4148 (TestProjFile.test_replace_non_existing): Some of the new
4149 individual test cases
4150 (TestProjFileSimple): New class for the rest of the test cases
4151 that came out of the refactoring
4152 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4153 derived classes don't have to
4154
4155 2003-10-13 Bernhard Herzog <[email protected]>
4156
4157 Add an optional EPSG code to the projection objects and extend the
4158 .proj file format accordingly.
4159
4160 * Resources/XML/projfile.dtd (element projection): Add epsg
4161 attribute
4162
4163 * Thuban/Model/proj.py (Projection.__init__): New parameter and
4164 instance variable epsg. Update doc-string
4165 (Projection.EPSGCode, Projection.Label): New methods to provide
4166 access to EPSG code and a label for use in dialogs
4167
4168 * Thuban/Model/resource.py (ProjFileReader.start_projection)
4169 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4170 Handle the epsg code attribute when reading or writing proj files
4171
4172 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4173 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4174 (ProjFrame.__FillAvailList): Use the projection's Label method to
4175 get the string for the list box
4176
4177 * test/test_proj.py (TestProjection.test_label)
4178 (TestProjection.test_label_epsg)
4179 (TestProjection.test_epsgcode_for_non_epsg_projection)
4180 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4181 for the label and EPSGCode methods
4182 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4183 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4184 objects in the test cases and put the expected contents into the
4185 test case methods too. Update doTestWrite accordingly
4186 (TestLoadingProjFile)
4187 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4188 read tests from TestProjFile.
4189 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4190 tests are now in the new classes.
4191 (sample_projfile, sample_projfile_data)
4192 (sample_projfile2, sample_projfile_data2): Removed. Not used
4193 anymore.
4194 (TestProjFile.test_read_unreadable_file): No need to reset the
4195 permissions at the end anymore since we use a unique filename
4196
4197 2003-10-13 Bernhard Herzog <[email protected]>
4198
4199 * test/test_proj.py: Some more refactoring of the test cases
4200 (ProjFileTest): New base class for the proj file tests.
4201 (TestProjFile): Derive from ProjFileTest
4202 (TestProjFile.test_read_unreadable_file)
4203 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4204 the new filename method to get a unique filename
4205 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4206 (WriteProjFileTests): New class for proj file write tests.
4207 Contains the write test that were in TestProjFile originally.
4208
4209 2003-10-13 Bernhard Herzog <[email protected]>
4210
4211 * test/test_proj.py (TestProjFile.testRead)
4212 (TestProjFile.test_read_non_existing_file)
4213 (TestProjFile.test_read_unreadable_file)
4214 (TestProjFile.test_read_empty_file): Split into several methods.
4215
4216 2003-10-10 Bernhard Herzog <[email protected]>
4217
4218 * Thuban/UI/sizers.py: New file with custom sizers.
4219
4220 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4221 all projection type specific panels and put them into a
4222 NotebookLikeSizer. This way the dialog doesn't change its size
4223 when a different projection is selected
4224 (ProjFrame.__init__): Rename projection_panels
4225 projection_panel_defs and reuse projection_panels for a list of
4226 the instantiated panels.
4227 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4228 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4229 the panels
4230 (UnknownProjPanel._DoLayout): Place the newlines in the message
4231 differently to make the panel narrower.
4232 (TMPanel._DoLayout): Layout the parameters in one column.
4233
4234 2003-10-10 Bernhard Herzog <[email protected]>
4235
4236 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4237 that contains all the setup for the dialog's widgets, layout and
4238 event handling.
4239 (__): Call build_dialog to build the dialog.
4240 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4241 Their functionality is now in build_dialog
4242 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4243 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4244 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4245 different widget names and hierarchy introduced with build_dialog.
4246
4247 2003-10-10 Bernhard Herzog <[email protected]>
4248
4249 * README: Fix typo.
4250
4251 2003-10-09 Bernhard Herzog <[email protected]>
4252
4253 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4254 projection is already in the list. This is *a lot* faster when
4255 loading files with hundreds of projections since it saves a linear
4256 search. OTOH this will allow adding the same projection to the
4257 user.proj file multiple times in the projection dialog but we'll
4258 deal with that later
4259
4260 2003-10-09 Jan-Oliver Wagner <[email protected]>
4261
4262 * devtools: New. Directory for developer tools that are not intended
4263 for the regular user.
4264
4265 * devtools/create_epsg.py: New. Convert the epsg file of proj into
4266 a python .proj file.
4267
4268 2003-10-09 Bernhard Herzog <[email protected]>
4269
4270 * test/test_proj.py
4271 (TestProjection.test_get_parameter_without_equals_sign): New. Test
4272 whether GetParameter handles parameters without "=" sign correctly
4273
4274 * Thuban/Model/proj.py (Projection.GetParameter): Handle
4275 parameters that do not contain a "=". Update the doc-string
4276
4277 2003-10-08 Bernhard Herzog <[email protected]>
4278
4279 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4280 length limit on the projname text control
4281
4282 2003-10-08 Bernhard Herzog <[email protected]>
4283
4284 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4285 (TestProjection.test_get_projection_units_normal): New. Tests for
4286 the Projection.GetProjectedUnits method
4287
4288 2003-10-08 Jan-Oliver Wagner <[email protected]>
4289
4290 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4291 Added missing 'val' parameter.
4292
4293 2003-10-08 Bernhard Herzog <[email protected]>
4294
4295 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4296 projection type of the currently selected projection is not known,
4297 i.e. there's no panel for it, use the UnknownProjPanel
4298 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4299 the actual replacing of the proj panel into the new method
4300 _show_proj_panel.
4301 (UnknownProjPanel): Add doc-string.
4302 (UnknownProjPanel._DoLayout): Insert a newline into the text so
4303 that the panel is not so wide.
4304
4305 2003-10-08 Bernhard Herzog <[email protected]>
4306
4307 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4308 too. Update the doc-string
4309 (get_proj_files): Removed. It wasn't used anywhere
4310 (get_system_proj_files, get_system_proj_file): Rename to
4311 get_system_proj_file and return the ProjFile object and not a list
4312 of ProjFile objects. Update the callers.
4313 (get_user_proj_files, get_user_proj_file): Rename to
4314 get_user_proj_file return the ProjFile object and not a list of
4315 ProjFile objects. Update the callers.
4316 (ProjFileReader.__init__): New instance variable for the warnings.
4317 Rename the __pf ivar to projfile. Update the methods referring to
4318 __pf
4319 (ProjFileReader.end_projection): Catch any errors raised when
4320 instantiating the projection and record that as an error. The
4321 projection will not be in the final ProjFile object.
4322 (ProjFileReader.GetWarnings): New method to return the warnings.
4323
4324 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4325 show the warnings from the projfile reader
4326 (ProjFrame._OnImport): Deal with any warnings returned by
4327 read_proj_file
4328 (ProjFrame.__FillAvailList): Deal with any warnings returned by
4329 get_system_proj_file or get_user_proj_file.
4330
4331 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4332 (TestProjFileWithInvalidParameters.file_contents): New test cases
4333 to test whether read_proj_file handles invalid projection
4334 parameters correctly
4335 (TestProjFile.test_get_system_proj_file): New. Simple test for
4336 resource.get_system_proj_file
4337
4338 2003-10-07 Bernhard Herzog <[email protected]>
4339
4340 * test/test_derivedshapestore.py
4341 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4342 properly so that the temporary directories get deleted correctly
4343
4344 2003-10-06 Bernhard Herzog <[email protected]>
4345
4346 Handle the title changes in a proper MVC way.
4347
4348 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4349 canvas' TITLE_CHANGED messages
4350 (MainWindow.update_title): New. Update the main window's title
4351 (MainWindow.__SetTitle): Removed. Use update_title instead.
4352 (MainWindow.SetMap): Use update_title instead of __SetTitle
4353 (MainWindow.RenameMap): Do change the window title explicitly
4354 here. That's handled in a proper MVC way now.
4355 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4356 messages
4357
4358 * Thuban/Lib/connector.py (Conduit): New class to help classes
4359 that forward messages
4360
4361 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4362 (ViewPort): Derive from Conduit instead of Publisher
4363 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4364 when calling the inherited versions
4365 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4366 methods to subscribe and unsubscribe map messages
4367 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4368 handle the map subscriptions
4369 (ViewPort.Map, ViewPort.map_projection_changed)
4370 (ViewPort.layer_projection_changed): Add or update doc-strings
4371
4372 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4373 typo
4374 (MyConduit): Helper class for the Conduit test.
4375 (TestConduit): Test cases for Conduit
4376
4377 * test/test_connector.py: Use support.run_tests as main.
4378
4379 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4380 the TITLE_CHANGED messages
4381 (ViewPortTest.test_forwarding_title_changed): New test to check
4382 whether the viewport forwards the map's TITLE_CHANGED messages
4383 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4384 after the port's because the latter may require a still functional
4385 map.
4386
4387 2003-10-06 Bernhard Herzog <[email protected]>
4388
4389 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4390 doc-string
4391
4392 2003-10-06 Bernhard Herzog <[email protected]>
4393
4394 * test/test_viewport.py (ViewPortTest.setUp)
4395 (SimpleViewPortTest.test_init_with_size): Move the test for the
4396 initial size as a constructor parameter from ViewPortTest.setUp
4397 method to a new separate test in SimpleViewPortTest.
4398
4399 2003-10-06 Bernhard Herzog <[email protected]>
4400
4401 * test/test_viewport.py (MockView): New class derived from
4402 ViewPort with a mock implementation of GetTextExtent to be used in
4403 the test cases
4404 (ViewPortTest.setUp): Use MockView instead of ViewPort
4405
4406 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4407 into what would be a "pure virtual function" in C++: always raise
4408 NotImplementedError. Mock implementations for test cases don't
4409 belong into the real code
4410
4411 2003-10-02 Bernhard Herzog <[email protected]>
4412
4413 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4414 close the dbf file we create so that it's contents have been
4415 written properly.
4416
4417 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4418 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4419 Update to shapelib 1.2.10
4420
4421 2003-10-01 Jan-Oliver Wagner <[email protected]>
4422
4423 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4424 it annoys lintian which warns about these files not being
4425 executable. The #! isn't necessary here since if you absolutely
4426 must execute them you can always say "python <filename>".
4427
4428 2003-09-26 Bernhard Herzog <[email protected]>
4429
4430 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4431 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4432 is ported to a newer the import will fail, so it should be noticed
4433 immediately that this function is gone.
4434 Fixes RT#1919
4435
4436 2003-09-26 Bernhard Herzog <[email protected]>
4437
4438 Add a DTD for the projection files and make thuban write valid
4439 projection files
4440
4441 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4442 files
4443
4444 * Thuban/Model/resource.py (ProjFileSaver.write): Use
4445 'projectionlist' as the name in the document type declaration so
4446 that it matches the element type of the root element.
4447
4448 * test/test_proj.py (sample_projfile, sample_projfile2): Use
4449 'projectionlist' as the name in the document type declaration just
4450 as it is done now in the files thuban would write
4451 (sample_projfile, sample_projfile_data): Fix spelling of
4452 "Mercator"
4453 (TestProjFile.doTestWrite): Validate the written and the expected
4454 XML data
4455 (TestProjFile): Derive from ValidationTest so that we can run xml
4456 validation tests
4457
4458 2003-09-24 Bernhard Herzog <[email protected]>
4459
4460 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4461 modify the list returned by map.Layers() in place since it is the
4462 actual list of layers used by the map.
4463
4464 2003-09-23 Jan-Oliver Wagner <[email protected]>
4465
4466 * Doc/manual/thuban-manual.xml: Added subsection to chapter
4467 Extensions to describe the extensions coming with the Thuban
4468 standard package (gns2shp and importAPR).
4469
4470 2003-09-23 Bernhard Herzog <[email protected]>
4471
4472 * libraries/thuban/wxproj.cpp (project_point): if there's an
4473 inverse but no forward projection, convert to degrees after
4474 applying the inverse projection. Fixes RT#2096
4475
4476 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4477 implicitly tests for the fix to RT#2096
4478
4479 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4480 Check that the sequences have the same lengths
4481
4482 * Resources/Projections/defaults.proj (Geographic projection): Use
4483 a much more precise value for the to_meter attribute.
4484
4485 2003-09-22 Bernhard Herzog <[email protected]>
4486
4487 * test/support.py (initthuban): Make sure to unset the LANG env.
4488 var. so that tests that compare translated strings work. Solves RT
4489 #2094
4490
4491 2003-09-22 Jan-Oliver Wagner <[email protected]>
4492
4493 Small improvement of APR import.
4494
4495 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4496 Added tests for text-ranges.
4497
4498 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4499 returns a string object if the range is based on text.
4500
4501 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4502 range retrieval.
4503
4504 2003-09-22 Jan-Oliver Wagner <[email protected]>
4505
4506 Initial version of the importAPR extension which is in
4507 experimental state.
4508
4509 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4510 /Extensions/importAPR/test/: New directories.
4511
4512 * /Extensions/importAPR/samples/README: New: Howto load the samples.
4513
4514 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4515 file which refers to the Thuban Iceland demo data.
4516
4517 * /Extensions/importAPR/test/README: New: Howto execute the tests.
4518
4519 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4520
4521 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4522 as in '.apr'-files.
4523
4524 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4525 ODB Objects as in '.apr', '.avl' and other files.
4526
4527 * /Extensions/importAPR/__init__.py: New: Init to make this
4528 directory a package.
4529
4530 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4531 project file (.apr) and convert it to Thuban.
4532
4533 2003-09-22 Jan-Oliver Wagner <[email protected]>
4534
4535 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4536
4537 2003-09-19 Jan-Oliver Wagner <[email protected]>
4538
4539 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4540 with description on RPM installation and RPM binary package
4541 creation.
4542
4543 2003-09-18 Bernhard Herzog <[email protected]>
4544
4545 * setup.py (data_files): Only add the mo files if the Locales
4546 directory actually exists, so that setup.py works with a fresh CVS
4547 checkout
4548
4549 2003-09-12 Jan-Oliver Wagner <[email protected]>
4550
4551 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4552 in viewport, not anymore in view
4553
4554 2003-09-04 Jan-Oliver Wagner <[email protected]>
4555
4556 Introducing first Extension (gns2shp).
4557
4558 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4559
4560 * Extensions/__init__.py: New. init to make this dir a package.
4561
4562 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4563
4564 * Extensions/gns2shp/test/README: New. some info on this test directory.
4565
4566 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4567
4568 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4569 of Shapefile from GNS text file format
4570
4571 2003-09-03 Jan-Oliver Wagner <[email protected]>
4572
4573 Fix/workaround for bug #2019:
4574 https://intevation.de/rt/webrt?serial_num=2019
4575
4576 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4577 (IdentifyView.__init__): Added another button that allows to
4578 stop the identify mode.
4579 (IdentifyView.OnStop): New. Stops the identify mode.
4580
4581 2003-09-03 Jan-Oliver Wagner <[email protected]>
4582
4583 Introducing a new exception dialog that allows to exit the
4584 application immediately.
4585 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4586
4587 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4588
4589 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4590 Made strings available to translations. Exchanged the simple
4591 ScrolledMessageDialog by the new ExceptionDialog.
4592
4593 2003-09-01 Bernhard Herzog <[email protected]>
4594
4595 * NEWS: New. Summary of changes and release notes.
4596
4597 * MANIFEST.in: Add NEWS
4598
4599 2003-09-01 Bernhard Herzog <[email protected]>
4600
4601 * MANIFEST.in: Correct the include statement for the mo-files and
4602 include the documentation too.
4603
4604 * setup.py (data_files): Add the .mo files
4605 (setup call): Up to version 0.9.0
4606
4607 2003-09-01 Bernhard Herzog <[email protected]>
4608
4609 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4610 parameter list to just parent and session
4611 (ChooseDBTableDialog.__set_properties): Removed. Setting the
4612 selection of empty list boxes is not allowed (and produces C++
4613 assertion errors) and the rest of the setup is better done in
4614 __init__ anyway.
4615 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
4616 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
4617 builtins True/False for booleans to avoid warnings from wxPython
4618
4619 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
4620 ChooseDBTableDialog constructor parameters.
4621
4622 2003-09-01 Bernhard Herzog <[email protected]>
4623
4624 * Thuban/Model/postgisdb.py
4625 (PostGISTable): Extend doc-string
4626 (PostGISTable._fetch_table_information): Set the column index
4627 correctly, pretending ignored columns don't exist.
4628
4629 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
4630 for postgis tables with data types not yet supported by thuban.
4631
4632 2003-08-29 Bernhard Herzog <[email protected]>
4633
4634 * HOWTO-Release: Tweak item about running the tests.
4635
4636 2003-08-29 Jan-Oliver Wagner <[email protected]>
4637
4638 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
4639
4640 2003-08-29 Bernhard Herzog <[email protected]>
4641
4642 Add some missing parameters to projections. Proj complains about
4643 them on windows but for some reason not on Linux.
4644
4645 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
4646 missing required projection parameters
4647
4648 * test/test_proj.py (TestProjFile.test): Add missing required
4649 projection parameters
4650
4651 * test/test_load_0_8.py (TestLayerProjection.file_contents)
4652 (TestLayerProjection.test): Add missing required projection
4653 parameters and tests for them
4654
4655 * test/test_load.py (TestLayerProjection.file_contents)
4656 (TestLayerProjection.test): Add missing required projection
4657 parameters and tests for them
4658
4659 * test/test_layer.py (TestLayer.test_base_layer): Add missing
4660 required projection parameters
4661
4662 2003-08-29 Bernhard Herzog <[email protected]>
4663
4664 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
4665 access the pj_errno because directly accessing pj_errno doesn't
4666 work on windows if the proj library is in a DLL
4667
4668 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
4669
4670 2003-08-28 Bernhard Herzog <[email protected]>
4671
4672 * test/test_proj.py: Import things from Thuban after calling
4673 initthuban
4674
4675 * test/test_load.py (LoadSessionTest.filenames): New class
4676 variable with the filename attributes to normalize
4677 (LoadSessionTest.check_format): Pass self.filenames to
4678 sax_eventlist to normalize the filename attributes
4679
4680 * test/xmlsupport.py: Add cvs keywords
4681 (SaxEventLister.__init__): New parameter filenames which indicates
4682 attributes that contain filenames
4683 (SaxEventLister.startElementNS): Normalize the filename attributes
4684 with os.path.normpath
4685 (sax_eventlist): New parameter filenames to pass through to
4686 SaxEventLister
4687
4688 * test/test_derivedshapestore.py: Make this file callable as a
4689 program to execute the tests
4690 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
4691 the session to self.session so that it gets destroyed properly
4692
4693 * test/test_layer.py (TestLayer.tearDown): Call the session's
4694 Destroy method
4695
4696 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
4697 too if it exists
4698 (TestMapAddLayer.test_add_layer): Bind the session to self.session
4699 so that it gets destroyed properly
4700
4701 * test/postgissupport.py (reason_for_not_running_tests): Add a
4702 test for the existence of popen2.Popen4.
4703
4704 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4705 reliable way to destroy the sessions created in the test cases
4706 (SaveSessionTest.test_dbf_table): Bind the session to self.session
4707 so that it gets destroyed properly
4708 (SaveSessionTest.testLayerProjection): Bind the session to
4709 self.session so that it gets destroyed properly
4710
4711 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4712 sure that the session is destroyed properly
4713
4714 * test/test_shapefilestore.py: Make this callable as a program to
4715 execute the tests
4716
4717 * test/test_scalebar.py: Remove unnecessary import of _ from
4718 Thuban
4719
4720 * test/support.py (print_garbage_information): Call initthuban
4721 here because it may be called indirectly from test cases that test
4722 test support modules which do not use anything from thuban itself
4723 (ThubanTestProgram.runTests): Remove unnecessary debug print
4724
4725 2003-08-28 Bernhard Herzog <[email protected]>
4726
4727 * Thuban/version.py (longversion): Update to 0.9
4728
4729 * Thuban/UI/mainwindow.py: Remove some unused imports
4730
4731 * README: Add section about required additional software. Add date
4732 and revision CVS keywords
4733
4734 * HOWTO-Release: Add item about the translations. Add date and
4735 revision CVs keywords and change formatting to match README a bit
4736 better
4737
4738 * po/de.po: Update for 0.9
4739
4740 * test/README: Tweak the wording a little because many tests are
4741 not really unittest.
4742
4743 2003-08-27 Bernhard Herzog <[email protected]>
4744
4745 As preparation for the 0.9 release, switch thuban files to a
4746 non-dev namespace
4747
4748 * Thuban/Model/save.py (SessionSaver.write_session): Write files
4749 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4750 namespace
4751
4752 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4753 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4754
4755 * test/test_save.py (SaveSessionTest.dtd)
4756 (SaveSessionTest.testEmptySession)
4757 (SaveSessionTest.testSingleLayer)
4758 (SaveSessionTest.testLayerProjection)
4759 (SaveSessionTest.testRasterLayer)
4760 (SaveSessionTest.testClassifiedLayer)
4761 (SaveSessionTest.test_dbf_table)
4762 (SaveSessionTest.test_joined_table)
4763 (SaveSessionTest.test_save_postgis): Update for new namespace
4764
4765 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4766 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4767 (TestLayerProjection.file_contents)
4768 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4769 (TestPostGISLayer.file_contents)
4770 (TestPostGISLayerPassword.file_contents)
4771 (TestLoadError.file_contents, TestLoadError.test): Update for new
4772 namespace
4773
4774 2003-08-27 Bernhard Herzog <[email protected]>
4775
4776 Make the table interface distinguish between row ids (an integer
4777 that uniquely identifies a row) and row ordinals (a simple row
4778 count from 0 to NumRows() - 1)
4779
4780 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4781 (PostGISTable.RowOrdinalToId): New methods to conver between row
4782 ids and row ordinals
4783 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4784 parameter row_is_ordinal to indicate whether the row parameter is
4785 the row id or the ordinal
4786
4787 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4788 (TransientTableBase.RowOrdinalToId)
4789 (AutoTransientTable.RowIdToOrdinal)
4790 (AutoTransientTable.RowOrdinalToId): Same new methods as in
4791 PostGISTable.
4792 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4793 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4794 Same new parameter as in PostGISTable.
4795
4796 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4797 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4798 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4799 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4800 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4801 parameter as in PostGISTable.
4802
4803 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4804 (DataTable.RowOrdinalToId): New methods to convert between row ids
4805 and row ordinals.
4806 (TableGrid.SelectRowById): New method to select a row based on its
4807 ID as opposed to its ordinal
4808 (DataTable.GetValue, TableGrid.OnRangeSelect)
4809 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4810 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4811 (LayerTableFrame.__init__): Convert between row ids and row
4812 ordinals as appropriate
4813
4814 * test/postgissupport.py (PostGISDatabase.__init__): Add
4815 doc-string.
4816 (PostGISDatabase.initdb): The optional third item in a tuple in
4817 tables is now a (key, value) list with additional arguments to
4818 pass to upload_shapefile
4819 (upload_shapefile): New parameter gid_offset to allow gids that
4820 are not the same as the shapeids in the shapefile
4821 (PostgreSQLServer.get_default_static_data_db): Use the new
4822 gid_offset to make the gids in landmarks 1000 higher than the
4823 shapeids in the shapefile
4824
4825 * test/test_viewport.py
4826 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4827 new shapeids in the landmarks table
4828
4829 * test/test_transientdb.py
4830 (TestTransientTable.run_iceland_political_tests)
4831 (TestTransientTable.test_transient_joined_table): Add tests for
4832 the new table methods and new keywords arguments.
4833
4834 * test/test_postgis_db.py
4835 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4836 (TestPostGISTable.test_read_value_row_count_mode)
4837 (TestPostGISTable.test_row_id_to_ordinal)
4838 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4839 table methods and the new arguments
4840 (TestPostGISShapestorePoint.test_shapes_in_region)
4841 (TestPostGISShapestorePoint.test_shape_raw_data)
4842 (TestPostGISShapestorePoint.test_shape_points)
4843 (TestPostGISShapestorePoint.test_shape_shapeid)
4844 (TestPostGISShapestorePoint.test_all_shapes)
4845 (TestPostGISTable.test_simple_query)
4846 (TestPostGISTable.test_simple_query)
4847 (TestPostGISTable.test_simple_query)
4848 (TestPostGISTable.test_read_value)
4849 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4850 shapeids in the landmarks table
4851
4852 * test/test_memory_table.py
4853 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4854 (TestMemoryTable.test_read_value_row_count_mode)
4855 (TestMemoryTable.test_row_id_to_ordinal)
4856 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4857 table methods and the new arguments
4858
4859 * test/test_dbf_table.py
4860 (TestDBFTable.test_read_row_as_dict_row_count_mode)
4861 (TestDBFTable.test_read_value_row_count_mode)
4862 (TestDBFTable.test_row_id_to_ordinal)
4863 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4864 methods and the new arguments
4865
4866 2003-08-26 Bernhard Herzog <[email protected]>
4867
4868 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4869 more postgis specific but much faster method to get the bounding
4870 box
4871
4872 2003-08-26 Bernhard Herzog <[email protected]>
4873
4874 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4875 (PostGISShapeStore.AllShapes): Add these missing methods.
4876 (PostGISShapeStore.ShapesInRegion): No need to raise
4877 StopIteration. We can simply return
4878
4879 * test/test_postgis_db.py (TestPostGISTable.test_title)
4880 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4881 new methods
4882
4883 2003-08-25 Bernhard Herzog <[email protected]>
4884
4885 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4886
4887 * test/test_postgis_db.py (PolygonTests): New class containing
4888 those tests from TestPostGISShapestorePolygon that can also be
4889 used to test MUTLIPOLYGON tables
4890 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4891 so derive from that
4892 (TestPostGISShapestoreMultiPolygon): New class with tests for
4893 MUTLIPOLYGON tables
4894
4895 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4896 tables argument to have tuples with three items to override the
4897 WKT type used.
4898 (PostgreSQLServer.get_default_static_data_db): Use the above to
4899 create a polygon table with MUTLIPOLYGONs
4900 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4901 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4902 coords_to*
4903 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4904 (wkt_converter): New. Map WKT types to converters
4905 (upload_shapefile): New parameter force_wkt_type to use a
4906 different WKT type than the default
4907
4908 2003-08-25 Bernhard Herzog <[email protected]>
4909
4910 * Thuban/UI/application.py
4911 (ThubanApplication.run_db_param_dialog): New. Suitable as a
4912 db_connection_callback. Main difference is that the dialog run
4913 from this method doesn't have a parent so it can be used even when
4914 there is no main window
4915 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4916 no db_connection_callback was given. This way the dialog pops up
4917 even when the .thuban file was given as a command line parameter.
4918
4919 2003-08-25 Bernhard Herzog <[email protected]>
4920
4921 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4922 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4923 which leads to an effectively frozen X session because the user
4924 can only interact with the dialog but the mouse is still grabbed
4925 by the canvas.
4926 Also, call the tool's Hide method before MouseLeftUp because
4927 MouseLeftUp may change the tool's coordinates.
4928
4929 2003-08-25 Bernhard Herzog <[email protected]>
4930
4931 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4932 LoadCancelled exceptions and handle them by returning immediately.
4933
4934 2003-08-25 Bernhard Herzog <[email protected]>
4935
4936 GUI part of loading sessions with postgis connections which may
4937 require user interaction to get passwords or updated parameters
4938
4939 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4940 bit nucer and be more generic.
4941 (DBFrame.OnAdd): Adapt to new DBDialog interface
4942
4943 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4944 optional parameter db_connection_callback which is passed to
4945 load_session.
4946
4947 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4948 Suitable as a db_connection_callback
4949 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4950 db_connection_callback of the application's OpenSession method
4951
4952
4953 2003-08-25 Bernhard Herzog <[email protected]>
4954
4955 Basic loading of sessions containing postgis connections:
4956
4957 * Thuban/Model/load.py (LoadError): Add doc-string
4958 (LoadCancelled): New exception class to indicate a cancelled load
4959 (SessionLoader.__init__): Add the db_connection_callback parameter
4960 which will be used by the loader to get updated parameters and a
4961 password for a database connection
4962 (SessionLoader.__init__): Add the new XML elements to the
4963 dispatchers dictionary
4964 (SessionLoader.check_attrs): Two new conversions, ascii to convert
4965 to a byte-string object and idref as a generic id reference
4966 (SessionLoader.start_dbconnection)
4967 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4968 elements
4969 (load_session): Add the db_connection_callback to pass through the
4970 SessionLoader
4971
4972 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4973 New classes to test loading of sessions with postgis database
4974 connections.
4975
4976 2003-08-25 Bernhard Herzog <[email protected]>
4977
4978 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4979 replace it and the comment with __BuildDate__ by the Source: and
4980 Id: cvs keywords as used in the other files.
4981
4982 2003-08-25 Bernhard Herzog <[email protected]>
4983
4984 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4985 LoadError when a required attribute is missing. The code used to
4986 be commented out for some reason, but probably should have been
4987 active.
4988
4989 * test/test_load.py (TestLoadError.test): Test the message in the
4990 LoadError too to make sure it really is about the missing
4991 attribute
4992
4993 2003-08-22 Bernhard Herzog <[email protected]>
4994
4995 * test/test_save.py (SaveSessionTest.test_dbf_table)
4996 (SaveSessionTest.test_joined_table): Add XML validation tests.
4997
4998 2003-08-22 Bernhard Herzog <[email protected]>
4999
5000 Implement saving a session with a postgis connection
5001
5002 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5003 elements for database connections and shapestores using db
5004 connections
5005 (session): Add the dbconnections to the content model
5006
5007 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5008 Write the db connections
5009 (SessionSaver.write_session): Call write_db_connections to write
5010 the connection before the data sources
5011 (SessionSaver.write_data_containers): Handle postgis shapestores
5012
5013 * test/test_save.py (SaveSessionTest.thubanids)
5014 (SaveSessionTest.thubanidrefs): Update for new DTD
5015 (SaveSessionTest.test_save_postgis): New. Test saving a session
5016 with postgis connections
5017
5018 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5019 (PostGISTable.TableName): New accessor methods for the connection
5020 and table name
5021
5022 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5023 (TestPostGISTable.test_dbname): New methods to test the new
5024 PostGISConnection methods
5025
5026 2003-08-22 Bernhard Herzog <[email protected]>
5027
5028 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5029 for exceptions occurring when establishing a Database connection
5030 (PostGISConnection.connect): Catch psycopg.OperationalError during
5031 connects and raise ConnectionError.
5032
5033 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5034 tests for database exceptions
5035
5036 2003-08-22 Bernhard Herzog <[email protected]>
5037
5038 Prepare the test suite for tests with required authentication
5039
5040 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5041 variables with two predefined users/passwords, one for the admin
5042 and one for a non-privileged user.
5043 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5044 the non-privileged user to the database and set the admin password
5045 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5046 Better error reporting
5047 (PostgreSQLServer.connection_params)
5048 (PostgreSQLServer.connection_string): New methods to return
5049 information about how to connect to the server
5050 (PostgreSQLServer.execute_sql): New. Convenience method to execute
5051 SQL statements
5052 (PostgreSQLServer.require_authentication): Toggle whether the
5053 server requires authentication
5054 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5055 Add or alter users
5056 (PostGISDatabase.initdb): Pass the admin name one the
5057 subprocesses' command lines. Grant select rights on
5058 geometry_columns to everybody.
5059 (upload_shapefile): Use the admin name and password when
5060 connecting. Grant select rights on the new table to everybody.
5061
5062 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5063 server's new methods to get the connection parameters.
5064
5065 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5066 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5067 server's new methods to get the connection parameters.
5068
5069 * test/test_postgis_db.py
5070 (TestPostGISConnection.test_gis_tables_empty)
5071 (TestPostGISConnection.test_gis_tables_non_empty)
5072 (PostGISStaticTests.setUp): Use the server's new methods to get
5073 the connection parameters.
5074
5075 2003-08-22 Bernhard Herzog <[email protected]>
5076
5077 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5078
5079 * Thuban/version.py: Add psycopg version
5080
5081 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5082 version of the psycopg module
5083
5084 2003-08-22 Bernhard Herzog <[email protected]>
5085
5086 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5087 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5088 at the moment. The functionality should probably be implemented
5089 some time, though.
5090 (DBFrame.OnRemove): Display a message if the connection can't be
5091 removed because it's still in use.
5092
5093 2003-08-22 Jan-Oliver Wagner <[email protected]>
5094
5095 * Thuban/UI/about.py (About.__init__): split up the huge about
5096 text into elements/lists for easier translation. This fixes bug
5097 https://intevation.de/rt/webrt?serial_num=2058
5098 Also, made some forgotten string available for the i18n.
5099
5100 2003-08-21 Bernhard Herzog <[email protected]>
5101
5102 Make postgis support really optional including insensitive menu
5103 items.
5104
5105 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5106 whether the postgis is supported.
5107
5108 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5109 to make postgis support optional
5110
5111 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5112 version of Thuban.Model.postgisdb.has_postgis_support
5113 (database_management command): Make it only sensitive if postgis
5114 is supported.
5115
5116 2003-08-21 Jan-Oliver Wagner <[email protected]>
5117
5118 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5119 (section Adding and Removing Layers): Added text and described
5120 multi-selection.
5121 (chapter Extensions): New.
5122
5123 2003-08-21 Jan-Oliver Wagner <[email protected]>
5124
5125 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5126 settings to allow multiple files to load into the map.
5127 Also reduced selection to *.shp as a default.
5128
5129 2003-08-20 Bernhard Herzog <[email protected]>
5130
5131 Add dialogs and commands to open database connections and add
5132 database layers.
5133
5134 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5135 method to open the database connection management dialog
5136 (MainWindow.AddDBLayer): New method to add a layer from a database
5137 (_has_dbconnections): New helper function to use for sensitivity
5138 (database_management command, layer_add_db command): New commands
5139 that call the above new methods.
5140 (main_menu): Add the new commands to the menu.
5141
5142 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5143 (PostGISConnection.connect): Establish the actual connection in a
5144 separate method and call it in __init__. This makes it easier to
5145 override the behavior in test cases
5146 (PostGISConnection.BriefDescription): New method to return a brief
5147 description for use in dialogs.
5148
5149 * test/test_postgis_db.py (NonConnection): DB connection that
5150 doesn't actually connect
5151 (TestBriefDescription): New class with tests for the new
5152 BriefDescription method
5153
5154 2003-08-19 Jan-Oliver Wagner <[email protected]>
5155
5156 Moved anything from extensions to libraries.
5157
5158 * libraries: New.
5159
5160 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5161
5162 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5163 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5164 been moved here from thuban/extensions/pyprojection/
5165 See there in the Attic for the older history.
5166
5167 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5168 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5169 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5170 have been moved here from thuban/extensions/pyshapelib/
5171 See there in the Attic for the older history.
5172
5173 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5174 files have been moved here from thuban/extensions/shapelib/
5175 See there in the Attic for the older history.
5176
5177 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5178 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5179 thuban/extensions/thuban/
5180 See there in the Attic for the older history.
5181
5182 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5183
5184 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5185 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5186
5187 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5188 Moved to libraries/shapelib.
5189
5190 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5191 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5192 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5193 Moved to libraries/pyshapelib.
5194
5195 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5196 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5197 Moved to libraries/pyprojection.
5198
5199 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5200
5201 * extensions: Removed.
5202
5203 2003-08-19 Bernhard Herzog <[email protected]>
5204
5205 * test/test_viewport.py (ViewPortTest): We don't use the
5206 facilities of FileTestMixin so don't derive from it.
5207 (TestViewportWithPostGIS): New class with tests for using a
5208 viewport on a map with postgis layers.
5209
5210 2003-08-19 Bernhard Herzog <[email protected]>
5211
5212 Add the db connection management to the session.
5213
5214 * Thuban/Model/session.py (Session.__init__): New instance
5215 variable db_connections
5216 (Session.AddDBConnection, Session.DBConnections)
5217 (Session.HasDBConnections, Session.CanRemoveDBConnection)
5218 (Session.RemoveDBConnection): New methods to manage and query the
5219 db connections managed by the session
5220 (Session.OpenDBShapeStore): New method to open a shapestore from a
5221 db connection
5222
5223 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5224 messages for the db connection handling in the session
5225
5226 * test/test_postgis_session.py: New. test cases for the session's
5227 db connection handling with postgis connections
5228
5229 2003-08-19 Bernhard Herzog <[email protected]>
5230
5231 Add very basic postgis database support and the corresponding test
5232 cases. The test cases require a PostgreSQL + postgis installation
5233 but no existing database. The database will be created
5234 automatically by the test cases
5235
5236 * test/README: Add note about skipped tests and the requirements
5237 of the postgis tests.
5238
5239 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5240
5241 * test/test_postgis_db.py: New. Test cases for the postgis
5242 support.
5243
5244 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5245 format
5246
5247 * test/test_wellknowntext.py: New. Test cases for the
5248 wellknowntext parser
5249
5250 * test/postgissupport.py: New. Support module for tests involving
5251 a postgis database.
5252
5253 * test/support.py (execute_as_testsuite): Shut down the postmaster
5254 if it's still running after the tests
5255
5256 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5257 well known text format
5258
5259 2003-08-19 Jan-Oliver Wagner <[email protected]>
5260
5261 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5262 message dialog.
5263
5264 2003-08-18 Bernhard Herzog <[email protected]>
5265
5266 * test/support.py (ThubanTestResult.printErrors): Indent the
5267 reason for the skips in the output to make it a bit more readable.
5268 (execute_as_testsuite): New helper function to run a test suite
5269 and print some more information.
5270 (run_tests): Use execute_as_testsuite to run the tests
5271
5272 * test/runtests.py (main): Use execute_as_testsuite to run the
5273 tests
5274
5275 2003-08-18 Bernhard Herzog <[email protected]>
5276
5277 Fix some bugs in Thuban and the test suite that were uncovered by
5278 changes introduced in Python 2.3:
5279
5280 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5281 filename is an absolute name
5282
5283 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5284 filename is an absolute name
5285
5286 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5287 unique filename to save to and use the correct relative filename
5288 in the expected output.
5289 (SaveSessionTest.test_dbf_table): Use the correct relative
5290 filename in the expected output.
5291
5292 * test/test_layer.py (TestLayer.test_raster_layer): Update the
5293 test to check whether the filename is absolute.
5294
5295 2003-08-18 Jan-Oliver Wagner <[email protected]>
5296
5297 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5298
5299 2003-08-15 Bernhard Herzog <[email protected]>
5300
5301 Change the way shapes are returned by a shape store. The
5302 ShapesInRegion method returns an iterator over actual shape
5303 objects instead of a list of shape ids.
5304
5305 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5306 id.
5307 (ShapefileStore.ShapesInRegion): Return an iterator over the
5308 shapes which yields shape objects instead of returning a list of
5309 shape ids
5310 (ShapefileStore.AllShapes): New. Return an iterator over all
5311 shapes in the shape store
5312 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5313
5314 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5315 doc-string.
5316
5317 * Thuban/UI/baserenderer.py
5318 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5319 layer_shapes and make it return an iterator containg shapes
5320 instead of a list of ids.
5321 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5322 layer_shapes() change
5323
5324 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5325 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5326
5327 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5328 changes in the ShapesInRegion return value.
5329 (ViewPort._get_hit_tester): Remove commented out code
5330
5331 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5332 new return value.
5333 (SimpleShapeStore.AllShapes): New. Implement this method too.
5334
5335 * test/test_layer.py (TestLayer.test_arc_layer)
5336 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5337 (TestLayer.test_point_layer_with_projection)
5338 (TestLayer.test_derived_store): Adapt to changes in the
5339 ShapesInRegion return value.
5340
5341 * test/test_shapefilestore.py
5342 (TestShapefileStoreArc.test_shapes_in_region)
5343 (TestShapefileStorePolygon.test_shapes_in_region)
5344 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5345 in the ShapesInRegion return value.
5346 (TestShapefileStorePoint.test_all_shapes)
5347 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5348 methods
5349
5350 * test/test_derivedshapestore.py
5351 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5352 the ShapesInRegion return value.
5353 (TestDerivedShapeStore.test_all_shapes)
5354 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5355 methods
5356
5357 2003-08-15 Bernhard Herzog <[email protected]>
5358
5359 Make the renderers deal correctly with raw vs. python level
5360 representation of shape geometries
5361
5362 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5363 Return a flag useraw in addition to the callable and the parameter
5364 to indicate whether the callable can deal with the raw shape data
5365 or uses the higher level python lists of coordinates. The callable
5366 now should accept either the raw data or the return value of the
5367 shape's Points() method.
5368 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5369 change
5370 (BaseRenderer.projected_points): Instead of the shape id use the
5371 points list as parameter.
5372 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5373 (BaseRenderer.draw_point_shape): Adapt to projected_points()
5374 change and accept the points list as parameter instead of the
5375 shape id.
5376
5377 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5378 the useraw flag as required by the BaseRenderer
5379 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5380 changes.
5381
5382 * test/test_baserenderer.py
5383 (TestBaseRenderer.test_point_with_classification): New test for
5384 rendering a map with classifications.
5385
5386 2003-08-15 Bernhard Herzog <[email protected]>
5387
5388 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5389 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5390 (ViewPort._get_hit_tester, ViewPort.projected_points)
5391 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5392 (ViewPort._find_label_at): Split the find_shape_at method into
5393 several new methods and use the functions in the hit-test module.
5394
5395 * Thuban/UI/hittest.py: New module with Python-level hit-testing
5396 functions
5397
5398 * test/test_hittest.py: New. Test for the new hittest module
5399
5400 2003-08-15 Bernhard Herzog <[email protected]>
5401
5402 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5403 projection to all corners of the bounding box to get a better
5404 approximation of the projected bounding box
5405
5406 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5407 New. Test coordinate handling of a layer with a projection.
5408 Catches the bug fixed in Layer.ShapesInRegion
5409
5410 2003-08-15 Bernhard Herzog <[email protected]>
5411
5412 Move some of the mock objects in test_baserenderer into their own
5413 module so they can easily be used from other tests
5414
5415 * test/mockgeo.py: New test helper module with some mock objects
5416 for geometry related things like shapes, shapestores and
5417 projections.
5418
5419 * test/test_mockgeo.py: New. Tests for the new helper module
5420
5421 * test/test_baserenderer.py: Some of the mock-objects are in
5422 mockgeo now.
5423
5424 2003-08-12 Jan-Oliver Wagner <[email protected]>
5425
5426 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5427
5428 2003-08-12 Bernhard Herzog <[email protected]>
5429
5430 * po/de.po: New. German translations by Bjoern Broscheit
5431
5432 2003-08-12 Bernhard Herzog <[email protected]>
5433
5434 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5435 strings have to be one string literal.
5436
5437 2003-08-11 Bernhard Herzog <[email protected]>
5438
5439 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5440 New. This method was used in various derived classes, but it's
5441 better to have it here.
5442
5443 * test/test_shapefilestore.py
5444 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5445 FloatComparisonMixin
5446
5447 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5448 It's now in FloatComparisonMixin
5449
5450 * test/test_derivedshapestore.py
5451 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5452 in FloatComparisonMixin
5453
5454 2003-08-11 Bernhard Herzog <[email protected]>
5455
5456 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5457 error message
5458
5459 2003-08-08 Jan-Oliver Wagner <[email protected]>
5460
5461 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5462 with version number.
5463 Changed title to reflect version number of Thuban.
5464
5465 2003-08-08 Jan-Oliver Wagner <[email protected]>
5466
5467 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5468 the list corresponds to the "About" web page.
5469
5470 2003-08-08 Bernhard Herzog <[email protected]>
5471
5472 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5473 Make sure translated strings are recognized as one string literal.
5474
5475 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5476 Make sure translated strings are recognized as one string literal.
5477
5478 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5479 translated strings are recognized as one string literal.
5480
5481 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5482 sure translated strings are recognized as one string literal.
5483
5484 2003-08-07 Bernhard Herzog <[email protected]>
5485
5486 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5487 Simply delegates to the original shapestore.
5488
5489 * test/test_derivedshapestore.py
5490 (TestDerivedShapeStore.test_raw_format): New. Test case for
5491 DerivedShapeStore.RawShapeFormat
5492
5493 2003-08-07 Bernhard Herzog <[email protected]>
5494
5495 Add raw data interface to shape objects.
5496
5497 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5498 class to ShapefileShape which now holds shapefile specific
5499 information.
5500 (ShapefileShape.compute_bbox): Simplified to not cache any
5501 information. The way this method is used that shouldn't matter
5502 performance wise.
5503 (ShapefileShape.RawData): New. Return the shapeid which is the raw
5504 data format for shapes from shapefiles.
5505 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5506 in the shape objects returned by a shapestore. For a
5507 ShapefileStore this is always RAW_SHAPEFILE.
5508 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5509 method.
5510
5511 * test/test_shapefilestore.py
5512 (TestShapefileStore.test_raw_format): New test to test the raw
5513 format feature of shapes.
5514
5515 * Thuban/Model/layer.py: Remove the unused import of Shape from
5516 data. It was only there for interface compatibility but it's not
5517 used inside of Thuban and the generic Shape class has gone away.
5518
5519 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5520 the raw data format and only use an optimized version of its a
5521 shapefile.
5522
5523 2003-08-07 Bernhard Herzog <[email protected]>
5524
5525 * test/test_baserenderer.py (SimpleShape): Shape class for the
5526 tests.
5527 (SimpleShapeStore.Shape): Use SimpleShape instead of
5528 Thuban.Model.data.Shape to make the tests independed of the coming
5529 changes.
5530
5531 2003-08-07 Bernhard Herzog <[email protected]>
5532
5533 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5534 (ThubanTestProgram): New classes that extend the respective
5535 classes from unittest. These new version support skipping tests
5536 under certain expected conditions. In the Thuban test suite we
5537 uses this for tests that require the optional gdal support.
5538 (run_tests): Use ThubanTestProgram instead of the unittest.main()
5539
5540 * test/runtests.py (main): Use the new ThubanTestRunner instead of
5541 the normal one from unittest
5542
5543 * test/test_layer.py (TestLayer.test_raster_layer): If this test
5544 is not run because gdal support isn't available report this to the
5545 runner.
5546
5547 * test/test_baserenderer.py
5548 (TestBaseRenderer.test_raster_no_projection): Do not run this test
5549 if gdal support isn't available and report this to the runner.
5550
5551 2003-08-06 Bernhard Herzog <[email protected]>
5552
5553 Rearrange the renderers a bit, partly in preparation for changes
5554 required for the postgis merge, partly to make it more testable.
5555 Also make the representation of coordinates in Shapes more
5556 consistent.
5557
5558 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5559 this class is now in BaseRenderer. This class is now practically
5560 only a specialization of BaseRenderer for rendering to an actual
5561 wx DC.
5562 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5563 to get the shapetype specific rendering functions.
5564
5565 * Thuban/UI/baserenderer.py: New file with the basic rendering
5566 logic. The code in this file is completely independend of wx.
5567 (BaseRenderer): Class with the basic rendering logic
5568
5569 * test/test_baserenderer.py: New. Test cases for BaseRenderer
5570
5571 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5572 error_on_redraw to guard agains endless loops and stack overflows
5573 when there's a bug in the rendering code that raises exceptions.
5574 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5575 rendering into a separate method _do_redraw so that error handling
5576 is a bit easier. When an exception occurs, set error_on_redraw to
5577 true. When it's true on entry to OnIdle do nothing and return
5578 immediately.
5579
5580 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5581 Shape object will always have the coordinates as a list of list of
5582 coordinate pairs (tuples).
5583 (Shape.compute_bbox): Adapt to new representation.
5584
5585 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5586 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5587 Shape objects.
5588
5589 * test/test_shapefilestore.py
5590 (ShapefileStoreTests.assertFloatTuplesEqual)
5591 (ShapefileStoreTests.assertPointListEquals): Rename to
5592 assertPointListEquals and change purpose to checking equality of
5593 the lists returned by Shape.Points().
5594 (TestShapefileStoreArc.test_shape)
5595 (TestShapefileStorePolygon.test_shape)
5596 (TestShapefileStorePoint.test_shape): Use the new
5597 assertPointListEquals instead of assertFloatTuplesEqual
5598
5599 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5600 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5601 and change purpose to checking equality of the lists returned by
5602 Shape.Points().
5603 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5604 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5605 (TestLayer.test_derived_store): Use the new assertPointListEquals
5606 instead of assertFloatTuplesEqual
5607
5608 * test/test_derivedshapestore.py
5609 (TestDerivedShapeStore.assertFloatTuplesEqual)
5610 (TestDerivedShapeStore.assertPointListEquals): Rename to
5611 assertPointListEquals and change purpose to checking equality of
5612 the lists returned by Shape.Points().
5613 (TestDerivedShapeStore.test_shape): Use the new
5614 assertPointListEquals instead of assertFloatTuplesEqual
5615
5616 2003-08-06 Jan-Oliver Wagner <[email protected]>
5617
5618 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
5619 a bounding box. A dialog is raised in case, no bounding box
5620 is found. This fixes bug #2043:
5621 https://intevation.de/rt/webrt?serial_num=2043
5622
5623 2003-08-05 Bernhard Herzog <[email protected]>
5624
5625 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
5626 object look like a Color instantiation. Formerly it looked like a
5627 tuple.
5628
5629 * test/test_color.py (TestColor.test_repr)
5630 (TestColor.test_equality, TestColor.test_inequality): New. test
5631 some more apects of the Color class
5632 (TestTransparent.test_repr, TestTransparent.test_hex)
5633 (TestTransparent.test_equality): New. Test cases for the
5634 Transparent object.
5635
5636 2003-08-04 Jan-Oliver Wagner <[email protected]>
5637
5638 * Doc/manual/thuban-manual.xml: a number of small improvements.
5639 The resulting file is the version submitted for GREAT-ER II.
5640
5641 2003-08-01 Bernhard Herzog <[email protected]>
5642
5643 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
5644 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
5645 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
5646
5647 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
5648 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
5649 (ThubanEndBusyCursor): Add doc-strings
5650
5651 2003-08-01 Bernhard Herzog <[email protected]>
5652
5653 First step towards PostGIS integration. More abstraction by movin
5654 more code from the layer to the shapestore. More methods of the
5655 layer are now simply delegated to the equivalent method of the
5656 shapestore. The SHAPETYPE_* constants are now in data not in
5657 layer.
5658
5659 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5660 (SHAPETYPE_POINT, Shape): Move these constants and classes from
5661 layer.py to data.py
5662 (ShapefileStore.__init__): More Initialization for the new methods
5663 and functionality.
5664 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
5665 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
5666 (ShapefileStore.Shape): New methods that were formerly implemented
5667 in the layer.
5668 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
5669 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
5670 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
5671 equivalents of the new shape methods. These versions are simply
5672 delegated to the original shapstore.
5673
5674 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5675 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
5676 (Layer.SetShapeStore): Removed the initializatin of instance
5677 variables that were needed for the stuff that's now in
5678 ShapefileStore
5679 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
5680 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
5681 shapestore.
5682
5683 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
5684 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
5685 instead of layer.
5686
5687 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
5688
5689 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
5690
5691 * test/test_layer.py: Import the SHAPETYPE_* constants from data
5692 instead of layer.
5693 (TestLayer.test_derived_store): Remove the test for the exception
5694 when instantiating the DerivedShapeStore with an incompatible
5695 table which is now in test_derivedshapestore.py. Add some more
5696 tests of the layer methods to determine whether they work for a
5697 DerivedShapeStore as well.
5698
5699 2003-07-31 Jonathan Coles <[email protected]>
5700
5701 * Doc/manual/thuban-manual.xml: Fix the list of required packages
5702 by just listing the name and where they can be found.
5703
5704 2003-07-31 Frank Koormann <[email protected]>
5705
5706 * Doc/manual/thuban-manual.xml:
5707 Changed the screenshot elements to figure.
5708 Changed some variablelist elements to itemizedlist.
5709 Added section on GDAL formats.
5710
5711 2003-07-31 Jonathan Coles <[email protected]>
5712
5713 * Doc/manual/thuban-manual.xml: Added a few sentences about
5714 the Fix Border Color option when generating classes.
5715
5716 2003-07-30 Jonathan Coles <[email protected]>
5717
5718 * Thuban/Model/classgen.py: Add docstrings. Rename specific
5719 Ramp instances to use lower_case_style.
5720
5721 * Thuban/UI/classgen.py: Use renamed Ramp instances.
5722
5723 * Thuban/UI/classifier.py: Add docstrings.
5724
5725 * Thuban/UI/dock.py: Add docstrings.
5726
5727 * test/test_classgen.py: Use renamed Ramp instances.
5728
5729 2003-07-30 Bernhard Herzog <[email protected]>
5730
5731 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5732 was never used in Thuban.
5733
5734 2003-07-30 Bernhard Herzog <[email protected]>
5735
5736 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5737 method directly instead of going through the transient_table
5738 method. This faster because transient_table may force the copy of
5739 a DBF file into the transient database and setting a table's title
5740 doesnm't affect the title of the associated transient table, so
5741 this fixes RT #2042
5742
5743 * Thuban/UI/main.py (__version__): Don't import the already
5744 removed show_exception_dialog.
5745
5746 2003-07-29 Jonathan Coles <[email protected]>
5747
5748 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5749 Put back this method and remove the equivalent function since we
5750 are setting the exception hook from within this class (OnInit).
5751
5752 2003-07-29 Jonathan Coles <[email protected]>
5753
5754 * Doc/manual/images/5_2_custom_ramp.png,
5755 Doc/manual/images/5_2_quantiles.png,
5756 Doc/manual/images/5_2_uniform_dist.png,
5757 Doc/manual/images/5_2_unique_values.png,
5758 Doc/manual/images/8_int_error.png: New screen shots.
5759
5760 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5761 some points, and added more screen shots.
5762
5763 2003-07-29 Bernhard Herzog <[email protected]>
5764
5765 * Thuban/Model/data.py: Remove the now unused import of warnings
5766
5767 2003-07-29 Bernhard Herzog <[email protected]>
5768
5769 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5770 deprecated since before the 0.8 release and isn't used in Thuban
5771 itself anymore.
5772
5773 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5774
5775 2003-07-29 Jonathan Coles <[email protected]>
5776
5777 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5778 python exception hook here so that we are sure to catch any
5779 Thuban exception that happen during initialization.
5780
5781 * Thuban/UI/main.py (main): Don't set the exception hook here,
5782 it will get set in ThubanApplication.OnInit.
5783
5784 2003-07-29 Jonathan Coles <[email protected]>
5785
5786 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5787 Removed and called it show_exception_dialog() so that the exception
5788 handler can be set before the class is created.
5789
5790 * Thuban/UI/main.py (main): Install the exception handler before
5791 a ThubanApplication is created.
5792
5793 2003-07-29 Bernhard Herzog <[email protected]>
5794
5795 * po/it.po: New. Italian translation by Maurizio Napolitano
5796
5797 * po/ru.po: New. Russian translation by Alex Shevlakov
5798
5799 2003-07-29 Frank Koormann <[email protected]>
5800
5801 * Doc/manual/thuban-manual.xml: Extended section on supported
5802 projections.
5803
5804 2003-07-29 Frank Koormann <[email protected]>
5805
5806 * Doc/manual/thuban-manual.xml: gaspell-checked.
5807
5808 2003-07-29 Jonathan Coles <[email protected]>
5809
5810 * Doc/manual/images/3_5_legend.png: Added border to improve look
5811 on white background.
5812
5813 2003-07-29 Jonathan Coles <[email protected]>
5814
5815 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5816 descriptions for the legend toolbar.
5817
5818 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5819 cursor from dialog box.
5820
5821 2003-07-28 Jonathan Coles <[email protected]>
5822
5823 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5824
5825 * Doc/manual/images/2_4_session_tree.png,
5826 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5827 Doc/manual/images/4_2_layer_properties.png,
5828 Doc/manual/images/4_2_raster_layer_properties.png,
5829 Doc/manual/images/5_3_genclass.png,
5830 Doc/manual/images/5_classification.png,
5831 Doc/manual/images/6_projection.png,
5832 Doc/manual/images/7_1_table_view.png,
5833 Doc/manual/images/7_2_5_join.png: New screenshots.
5834
5835 2003-07-24 Jonathan Coles <[email protected]>
5836
5837 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5838
5839 2003-07-24 Jonathan Coles <[email protected]>
5840
5841 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5842 chapter on Layer Management.
5843
5844 * Doc/manual/Makefile: New. Makefile to generate all formats for the
5845 manual and images.
5846
5847 2003-07-24 Bernhard Herzog <[email protected]>
5848
5849 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5850 it annoys lintian which warns about these files not being
5851 executable. The #! isn't necessary here since if you absolutely
5852 must execute them you can always say "python <filename>".
5853
5854 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5855 superfluous code to set brush and pen for point shapes
5856
5857 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5858 belong in viewport anyway
5859
5860 2003-07-24 Frank Koormann <[email protected]>
5861
5862 * Doc/manual/thuban-manual.xml: Added section on table management.
5863
5864 2003-07-24 Bernhard Herzog <[email protected]>
5865
5866 * test/runtests.py (main): Recognize the long "verbose" option
5867 correctly.
5868
5869 2003-07-22 Jonathan Coles <[email protected]>
5870
5871 * Doc/manual/thuban-manual.xml: Continue to write first revision
5872 of the manual.
5873
5874 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5875 with Begin/EndDrawing() calls to ensure we aren't doing to
5876 many updates to the dc during rendering.
5877 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5878 a pen and brush argument so they need to be passed to the function.
5879
5880 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5881 Calculates the minimum and maximum scale values. Factored out
5882 of set_view_transform so that it could be used to zoom all the
5883 way into a single point.
5884 (ViewPort.set_view_transform): Call calc_min_max_scales().
5885 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5886 if only a single point is selected.
5887
5888 * Doc/manual/images/1_2_legend_close.png,
5889 Doc/manual/images/1_2_legend_dock.png,
5890 Doc/manual/images/1_2_mainwindow.png,
5891 Doc/manual/images/1_2_mainwindow.ps,
5892 Doc/manual/images/1_2_mainwindow.sk,
5893 Doc/manual/images/3_2_fullextent.png,
5894 Doc/manual/images/3_2_fulllayerextent.png,
5895 Doc/manual/images/3_2_fullshapeextent.png,
5896 Doc/manual/images/3_2_pan.png,
5897 Doc/manual/images/3_2_zoomin.png,
5898 Doc/manual/images/3_2_zoomout.png,
5899 Doc/manual/images/3_3_identify.png,
5900 Doc/manual/images/3_3_label.png,
5901 Doc/manual/images/3_5_invisible.png,
5902 Doc/manual/images/3_5_movedown.png,
5903 Doc/manual/images/3_5_moveup.png,
5904 Doc/manual/images/3_5_props.png,
5905 Doc/manual/images/3_5_tobottom.png,
5906 Doc/manual/images/3_5_totop.png,
5907 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5908
5909 2003-07-18 Bernhard Herzog <[email protected]>
5910
5911 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5912
5913 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5914 after the new map has been assigned
5915
5916 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5917 Delegate MAP_REPLACED to the canvas too
5918 (MainWindow.prepare_new_session): Removed. Thanks to the new
5919 MAP_REPLACED message it's no longer needed
5920 (MainWindow.OpenSession, MainWindow.NewSession):
5921 prepare_new_session has been removed.
5922
5923 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5924 MAP_REPLACED so that we can close the dialog if a new map is set.
5925 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5926 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5927 dialog
5928
5929 * test/test_viewport.py (SimpleViewPortTest)
5930 (SimpleViewPortTest.test_default_size): Add doc-strings
5931 (ViewPortTest.setUp): Bind map to self.map so we can use it in
5932 tests. Subscribe to MAP_REPLACED messages too.
5933 (ViewPortTest.tearDown): No need to explicitly unsubscribe
5934 (ViewPortTest.test_set_map): New test for the SetMap method.
5935
5936 2003-07-18 Bernhard Herzog <[email protected]>
5937
5938 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5939 Move this test from ViewPortTest.setUp to this new separate test
5940 case. setUp is not the place for the actual tests.
5941 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5942 more of the test from setUp to the new test test_inital_settings.
5943 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5944 (ViewPortTest.test_proj_conv): Split test_proj_conv into
5945 test_win_to_proj and test_proj_to_win and make the tests easier to
5946 understand
5947 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5948 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5949 (ViewPortTest.test_unprojected_rect_around_point)
5950 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5951 Reformat to increase readability.
5952
5953 2003-07-18 Bernhard Herzog <[email protected]>
5954
5955 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5956
5957 2003-07-18 Bernhard Herzog <[email protected]>
5958
5959 * test/runtests.py: The test suite can now be run without an X
5960 connection. To make sure this remains true, remove the DISPLAY
5961 environment variable so that an error occurs if the wxGTK is
5962 imported accidentally
5963
5964 2003-07-18 Bernhard Herzog <[email protected]>
5965
5966 * Thuban/UI/viewport.py: Remove unused imports
5967
5968 * Thuban/UI/view.py: Remove unused imports
5969
5970 2003-07-18 Bernhard Herzog <[email protected]>
5971
5972 * test/test_export.py Remove unused imports. The OutputTransform
5973 function is now in viewport.py and is called output_transform
5974 (TestScalebar.test_output_transform)
5975 (TestScalebar.test_OutputTransform): Renamed to
5976 test_output_transform and updated to use output_transform instead
5977 of OutputTransform
5978
5979 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5980 renamed.
5981 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5982 renamed to output_transform
5983
5984 * Thuban/UI/viewport.py (OutputTransform, output_transform):
5985 Rename to output_transform
5986
5987 2003-07-18 Bernhard Herzog <[email protected]>
5988
5989 * Thuban/Model/layer.py (Layer.__init__): Rename
5990 classificationField to classificatin_column and init it here so
5991 that it can be used in SetClassificationColumn
5992 (Layer.GetClassificationColumn, Layer.GetClassificationField):
5993 Rename to GetClassificationColumn.
5994 (Layer.SetClassificationColumn, Layer.SetClassificationField):
5995 Rename to SetClassificationColumn and issue a LAYER_CHANGED
5996 message if the column changes.
5997 (Layer._classification_changed, Layer.ClassChanged): Rename to
5998 _classification_changed. Update the callers.
5999 (Layer.SetShapeStore): Further field->column renames.
6000
6001 * Thuban/Model/load.py (SessionLoader.start_classification)
6002 (SessionLoader.start_clpoint): Updates because of
6003 field->column method name changes in the Layer class
6004
6005 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6006 because of field->column method name changes in the Layer class
6007
6008 * Thuban/UI/classifier.py (Classifier.__init__)
6009 (Classifier._OnTry, Classifier._OnRevert): Updates because of
6010 field->column method name changes in the Layer class
6011
6012 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6013 because of field->column method name changes in the Layer class
6014
6015 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6016 of field->column method name changes in the Layer class
6017
6018 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6019 (SaveSessionTest.testClassifiedLayer): Update because of
6020 field->column method name changes in the Layer class
6021
6022 * test/test_layer.py (SetShapeStoreTests.setUp)
6023 (SetShapeStoreTests.test_sanity): Update because of field->column
6024 method name changes in the Layer class
6025 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6026 (TestLayerModification.test_sanity)
6027 (TestLayerModification.test_initial_settings): remove unsued code
6028 and rename to test_sanity.
6029 (TestLayerModification.test_set_classification): New test for
6030 SetClassification and SetClassificationField.
6031
6032 2003-07-18 Bernhard Herzog <[email protected]>
6033
6034 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6035 the non-fixed values as well. The old test would have accepted a
6036 fixed ramp that only returnes the fixed properties
6037
6038 2003-07-17 Jonathan Coles <[email protected]>
6039
6040 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6041 shots for the manual. The XCF file is the source image and
6042 has additional layers to support changes.
6043
6044 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6045
6046 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6047 Return both the new class and the field name.
6048
6049 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6050 fit the map to the window as this changes any zoom level that
6051 the user may have set.
6052
6053 2003-07-16 Jonathan Coles <[email protected]>
6054
6055 * Thuban/Model/classgen.py (generate_singletons,
6056 generate_uniform_distribution, generate_quantiles): Remove
6057 fixes parameter, but maintain the same functionality by having
6058 the calling function pass a FixedRamp object for the ramp.
6059 (FixedRamp): New. Adapts a ramp to have fixed property values.
6060
6061 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6062 (Classification): Inherit from Publisher.
6063 (Classification.__init__): Remove the layer parameter.
6064 Classifications no longer need to have a parent layer.
6065 (Classification.GetField, Classification.GetFieldType,
6066 Classification.SetFieldInfo): Removed. The field name is stored
6067 in the layer, and the type can be retreived by calling
6068 Layer.GetFieldType().
6069 (Classification._set_layer, Classification.GetLayer): Removed.
6070 Classifications no longer have a parent layer.
6071
6072 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6073 classification.
6074 (Layer.SetShapeStore): Reset the classification first while
6075 we still have the old shape store to work with.
6076 (Layer.GetClassificationField, Layer.SetClassificationField):
6077 New. Method for getting/setting the field to classify on.
6078 (Layer.SetClassification): Simplified now that the layer
6079 simply has to hold a reference to the classification and not
6080 tell the classification who owns it.
6081 Fixes RTbug #2023.
6082
6083 * Thuban/Model/load.py (SessionLoader.start_classification):
6084 Set the field name on the layer, not the classification.
6085
6086 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6087 classification is modified.
6088
6089 * Thuban/Model/save.py (SessionSaver.write_classification):
6090 Get the field name and type from the layer.
6091
6092 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6093 parameter records to rows and add docstring. Fixes RTbug #1997.
6094
6095 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6096 ramp when we need to fix certain values of a ramp rather than
6097 using the old fixes parameter. Fixes RTbug #2024.
6098
6099 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6100 parameter.
6101 (ClassTable.Reset): Add fieldType parameter and use it, rather
6102 than asking the classification.
6103 (Classifier.__init__): Remember the original class's field
6104 and ask the layer for the field type, rather than the classification.
6105 (Classifier.__SetGridTable): Retrieve the field and field type
6106 for the table because they are not in the classification.
6107 (Classifier._OnTry, Classifier._OnRevert): Set the classification
6108 field on the layer in addition to the classification itself.
6109
6110 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6111 classification field from layer.
6112
6113 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6114 classification field from layer. Split up tests and remove
6115 *-imports. Fixes RTbug #1992.
6116
6117 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6118
6119 * test/test_classification.py
6120 (TestClassification.test_classification): Remove tests for methods
6121 that no longer exist.
6122
6123 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6124 __init__ no longer has a field parameter, use SetClassificationField.
6125 (SetShapeStoreTests.test_sanity): Use layer object to get class
6126 field info.
6127
6128 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6129 SetClassificationField on layer to set class field info.
6130
6131 * test/test_viewport.py: Renamed from test/test_view.py.
6132
6133 2003-07-16 Jan-Oliver Wagner <[email protected]>
6134
6135 * Doc/manual/thuban-manual.xml: Added authors and an initial
6136 coarse structure.
6137
6138 2003-07-15 Bernhard Herzog <[email protected]>
6139
6140 * test/support.py (FloatComparisonMixin): This is a mix-in class
6141 and therefore should not be derived from any other class.
6142
6143 * test/test_range.py (RangeTest): FloatComparisonMixin is a
6144 mix-in, so derive from TestCase as well.
6145
6146 2003-07-15 Bernhard Herzog <[email protected]>
6147
6148 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6149 draw_func handling a bit to remove one layer of indirection. This
6150 makes the renderer about 10% faster in the non-classifying case
6151 and the code a bit cleaner
6152 (MapRenderer.draw_point_shape): Add the pen and brush parameters
6153 and set them in the dc. Now the draw_point_shape method and
6154 wxproj's draw_polygon_shape function have basically the same
6155 signature so that both can be directly used as draw_func
6156
6157 2003-07-15 Bernhard Herzog <[email protected]>
6158
6159 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6160 string values (in addition to the labels) as UTF 8
6161
6162 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6163 values if the field type is string
6164
6165 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6166 saving a session with non-ascii string classification values.
6167
6168 * test/test_load.py (TestClassification.file_contents)
6169 (TestClassification.test): Check for non-ascii values in string
6170 classifications
6171
6172 2003-07-14 Jonathan Coles <[email protected]>
6173
6174 * test/test_view.py: New. Tests for ViewPort.
6175
6176 2003-07-14 Frank Koormann <[email protected]>
6177
6178 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6179 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6180
6181 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6182 unicode strings from session file: session title, map title and
6183 projection name.
6184
6185 2003-07-10 Jonathan Coles <[email protected]>
6186
6187 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6188 drag_stop, not drag_move when the mouse is released.
6189
6190 2003-07-10 Jonathan Coles <[email protected]>
6191
6192 The most important part of this is the seperation of view.py into
6193 two pieces. viewport.py now has a class called ViewPort which
6194 contains all the non-wx parts of view.py and can therefore be
6195 tested. view.py contains only the wx-specific parts and is fairly
6196 simple.
6197
6198 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6199 RTTbug #1992.
6200 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6201 RTTbug #1992.
6202
6203 * Thuban/Model/classgen.py (generate_singletons,
6204 generate_uniform_distribution, generate_quantiles):
6205 Added 'fixes' parameter so that property attributes can
6206 be held constant over the generated classification groups.
6207 (CustomRamp.GetProperties): Remove unused variables.
6208
6209 * Thuban/Model/map.py (Map.SetProjection): Send the old
6210 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6211 event.
6212
6213 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6214 parameter which is a list of records that restricts which
6215 records are saved. Fixes RTbug #1997.
6216
6217 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6218 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6219
6220 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6221 to allow the user to fix line color/width on generated groups.
6222 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6223 functions to optionally fix group properties.
6224
6225 * Thuban/UI/main.py (main): Set exception hook to the
6226 ShowExceptionDialog. Fixes RTbug #1993.
6227
6228 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6229 the table window when it is selectd to be shown.
6230
6231 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6232 Export Selection button and move the export buttons underneath
6233 the table.
6234 (QueryTableFrame.UpdateStatusText): Added event argument so
6235 that it can respond to grid selection events. The status text
6236 is now updated even when the table is not associated with a
6237 layer as was previously assumed.
6238 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6239 UpdateStatusText responds to these events.
6240 (QueryTableFrame.OnSaveAs): Renamed to doExport.
6241 (QueryTableFrame.doExport): Helper function that saves the
6242 entire table, or selected rows, to a file.
6243 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6244 Respond to export button events and call doExport.
6245
6246 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6247 the function doesn't return NULL without first setting a Python
6248 Error.
6249
6250 * test/runtests.py (main): Only print "Unknown option" for
6251 unsupported options.
6252
6253 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6254 optional epsilon argument to specify floating point accuracy.
6255 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6256 for each item test.
6257
6258 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6259 tests for saving selected records.
6260
6261 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6262 tests for saving selected records.
6263
6264 * test/test_map.py (TestMapWithContents.test_set_projection):
6265 MAP_PROJECTION_CHANGED events send the old projection.
6266
6267 * test/test_session.py
6268 (TestSessionWithContent.test_forward_map_projection):
6269 MAP_PROJECTION_CHANGED events send the old projection.
6270
6271 * test/test_table.py (TableTest): Update tests to use non-deprecated
6272 functions.
6273
6274 2003-07-08 Bernhard Herzog <[email protected]>
6275
6276 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6277 constants in the column objects are the standard ones defined in
6278 the table module.
6279
6280 * test/test_transientdb.py
6281 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6282 exporting transient tables as DBF works. This should catch the bug
6283 just fixed in TransientTableBase.Width.
6284
6285 2003-07-08 Bernhard Herzog <[email protected]>
6286
6287 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6288 interpolated colors correctly.
6289
6290 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6291 New. Test case for the fix in classgen.py
6292
6293 2003-07-08 Bernhard Herzog <[email protected]>
6294
6295 * test/runtests.py (main): Make the default output less verbose
6296 and add a verbosity option (-v) to get the old output
6297
6298 2003-07-08 Bernhard Herzog <[email protected]>
6299
6300 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6301 0.9.
6302
6303 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6304 New. Return the join type
6305
6306 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6307 DTD
6308 (SessionSaver.write_data_containers): Save the join type for
6309 joined tables
6310
6311 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6312 namespace
6313 (SessionLoader.start_jointable): Handle the jointype attribute
6314
6315 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6316 as of Thuban 0.8. These are now tests to determine whether Thuban
6317 can still read files generated by Thuban 0.8
6318
6319 * test/test_load.py (LoadSessionTest.dtd)
6320 (TestSingleLayer.file_contents)
6321 (TestLayerVisibility.file_contents, TestLabels.file_contents)
6322 (TestLayerProjection.file_contents)
6323 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6324 (TestJoinedTable.file_contents)
6325 (TestLoadError.file_contents): Update for new DTD
6326 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6327 for new join type attribute
6328
6329 * test/test_save.py (SaveSessionTest.dtd)
6330 (SaveSessionTest.testEmptySession)
6331 (SaveSessionTest.testSingleLayer)
6332 (SaveSessionTest.testLayerProjection)
6333 (SaveSessionTest.testRasterLayer)
6334 (SaveSessionTest.testClassifiedLayer)
6335 (SaveSessionTest.test_dbf_table)
6336 (SaveSessionTest.test_joined_table): Update for new DTD
6337 (SaveSessionTest.test_joined_table): Add test for new join type
6338 attribute
6339
6340 2003-07-04 Bernhard Herzog <[email protected]>
6341
6342 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6343 function for table_to_dbf
6344 (table_to_dbf): Deal with names longer than the 10 character limit
6345
6346 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6347 doc-string
6348 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6349 long column names
6350
6351 2003-07-03 Bernhard Herzog <[email protected]>
6352
6353 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6354
6355 2003-07-03 Bernhard Herzog <[email protected]>
6356
6357 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6358 for the Thuban manual and README with some basic information about
6359 the manual
6360
6361 2003-07-03 Bernhard Herzog <[email protected]>
6362
6363 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6364 Update doc-string
6365 (TransientJoinedTable.create): Do not modify the column objects of
6366 the input tables in place and copy all columns of the input tables
6367 into the joined table after all.
6368
6369 * test/test_transientdb.py
6370 (TestTransientTable.test_transient_joined_table_same_column_name):
6371 Update to reflect the new behavior
6372 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6373 Update to reflect the new behavior
6374 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6375 New test case for a bug which modified the column objects in place
6376
6377 2003-07-02 Jonathan Coles <[email protected]>
6378
6379 * Thuban/Model/classgen.py (generate_singletons,
6380 generate_uniform_distribution, generate_quantiles,
6381 GenQuantiles0): Make sure maxValue isn't less than
6382 one, otherwise we could divide by zero.
6383
6384 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6385 ClassGenTest.doClassSingleTest): Call doBoundsTest to
6386 check the end classification groups against the
6387 proper property values.
6388 (ClassGenTest.doBoundsTest): New. Checks the first and
6389 last classification groups to make sure their properties
6390 are the correct upper and lower bounds for a color ramp.
6391
6392 2003-07-02 Jonathan Coles <[email protected]>
6393
6394 * Thuban/Model/classgen.py (generate_singletons,
6395 generate_uniform_distribution, generate_quantiles,
6396 GenQuantiles0): The denominator was one to high when
6397 calculating the index for the ramp causing the index
6398 to never to reach one.
6399
6400 2003-07-02 Jonathan Coles <[email protected]>
6401
6402 Changed the singature of ClassGroupRange.__init__ and
6403 ClassGroupRange.SetRange() so that the min/max values are
6404 passed as a tuple. This makes a better calling scheme for
6405 when a Range object is passed instead.
6406
6407 * Thuban/Model/classgen.py: Fixed parameters to
6408 ClassGroupRange constructor.
6409
6410 * Thuban/Model/classification.py (ClassGroupRange.__init__):
6411 Consolidate the min/max parameters into a single _range which
6412 can either be a tuple or a Range object.
6413 (ClassGroupRange.SetRange): Consolidate the min/max parameters
6414 into a single _range which can either be a tuple or a Range object.
6415
6416 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6417 call to ClassGroupRange constructor to use a tuple.
6418
6419 * Thuban/Model/layer.py (Layer.SetClassification): Switch
6420 the classification instance variable to the new class
6421 before calling _set_layer otherwise subscribers to a
6422 LAYER_CHANGED event will not see any difference.
6423
6424 * test/test_classification.py: Fix tests of ClassGroupRange
6425 so that they use the new signature.
6426
6427 * test/test_load.py: Fix use of ClassGroupRange so that it
6428 uses the new signature.
6429
6430 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6431 uses the new signature.
6432
6433 * test/test_save.py: Fix use of ClassGroupRange so that it
6434 uses the new signature.
6435
6436
6437 2003-07-01 Jonathan Coles <[email protected]>
6438
6439 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6440 Import used objects/class from color.
6441 (generate_singletons): We don't
6442 need the numGroups parameter anymore because we are using
6443 the new ramps with GetProperties().
6444 (generate_uniform_distribution): Use new ramp method
6445 GetProperties().
6446 (generate_quantiles, GenQuantiles0): Use new ramp method
6447 GetProperties().
6448 (CustomRamp.SetNumGroups): Removed. The ramps now map
6449 a value from 0 to 1 to class properties so the number
6450 of groups is not needed ahead of time.
6451 (CustomRamp.next): Removed. CustomRamp does not support
6452 interation anymore.
6453 (CustomRamp.GetProperties): Returns a ClassGroupProperties
6454 object based on the index value from 0 to 1 that is
6455 passed to it.
6456 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6457 Made into instances of Monochromatic class instread of
6458 deriving from it.
6459 (HotToCold.SetNumGroups): Removed. See CustomRamp.
6460 (HotToCold.next): Removed. See CustomRamp.
6461
6462 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6463 (Classification.SetField, Classification.SetFieldType):
6464 Replaced with SetFieldInfo.
6465 (Classification.SetFieldInfo): New. Does a better job of
6466 what SetField and SetFieldType used to do by combining
6467 their function since they should really always be done
6468 at the same time.
6469 (Classification.SetLayer): Renamed to _set_layer.
6470 (Classification._set_layer): Should only be called from
6471 Layer's SetClassification. This does not cause a recursive
6472 call as SetLayer did because we know that Layer knows about
6473 the classification.
6474
6475 * Thuban/Model/color.py: Fixes RTbug #1971.
6476 (_Transparent): Renamed from Transparent so it doesn't
6477 conflict with the module variable.
6478 (Transparent, Black): Renamed from Color.Transparent,
6479 Color.Black so they are not class variables.
6480
6481 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6482 (Layer.Destroy): We don't need to call SetClassification
6483 anymore to clear out the back reference in the classifcation
6484 to the layer. It's better to set it to None using _set_layer,
6485 and we won't be creating another clas object too.
6486 (Layer.SetClassification): Classification._set_layer is not
6487 recursive so remove all the locking variables. Also clean
6488 up the code so that it remains unchanged if something fails.
6489
6490 * Thuban/Model/load.py: Fixes RTbug #1971.
6491 (SessionLoader.start_classification): Call
6492 Classification.SetFieldInfo().
6493
6494 * Thuban/Model/save.py: Removed import of Color which wasn't
6495 being used.
6496
6497 * Thuban/UI/classgen.py: Fixes RTbug #1972.
6498 (ClassGenDialog.__init__): Color ramps are now instances
6499 already so we don't need to create any new objects.
6500 (ClassGenDialog.OnOK): Check for numGroups is no longer
6501 necessary because we never use it.
6502
6503 * Thuban/UI/classifier.py: Fixes RTbug #1971.
6504 (Classifier.__BuildClassification, Classifier.__SetGridTable):
6505 Call Classification.SetFieldInfo() instead of SetFieldType.
6506
6507 * Thuban/UI/renderer.py: Fixes RTbug #1971.
6508
6509 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6510 (MapCanvas.__init__): Subscribe to the idle time event. Set
6511 background color to white.
6512 (MapCanvas.OnPaint): Set a flag indicating that we should
6513 render the map during idle time. If we already have a bitmap
6514 just draw it now.
6515 (MapCanvas.OnIdle): New. Render the map only during idle time.
6516 This also fixes a problem with the busy cursor under gtk.
6517
6518 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6519 Fix calls to generate_singletons because the signature changed.
6520
6521 * test/test_classification.py: Fix color references and
6522 change calls to Classification.[SetField|SetFieldType] to
6523 SetFieldInfo.
6524
6525 * test/test_load.py: Fix color references.
6526
6527 * test/test_load_0_2.py: Fix color references.
6528
6529 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6530 Change calls to Classification.[SetField|SetFieldType] to
6531 SetFieldInfo.
6532
6533 2003-07-01 Frank Koormann <[email protected]>
6534
6535 MERGE from the greater-ms3 branch.
6536
6537 * test/test_transientdb.py
6538 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6539 New. Test join of two tables with partly equal column names.
6540
6541 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6542 If duplicates in left and right tables column names are found,
6543 append '_' (underscores) to the name until it is unique.
6544 Create always new internal names for the resulting table and reference
6545 columns in the join statement with <table>.<column>
6546
6547 2003-07-01 Bernhard Herzog <[email protected]>
6548
6549 * test/test_transientdb.py
6550 (TestTransientTable.test_transient_joined_table_same_column_name):
6551 New. Test whether joining on columns with the same names in both
6552 tables works.
6553
6554 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6555 sure to use the right internal names even when joining on field
6556 with the same names in both tables. Also, detect duplicate names
6557 in the joined table correctly.
6558
6559 2003-07-01 Frank Koormann <[email protected]>
6560
6561 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6562 Reverse List of layers to render in same order as in desktop legend.
6563
6564 2003-06-30 Jonathan Coles <[email protected]>
6565
6566 * Thuban/version.py (make_tuple): Takes a version string
6567 and splits it into a tuple of at most three integers.
6568 Used make_tuple() to make tuple versions of the version
6569 numbers.
6570
6571 * Thuban/UI/about.py: Add Thuban email addresses.
6572
6573 2003-06-30 Jonathan Coles <[email protected]>
6574
6575 * Thuban/version.py: SQLite/PySQLite version dependencies
6576 were too high.
6577
6578 2003-06-30 Jonathan Coles <[email protected]>
6579
6580 * Thuban/version.py: Update version to 0.8.1
6581
6582 * MANIFEST.in: Added Projections so that default.proj is
6583 included.
6584
6585 2003-06-26 Jonathan Coles <[email protected]>
6586
6587 New About box with lots more information including library
6588 versions and credits. More/better version checking before
6589 Thuban starts.
6590
6591 * Thuban/UI/about.py: New. New About box that displays
6592 library version information and credits.
6593
6594 * Thuban/version.py: Added new 'versions' dictionary which
6595 contains the verions of various libraries which are checked
6596 when the module loads.
6597 (verify_versions): Check all version numbers and returns
6598 a list of errors.
6599
6600 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6601 Reset the status of the buttons as the situation warrants,
6602 but in a better more reliable way by not relying on the
6603 current status to determine what needs to change.
6604
6605 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6606 (verify_versions): Remove most of the code since it is
6607 now in Thuban.version.verify_versions.o
6608
6609 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6610 About box in Thuban.UI.about.
6611
6612 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
6613 Returns the version of gdal library being used as a string.
6614
6615 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6616 Removed.
6617 (get_proj_version): Return the version of PROJ that the file
6618 was compiled with.
6619 (get_gtk_version): Return th version of GTK that the file
6620 was compiled with.
6621
6622 2003-06-25 Jonathan Coles <[email protected]>
6623
6624 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
6625 of the SelectPropertiesDialog should be self so the window
6626 appears on top.
6627 (ClassGroupPropertiesCtrl.DoEdit): The parent
6628 of the SelectPropertiesDialog should be self so the window
6629 appears on top.
6630
6631 * Thuban/UI/resource.py: Cleaned up how we determine file
6632 extensions.
6633 (GetImageResource): Return an wxImage from our Resources.
6634
6635 2003-06-24 Jonathan Coles <[email protected]>
6636
6637 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6638 Check that a layer has a classification before trying
6639 to get it. Raster layers don't have classifications.
6640
6641 2003-06-23 Jonathan Coles <[email protected]>
6642
6643 * setup.py: Add Resources/XML to resource list.
6644
6645 2003-06-23 Jonathan Coles <[email protected]>
6646
6647 * setup.cfg: Fix copyright dates
6648
6649 2003-06-23 Jonathan Coles <[email protected]>
6650
6651 * MANIFEST.in: Update with Resources/XML
6652
6653 * setup.py: Don't include Locale resources yet as we don't
6654 have any and it causes problems building the distribution
6655 for Windows. Update version to 0.8.0.
6656
6657 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
6658
6659 * Thuban/UI/mainwindow.py: Add blank line at the end because
6660 file was not being read correctly building the Windows
6661 distribution.
6662
6663 2003-06-23 Jonathan Coles <[email protected]>
6664
6665 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
6666
6667 * Thuban/version.py: Temporarily update longversion for
6668 the 0.8 release so that it doesn't have the cvs revision.
6669
6670 2003-06-23 Jonathan Coles <[email protected]>
6671
6672 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
6673 to make sure that we don't create reentrant possibilities with
6674 wxYield.
6675
6676 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
6677 directly to avoid the wxSafeYield() call which generates an
6678 OnPaint event causing infinite recursion. Don't try to catch
6679 exception anymore. This was for before there were limits on map
6680 scaling.
6681
6682 2003-06-23 Bernhard Herzog <[email protected]>
6683
6684 Bug fix for RT #1961:
6685
6686 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
6687 Register DerivedShapestores with the session
6688
6689 * Thuban/Model/session.py (Session.Tables): Make sure each table
6690 is only listed once.
6691
6692 * test/test_load.py (TestJoinedTable.test): Add check_format call.
6693 Update file contents to match the one written out.
6694
6695 2003-06-20 Bernhard Herzog <[email protected]>
6696
6697 * test/xmlsupport.py (SaxEventLister.startElementNS)
6698 (SaxEventLister.endElementNS): Do not include the qname. Python
6699 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6700 is (presumably incorrectly) None, whereas it's a string with the
6701 element name in the later versions.
6702
6703 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6704 (TestEventList.test_even_list_namespace): Update tests to reflect
6705 the new behaviour
6706 (TestEventList.test_even_list_id_normalization): Fix doc-string
6707
6708 2003-06-20 Jonathan Coles <[email protected]>
6709
6710 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6711 by deriving classes to determine if that layer supports shapes.
6712 (Layer): Override HasShapes and return true.
6713
6714 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6715 instead of a direct call to wx[Begin|End]CusyCursor().
6716 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6717 table data.
6718
6719 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6720 New. Wrappers around the wxWindows functions that allow us to
6721 make additional calls such as wxYield which gives the native
6722 system a chance to update the cursor correctly.
6723
6724 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6725 instead of a direct call to wx[Begin|End]CusyCursor().
6726
6727 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6728 instead of a direct call to wx[Begin|End]CusyCursor().
6729 (MapCanvas.find_shape_at): Check if the current search layer
6730 support shapes, otherwise go on to the next layer.
6731
6732 * test/test_layer.py: Add tests in each type of layer for
6733 HasClassification() and HasShapes()
6734
6735 2003-06-20 Jonathan Coles <[email protected]>
6736
6737 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6738 turning on the busy cursor to allow the system to change the
6739 cursor before we begin painting. This fixes a problem that
6740 was occuring only under GTK. Fixes RTbug #1840.
6741
6742 2003-06-20 Bernhard Herzog <[email protected]>
6743
6744 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6745 version.
6746
6747 * Thuban/Model/save.py (sort_data_stores): New. Make topological
6748 sort of the data sources so they can be written with sources that
6749 data sources that depend on other data sources come after the
6750 sources they depend on.
6751 (SessionSaver.__init__): Add idmap instance variable to map from
6752 objects to the ids used in the file.
6753 (SessionSaver.get_id, SessionSaver.define_id)
6754 (SessionSaver.has_id): New. Methods to manage the idmap
6755 (SessionSaver.write): Use thuban-0.8.dtd
6756 (SessionSaver.write_session): Add a namespace on the session and
6757 write out the data sources before the maps.
6758 (SessionSaver.write_data_containers): New. Write the data
6759 containers.
6760 (SessionSaver.write_layer): Layer elements now refer to a
6761 shapestore and don't contain filenames anymore.
6762
6763 * Thuban/Model/load.py (LoadError): Exception class to raise when
6764 errors in the files are discovered
6765 (SessionLoader.__init__): Define dispatchers for elements with a
6766 thuban-0.8 namespace too.
6767 (SessionLoader.check_attrs): New helper method to check and
6768 convert attributes
6769 (AttrDesc): New. Helper class for SessionLoader.check_attrs
6770 (SessionLoader.start_fileshapesource)
6771 (SessionLoader.start_derivedshapesource)
6772 (SessionLoader.start_filetable, SessionLoader.start_jointable):
6773 Handlers for the new elements in the new fileformat
6774 (SessionLoader.start_layer): Handle the shapestore attribute in
6775 addition to filename.
6776 (SessionLoader.start_table, SessionLoader.end_table): Removed.
6777 They were never used in the old formats and aren't needed for the
6778 new.
6779
6780 * Thuban/Model/session.py (Session.DataContainers): New method to
6781 return all "data containers", i.e. shapestores and tables
6782
6783 * test/xmlsupport.py (SaxEventLister.__init__)
6784 (SaxEventLister.startElementNS, sax_eventlist): Add support to
6785 normalize IDs.
6786
6787 * test/test_xmlsupport.py
6788 (TestEventList.test_even_list_id_normalization): New test case for
6789 id normalization
6790
6791 * test/test_load.py (LoadSessionTest.check_format): Use ID
6792 normalization
6793 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6794 class atrributes used for ID normalization
6795 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6796 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6797 file format
6798 (TestJoinedTable): New test for loading sessions with joined
6799 tables.
6800 (TestLoadError): New. Test whether missing required attributes
6801 cause a LoadError.
6802
6803 * test/test_save.py (SaveSessionTest.thubanids)
6804 (SaveSessionTest.thubanidrefs): New class attributes for ID
6805 normalization in .thuban files.
6806 (SaveSessionTest.compare_xml): Use id-normalization.
6807 (SaveSessionTest.testEmptySession)
6808 (SaveSessionTest.testLayerProjection)
6809 (SaveSessionTest.testRasterLayer)
6810 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6811 (SaveSessionTest.testLayerProjection): The filename used was the
6812 same as for testSingleLayer. Use a different one.
6813 (SaveSessionTest.test_dbf_table)
6814 (SaveSessionTest.test_joined_table): New test cases for saving the
6815 new data sources structures.
6816 (TestStoreSort, MockDataStore): Classes to test the sorting of the
6817 data stores for writing.
6818
6819 * test/runtests.py: Add CVS keywords
6820
6821 2003-06-20 Jonathan Coles <[email protected]>
6822
6823 * test/test_session.py
6824 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6825 Use the cultural_landmark-point.dbf file for the store so that
6826 the table rows and shape count match.
6827
6828 2003-06-20 Jonathan Coles <[email protected]>
6829
6830 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6831 an exception if the number of shapes is different from the
6832 number of rows in the table. Address RTbug #1933.
6833
6834 * test/test_layer.py (TestLayer.test_derived_store): Add
6835 a test for the new exception in DerivedShapeStore.__init__.
6836
6837 * test/support.py (FloatTestCase): Removed since there is
6838 already FloatComparisonMixin. Fixes RTbug #1954.
6839 (FloatComparisonMixin.assertFloatEqual): Include test for
6840 infinity that was part of FloatTestCase.
6841
6842 * test/test_range.py (RangeTest): Inherit from
6843 support.FloatComparisonMixin now that we don't have
6844 support.FloatTestCase.
6845
6846 2003-06-20 Bernhard Herzog <[email protected]>
6847
6848 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6849 the implementation in xmlsupport instead.
6850 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6851
6852 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6853 of test_save
6854
6855 2003-06-20 Bernhard Herzog <[email protected]>
6856
6857 * test/test_load.py (LoadSessionTest.check_format): New helper
6858 method to make sure the test files we load might have been written
6859 by the current thuban version.
6860 (ClassificationTest.TestLayers, TestSingleLayer.test)
6861 (TestLayerVisibility.test, TestClassification.test)
6862 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6863 Add check_format() calls and fix the thuban data to match the data
6864 that would be written by saving the session loaded from it.
6865
6866 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6867 the same class and function in test_save.
6868
6869 * test/test_xmlsupport.py (TestEventList): New. test cases for
6870 sax_eventlist
6871
6872 2003-06-20 Bernhard Herzog <[email protected]>
6873
6874 * Resources/XML/thuban.dtd: Add comment about which versions of
6875 Thuban are covered by this DTD
6876 (map): Fix content model for layers and raster layers. There can
6877 be any number or layers and raster layers in any order.
6878
6879 2003-06-20 Jonathan Coles <[email protected]>
6880
6881 This is mainly about fixing RTbug #1949.
6882
6883 * Thuban/Model/classification.py: Remove "from __future__"
6884 import statement since python 2.2 is the earliest supported
6885 version.
6886
6887 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6888 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6889 depending on the units this projection *forwards* into.
6890
6891 * Thuban/Model/save.py (SessionSaver.write_classification):
6892 Remove unnecessary use of lambdas and nested functions.
6893
6894 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6895 adjustment here if the map projection uses degrees.
6896
6897 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6898 scale adjust code since it is now done before calling
6899 this method. Don't do anything if the map projection
6900 is None.
6901
6902 2003-06-19 Bernhard Herzog <[email protected]>
6903
6904 Move version specific load tests to their own file.
6905
6906 * test/test_load.py: Expand the doc-string to explain a bit how to
6907 handle file format changes.
6908 (TestClassification.test): Update the docstring as this test is
6909 not about Thuban 0.2 anymore.
6910
6911 * test/test_load_0_2.py: New file with the load tests for thuban
6912 files created with Thuban 0.2 and earlier.
6913
6914 2003-06-19 Bernhard Herzog <[email protected]>
6915
6916 Add XML validation to some of the tests. Validation will only be
6917 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6918 To make the DTD available to the test cases it's moved into
6919 Resources/XML
6920
6921 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6922 for versions up to and including 0.2. Two slight changes: added an
6923 encoding specification and fixed the comment which refered to
6924 GRASS, not Thuban
6925
6926 * test/xmlsupport.py: New support module for tests involving XML.
6927 Currently there's a mix-in class for XML validation.
6928
6929 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6930
6931 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6932 so that we can validate the
6933 (SaveSessionTest.testEmptySession)
6934 (SaveSessionTest.testSingleLayer)
6935 (SaveSessionTest.testSingleLayer)
6936 (SaveSessionTest.testLayerProjection)
6937 (SaveSessionTest.testRasterLayer)
6938 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6939
6940 * test/runtests.py (main): Call print_additional_summary instead
6941 of print_garbage_information
6942
6943 * test/support.py (resource_dir): New function to return the
6944 "Resource" subdirectory
6945 (print_additional_summary): New function to combine several
6946 summary functions
6947 (run_tests): Use print_additional_summary instead of calling
6948 print_garbage_information directly
6949
6950 2003-06-19 Bernhard Herzog <[email protected]>
6951
6952 * Doc/thuban.dtd (classification): Correct the content model of
6953 the classification element.
6954 (projection): Add the "name" attribute
6955
6956 2003-06-19 Frank Koormann <[email protected]>
6957
6958 MERGE from the greater-ms3 branch.
6959
6960 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6961 scale if projection is latlong to get better estimate.
6962
6963 Fix problem of hidden properties dialog under windows after double
6964 click on layer tree:
6965 The tree control always gets an Expanded / Collapsed event after
6966 the ItemActivated on double click, which raises the main window again.
6967 We add a second ItemActivated event to the queue, which simply
6968 raises the already displayed window.
6969
6970 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6971 raiseProperties initialized to prevent endless loops
6972 (LegendTree._OnItemActivated): Depending on self.raiseProperties
6973 simply raise the properties or open the dialog and issue a second
6974 event.
6975
6976 2003-06-18 Jonathan Coles <[email protected]>
6977
6978 * setup.py: Fix a few problems that occured under Windows.
6979
6980 2003-06-18 Jonathan Coles <[email protected]>
6981
6982 When Thuban loaded the map was redrawn twice because the
6983 legend was being opened after the mainwindow was created
6984 and not during its creation. This meant the map was drawn
6985 initially and then had to be redrawn when the legend
6986 caused the display to change. Now the legend is opened
6987 in the mainwindow constructor which resolves this issue.
6988
6989 Also, although we were checking for the existence of
6990 gdal and gdalwarp modules, the gdalwarp extension was
6991 still being compiled (which may fail if the system doesn't
6992 have gdal installed). the build_ext command to setup.py
6993 now accepts the flags --with-gdal and --without-gdal.
6994 If --without-gdal is specified setup.py will try to
6995 use the gdal parameters specified by gdal-config. Under
6996 windows, those parameters have to be set in setup.py
6997 as with proj4 an wxWindows.
6998
6999 * setup.py: Use a list instead of seperate variables for
7000 extension parameters so we can create a generic function
7001 that runs an appropriate *-config script.
7002 (run_cs_script): Renamed from run_wx_script and modified
7003 to accept a second argument which is a list of lists to
7004 be filled in by the values returned from running the command.
7005 (thuban_build_ext): New. Extends the build_ext command and
7006 provides the options --with-gdal/--without-gdal which then
7007 optionally includes the gdalwarp extension.
7008
7009 * Thuban/Model/resource.py: First check if we can import
7010 the gdalwarp Thuban extension before checking for gdal.
7011 Also added some comments.
7012
7013 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7014 the map is None which may be the case if none has been loaded
7015 yet.
7016
7017 * Thuban/UI/main.py (main): Remove call to ShowLegend.
7018
7019 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7020
7021 * Thuban/UI/renderer.py: Check for gdal support before importing
7022 gdalwarp.
7023 (MapRenderer.render_map): Only try to optimize if we have gdal
7024 support otherwise nothing will get drawn.
7025
7026 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7027 during startup before a map has been created. Check if map is None
7028 before using it and do nothing if it is.
7029
7030 2003-06-17 Jonathan Coles <[email protected]>
7031
7032 Fix the problem with raster layers under Windows that caused
7033 Thuban to crash. The view should respond to layer projection
7034 changed events to update the display. Changes to a projection
7035 should not cause the map to be set to full extent.
7036
7037 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7038 current_map_proj to remember the current map projection so that
7039 when the projection changes we know what the previous projection
7040 was.
7041 (MapCanvas.SetMap): Unsubscribe and subscribe to
7042 LAYER_PROJECTION_CHANGED events.
7043 (MapCanvas.projection_changed): Split into two methods that respond
7044 to map and layer projection changes.
7045 (MapCanvas.map_projection_changed): New. Takes the current view and
7046 projects it using the new projection. This does not cause the
7047 map to be redrawn at full extent.
7048 (MapCanvas.layer_projection_changed): New. Cause a redraw which
7049 will draw each layer in its new projection.
7050
7051 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7052 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7053 under Windows.
7054
7055 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7056 to twice sizeof(void*) because there are two digits for each
7057 hex byte.
7058
7059 2003-06-16 Bernhard Herzog <[email protected]>
7060
7061 Update to the layer interface: Direct access to the table,
7062 shapetable, shapefile and filename attributes is now actively
7063 deprecated by issuing deprecation warnings for all places where
7064 this happens.
7065
7066 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7067 to the instance variables table, shapetable, shapefile and
7068 filename via __getattr__ so that we can issue a deprecation
7069 warning.
7070 (Layer.SetShapeStore): Don't set the deprecated instance variables
7071 any more
7072 (Layer.SetShapeStore): Don't use deprecated layer instance
7073 variables
7074 (Layer.Destroy): No need to explicitly remove the instance
7075 variables any more
7076 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7077 instance variables
7078
7079 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7080 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7081 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7082 use deprecated layer instance variables
7083
7084 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7085 deprecated layer instance variables
7086
7087 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7088 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7089 instance variables
7090
7091 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7092 deprecated layer instance variables
7093
7094 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7095 deprecated layer instance variables
7096
7097 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7098 deprecated layer instance variables
7099
7100 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7101 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7102 variables
7103
7104 * test/runtests.py (main): Turn Thuban's deprecation warnings into
7105 errors so that they're cought by the tests
7106
7107 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7108 layer instance variables
7109
7110 2003-06-16 Jonathan Coles <[email protected]>
7111
7112 Fix a problem under Windows whereby if the user double-clicks on a
7113 layer in the legend that tree item will expand or collapse as well
7114 as open the layer properties dialog. The state of the tree item
7115 should not be affected.
7116
7117 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7118 preventExpandCollapse and subscribe to expanding and collapsing
7119 events.
7120 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7121 collapsing events and will veto the event if it has been triggered
7122 by the user double clicking on a layer.
7123 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7124 that an expanding/collapsing event should be vetoed.
7125
7126 2003-06-13 Bernhard Herzog <[email protected]>
7127
7128 * Thuban/UI/classifier.py (Classifier.OnClose)
7129 (Classifier.map_layers_removed)
7130 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7131 in OnClose and not in map_layers_removed or
7132 layer_shapestore_replaced to make sure it always happens when the
7133 dialog is closed
7134
7135 2003-06-13 Jonathan Coles <[email protected]>
7136
7137 This puts back a fix for Windows where a panel is needed so that
7138 the background of the table view appears correctly.
7139
7140 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7141 object that can be used by derived classes to place any
7142 controls (including the grid) onto.
7143 (QueryTableFrame.__init__): Use the panel as the parent window
7144 for all the controls. Reparent the grid so that the panel is
7145 the parent. Call UpdateStatusText() to correctly initialize
7146 the status bar.
7147
7148 2003-06-13 Jonathan Coles <[email protected]>
7149
7150 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7151 from wxFrame (as opposed to wxDialog like the other classes)
7152 but otherwise behaves like the other classes. This is needed
7153 for the TableView which isn't really a dialog and needs to
7154 have a status bar and control buttons.
7155
7156 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7157 instance variable to keep track of how many rows are selected.
7158 Subscribe once to the the events we are interested in.
7159 (ThubanGrid.OnRangeSelect): Only handle event if event handling
7160 hasn't been turned off.
7161 (ThubanGrid.OnSelectCell): Only handle event if event handling
7162 hasn't been turned off.
7163 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7164 as an event listener (which changes the event handler stack)
7165 simply set an instance variable to False. This is checked in
7166 the event handlers.
7167 (ThubanGrid.GetNumberSelected): Return the number of currently
7168 selected rows.
7169 (TableFrame): Inherit from ThubanFrame so we can have a
7170 status bar and control buttons.
7171 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7172 Explicitly set which items are selected in the operator choice and
7173 action choice so there is always a valid selection. Fixes RTbug #1941.
7174 Subscribe to grid cell selection events so we can update the
7175 status bar.
7176 (QueryTableFrame.UpdateStatusText): Update the status bar with
7177 how many rows are in the grid, how many columns, and how many
7178 rows are selected.
7179 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7180 Call UpdateStatusText when cells are (de)selected.
7181 (QueryTableFrame.OnQuery): Use the string value in the value
7182 combo if either the selected item index is 0 or if the string
7183 cannot be found in the predefined list (this happens if the
7184 user changes the text). Fixes RTbug #1940.
7185 Only turn off the grid event listeners if there a query comes
7186 back with a none empty list of ids. in the case that the list
7187 is empty this causes a grid.ClearSelection() call to actually
7188 clear the grid selection which causes the selected items in
7189 the map to be deselected. Fixes RTbug #1939.
7190
7191 * test/test_save.py (XMLWriterTest.Encode): Check return values.
7192 Fixes RTbug #1851.
7193
7194 2003-06-13 Bernhard Herzog <[email protected]>
7195
7196 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7197 self.selected_shape with the current selection to make sure the
7198 contents of the dialog are up to date when it's shown for the
7199 first time.
7200 The dialog used to work without this by luck. The recent fix to
7201 the connector module 'broke' a 'feature' the identify view was
7202 relying on, i.e that subscribing to a message in response to
7203 receiving a message of that type would mean that the new
7204 subscriber would also be called for the same message.
7205
7206 2003-06-12 Jonathan Coles <[email protected]>
7207
7208 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7209 the image is rendered. Fixes RTbug #1937.
7210
7211 2003-06-12 Jonathan Coles <[email protected]>
7212
7213 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7214 user directory if it doesn't exist on a posix system.
7215 Fixes RTbug #1815.
7216
7217 * Thuban/Model/resource.py (get_user_proj_files): Moved the
7218 called to get_application_dir here, so that the directory
7219 will only be called if this method is invoked.
7220
7221 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7222 the projfilepath if no projection is selected.
7223
7224 2003-06-12 Jonathan Coles <[email protected]>
7225
7226 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7227 the scalebar if the current map has no projection set.
7228
7229 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7230 projfilepath label to just the basename of the projection file
7231 rather than include the entire path.
7232
7233 * Thuban/Model/resource.py: Fix missed proj functions that
7234 needed to be renamed.
7235
7236 2003-06-12 Jonathan Coles <[email protected]>
7237
7238 * Thuban/Model/classification.py: Removed assert statements that
7239 tested if the variable was an instance of Color.
7240
7241 * Thuban/Model/color.py (Color): Remove commented code that isn't
7242 used.
7243 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7244 Fixes RTbug #1835.
7245 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7246 Needed now that the class doesn't inherit from Color.
7247
7248 2003-06-12 Jonathan Coles <[email protected]>
7249
7250 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7251 check unicode strings.
7252
7253 * test/test_layer.py: Check for existence of gdal.
7254
7255 2003-06-12 Jonathan Coles <[email protected]>
7256
7257 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7258 that was in load.py
7259
7260 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7261 that was in save.py
7262
7263 2003-06-12 Jonathan Coles <[email protected]>
7264
7265 This is largely a collection of bug fixes. We also handle the
7266 case where gdal is not on the system. The XMLReader and XMLWriter
7267 classes were moved into there own files to resolve some circular
7268 import references and because they shouldn't really be in the
7269 file that is dediciated to reading/writing session files since
7270 they are also used elsewhere.
7271
7272 * Thuban/Model/classgen.py: Renamed functions to follow the
7273 function_names_with_underscores style. Fixes RTbug #1903.
7274 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7275
7276 * Thuban/Model/layer.py: Import gdal only if it available.
7277 (RasterLayer): Handle the case where the gdal library is unavailable.
7278 Addresses RTbug #1877.
7279
7280 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7281 xmlreader.py.
7282
7283 2003-06-12 Jonathan Coles <[email protected]>
7284
7285 This is largely a collection of bug fixes. We also handle the
7286 case where gdal is not on the system. The XMLReader and XMLWriter
7287 classes were moved into there own files to resolve some circular
7288 import references and because they shouldn't really be in the
7289 file that is dediciated to reading/writing session files since
7290 they are also used elsewhere.
7291
7292 * Thuban/Model/classgen.py: Renamed functions to follow the
7293 function_names_with_underscores style. Fixes RTbug #1903.
7294 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7295
7296 * Thuban/Model/layer.py: Import gdal only if it available.
7297 (RasterLayer): Handle the case where the gdal library is unavailable.
7298 Addresses RTbug #1877.
7299
7300 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7301 xmlreader.py.
7302
7303 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7304 file xmlwriter.py.
7305
7306 * Thuban/Model/resource.py: Renamed functions to following the
7307 function_names_with_underscores style.
7308 (has_gdal_support): New function that returns true if the gdal
7309 library is available. Addresses RTbug #1877.
7310
7311 * Thuban/UI/application.py (ThubanApplication.OpenSession):
7312 Display a message box if the gdal library is not available, but
7313 only if there are any layers that would use it. Addresses RTbug #1877.
7314
7315 * Thuban/UI/classgen.py: Use renamed projection resource functions.
7316 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7317 when using integers versus floats.
7318
7319 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7320 determine if the "Add Image Layer" menu option should be
7321 greyed out or not. Addresses RTbug #1877.
7322
7323 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7324
7325 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7326 optimize if a raster layer is visible. Fixes RTbug #1931.
7327 Only draw the raster layer if the gdal library is available.
7328 Addresses RTbug #1877.
7329
7330 * test/test_classgen.py: Add tests for generate_singletons,
7331 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7332 (test_calculate_quantiles): Fix some tests to catch the new
7333 ValueError that is raised.
7334
7335 * test/test_proj.py: Use renamed projection resource functions.
7336
7337 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7338 test for saving classified layers. Fixes RTbug #1902.
7339 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7340
7341 2003-06-12 Jan-Oliver Wagner <[email protected]>
7342
7343 Fix for http://intevation.de/rt/webrt?serial_num=1900.
7344
7345 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7346
7347 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7348 multiplechoicedialog.py rather than from the wxPython library.
7349
7350 2003-06-11 Frank Koormann <[email protected]>
7351
7352 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7353 update.
7354
7355 2003-06-11 Frank Koormann <[email protected]>
7356
7357 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7358 determine the absolute .thuban/thuban directory under
7359 "posix" (os.expanduser) and "nt" (read AppData registry key).
7360
7361 * Thuban/Model/resource.py: Use get_application_dir
7362
7363 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7364 Use get_application_dir.
7365
7366 2003-06-10 Bernhard Herzog <[email protected]>
7367
7368 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7369 the messages MAP_LAYERS_REMOVED messages
7370 (LayerTableFrame.OnClose): Unsubscribe from it.
7371 (LayerTableFrame.map_layers_removed): New. Receiver for
7372 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7373 dialog is showing is removed.
7374
7375 2003-06-10 Bernhard Herzog <[email protected]>
7376
7377 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7378 of the receivers list so that unsubscribing in a receiver doesn't
7379 modify it while iterating over it.
7380
7381 * test/test_connector.py
7382 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7383 unsubscribing in a receiver works correctly. See docstring for
7384 details
7385
7386 2003-06-10 Bernhard Herzog <[email protected]>
7387
7388 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7389 message.
7390
7391 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7392 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7393 LAYER_CHANGED will still be sent if the classification changes.
7394
7395 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7396 parameter so we can subscribe to some of its messages
7397 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7398 and the layer's LAYER_SHAPESTORE_REPLACED
7399 (Classifier.unsubscribe_messages): New. Unsubscribe from message
7400 subscribed to in __init__
7401 (Classifier.map_layers_removed)
7402 (Classifier.layer_shapestore_replaced): receivers for the messages
7403 subscribed to in __init__. Unsubscribe and close the dialog
7404
7405 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7406 the map to the Classifier dialog
7407
7408 * test/test_layer.py (SetShapeStoreTests): Derive from
7409 SubscriberMixin as well so we can test messages
7410 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7411 messages
7412 (SetShapeStoreTests.tearDown): Clear the messages again
7413 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7414 for the modified flag too
7415 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7416 to check whether SetShapeStore sets the modified flag
7417 (SetShapeStoreTests.test_set_shape_store_different_field_name)
7418 (SetShapeStoreTests.test_set_shape_store_same_field)
7419 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7420 Add tests for the messages. This checks both the new
7421 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7422
7423 2003-06-06 Jan-Oliver Wagner <[email protected]>
7424
7425 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7426 the menu items.
7427
7428 2003-06-05 Frank Koormann <[email protected]>
7429
7430 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7431 Layout reimplemented without panel. Make life easier to fit the list
7432 in the dialog.
7433
7434 2003-06-05 Frank Koormann <[email protected]>
7435
7436 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7437 once on initialisation (Former implementation resulted in multiple
7438 entries for each projection).
7439 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7440 if set, select the projection found under the specified name. This
7441 overwrites any other selection estimate.
7442 Removed projchoice filling from this method.
7443 (ProjFrame._OnSave, ProjFrame._OnAddToList):
7444 Updated call of ProjFrame.__FillAvailList
7445 (LCCPanel._DoLayout): Moved parameter controls in more common order.
7446
7447 * Resources/Projections/defaults.proj: Extended defaults representing
7448 various common European projections.
7449
7450 2003-06-05 Frank Koormann <[email protected]>
7451
7452 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7453 Use ListCtrl instead of GridCtrl
7454
7455 * Thuban/Model/resource.py:
7456 Guess location of .thuban directory from tempdir parent directory.
7457
7458 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7459 Guess location of .thuban directory from tempdir parent directory.
7460
7461 2003-06-04 Bernhard Herzog <[email protected]>
7462
7463 Do not cache the values returned by the tree widget's
7464 GetFirstChild and GetNextChild methods because it led to lots of
7465 segfaults. The new way requires more brute force but is more
7466 reliable.
7467
7468 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7469 variable layer2id
7470 (LegendTree.find_layer): New method to do with brute force what
7471 layer2id tried to accomplish
7472 (LegendTree._OnMsgLayerChanged)
7473 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7474 Use find_layer instead of layer2id
7475 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7476 update layer2id anymore
7477 (LegendTree._OnMsgMapLayersRemoved)
7478 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7479
7480 2003-06-03 Thomas Koester <[email protected]>
7481
7482 * Thuban/Model/classgen.py (GenQuantiles0): New function.
7483
7484 2003-06-02 Bernhard Herzog <[email protected]>
7485
7486 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7487 New commands.
7488 (main_menu): Add the new commands.
7489 (MainWindow.TableRename): New. Implementation of the table_rename
7490 command.
7491 (MainWindow.RenameLayer): New. Implementation of the layer_rename
7492 command.
7493
7494 * Thuban/Model/session.py (Session.AddTable): call self.changed to
7495 set the modified flag
7496
7497 * test/test_session.py (TestSessionSimple.test_add_table): Test
7498 whether the modified flag is set properly
7499
7500 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7501 instead of issue so that the modified flags get updated.
7502
7503 * test/test_base.py (SomeTitledObject): Derive from Modifiable
7504 instead of Publisher to reflect reality better and to accomodate
7505 the fact that SetTitle now calls changed instead of issue
7506
7507 2003-06-02 Bernhard Herzog <[email protected]>
7508
7509 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7510 acquisition has to happen before the try in a try-finally.
7511
7512 2003-06-02 Bernhard Herzog <[email protected]>
7513
7514 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7515 possible that a layer is removed that is not currently selected in
7516 the legend so don't check for this.
7517
7518 2003-05-30 Bernhard Herzog <[email protected]>
7519
7520 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7521 variables to None that have direct or indirect references to
7522 shapefiles or dbf files to make sure that they do go away and the
7523 files are closed.
7524
7525 2003-05-30 Bernhard Herzog <[email protected]>
7526
7527 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7528 availImgListIndices when a new image list is created
7529
7530 2003-05-30 Bernhard Herzog <[email protected]>
7531
7532 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7533 changing_selection to indicate whether the LegendTree code itself
7534 is currently changing the selection
7535 (LegendTree.normalize_selection): New method to normalize the
7536 selection by selecting the layer item even if the user clicked on
7537 the classification.
7538 (LegendTree._OnSelChanged): normalize the selection. This works
7539 around a bug in wx which doesn't keep track of the selection
7540 properly when subtrees are deleted.
7541
7542 2003-05-30 Bernhard Herzog <[email protected]>
7543
7544 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7545 maximum and minimum scale factors.
7546
7547 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7548 changes in classgen.py
7549
7550 2003-05-30 Jonathan Coles <[email protected]>
7551
7552 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7553 all the methods functions. Fixes RTBug #1903.
7554
7555 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7556 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7557 RTBug #1907.
7558
7559 * Thuban/UI/classgen.py: Use classgen functions that were part
7560 of the ClassGenerator class. Put try/finally blocks around
7561 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7562 RTBug #1904.
7563
7564 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7565
7566 * Thuban/UI/legend.py: The legend was cleared and repopulated any
7567 time something changed which caused some state to be lost such
7568 as which children were expanded or collapsed. Fixes RTBug #1901.
7569 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7570 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7571 the legend but not in the map.
7572 (LegendTree.__FillTree): Move main functionality out into smaller
7573 methods that can be used by other methods.
7574 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7575 if they are available.
7576 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7577 that we override the wxTreeCtrl method. Iterate over children
7578 and call __RemoveLayer.
7579 (LegendTree.__AddLayer): New. Add a new layer to the legend.
7580 (LegendTree.__RemoveLayer): Remove a layer from the legend.
7581 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7582 Should only be called with the id of a layer branch.
7583 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7584 Returns the root item or creates one if necessary.
7585
7586 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7587 ProjectRasterFile with tuple arguments instead of strings.
7588
7589 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7590 with try/finally. Fixes RTBug #1904.
7591
7592 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7593 with try/finally. Fixes RTBug #1904.
7594 (MapCanvas.FitSelectedToWindow): If a single point is selected
7595 simply center it on the display. Fixes RTBug #1849.
7596
7597 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7598 to be compiled as a standalone app. Now the code can only be
7599 called from Python which simplifies the parameter passing.
7600 (ProjectRasterFile): Handle Python arguments. Remove code that
7601 checks for a destination dataset. Add more clean up code.
7602
7603 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7604 TestMapWithContents.test_lower_layer_bottom):
7605 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7606 Fixes RTBug #1907.
7607
7608 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7609 extent to the map when the legend is toggled. Fixes RTBug #1881.
7610
7611 2003-05-29 Jan-Oliver Wagner <[email protected]>
7612
7613 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
7614 unsubscribes all that is subcribed in __init__.
7615
7616 2003-05-28 Bernhard Herzog <[email protected]>
7617
7618 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
7619 (MainWindow.CanDuplicateLayer): New methods to implement the
7620 Layer/Duplicate command.
7621 (layer_duplicate command): New.
7622 (main_menu): Add layer_duplicate to the Layer menu.
7623
7624 2003-05-28 Bernhard Herzog <[email protected]>
7625
7626 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
7627 renderer so that NULL/None values get displayed differently (by a
7628 gray rectangle).
7629 (TableGrid.__init__): Override the default renderers
7630
7631 2003-05-28 Bernhard Herzog <[email protected]>
7632
7633 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
7634 classification to "None" if the type of the field has changed.
7635
7636 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
7637 test for the Layer.SetShapeStore method
7638
7639 2003-05-28 Jan-Oliver Wagner <[email protected]>
7640
7641 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
7642 does not necessarily have a filename).
7643
7644 2003-05-28 Jan-Oliver Wagner <[email protected]>
7645
7646 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
7647 sort the selection list for the dialog.
7648
7649 2003-05-28 Frank Koormann <[email protected]>
7650
7651 * extensions/thuban/wxproj.cpp
7652 (project_point): Removed cast to int for projected point coordinates.
7653 (shape_centroid): Return last point if all polygon vertices fall
7654 to one point.
7655
7656 2003-05-28 Bernhard Herzog <[email protected]>
7657
7658 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
7659 with layers that don't have shapestores, i.e. raster layers.
7660
7661 2003-05-28 Bernhard Herzog <[email protected]>
7662
7663 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
7664 when determining the title from the filename.
7665
7666 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
7667 reflect changes in the way the title is derived from the filename
7668
7669 2003-05-28 Frank Koormann <[email protected]>
7670
7671 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
7672 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
7673
7674 2003-05-27 Bernhard Herzog <[email protected]>
7675
7676 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
7677 delegate SelectedLayer.
7678 (MainWindow.LayerUnjoinTable): Implement.
7679 (_can_unjoin): New. Helper function for the sensitivity of the
7680 layer/unjoin command.
7681
7682 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
7683 (DerivedShapeStore.OrigShapeStore): New. Return the original
7684 shapestore. Used to figure out how to unjoin.
7685 (DerivedShapeStore.Shapefile): Fix a typo.
7686
7687 2003-05-27 Bernhard Herzog <[email protected]>
7688
7689 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
7690 well
7691 (JoinDialog.__init__): Use the layer parameter and only build the
7692 left choice when a layer is given
7693 (JoinDialog.OnJoin): Handle layer joins as well
7694 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
7695 that the user selects the "Select..." item. The sensitivitly
7696 updating is now in update_sensitivity
7697 (JoinDialog.y): New method to refactor the sensitivity update of
7698 the join button into its own method.
7699
7700 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7701
7702 2003-05-27 Bernhard Herzog <[email protected]>
7703
7704 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7705 iff there are unreferenced tables in the session
7706
7707 2003-05-27 Bernhard Herzog <[email protected]>
7708
7709 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7710
7711 * Thuban/Model/session.py (Session.UnreferencedTables): New method
7712 to return tables that are not referenced by other tables or shape
7713 stores and can be removed.
7714 (Session.RemoveTable): Issue a TABLE_REMOVED message after
7715 removing the table
7716
7717 * Thuban/UI/mainwindow.py: Remove unused imports
7718 (MainWindow.TableClose): Implement.
7719
7720 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7721 messages so that the frame will be automatically closed when a new
7722 session is opened or the table is removed.
7723 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7724 __init__
7725 (TableFrame.close_on_session_replaced)
7726 (TableFrame.close_on_table_removed): New. Subscribers that close
7727 the window
7728
7729 * test/test_session.py (TestSessionMessages.test_remove_table)
7730 (TestSessionSimple.test_remove_table): Move the test to
7731 TestSessionSimple and add test for the TABLE_REMOVED message
7732 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7733 (TestSessionSimple.test_unreferenced_tables) New. Test for the
7734 UnreferencedTables method.
7735 (UnreferencedTablesTests): New. Class with some more sophisticated
7736 tests for UnreferencedTables.
7737
7738 2003-05-27 Frank Koormann <[email protected]>
7739
7740 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7741 display has some unwanted side effects. Removed again.
7742
7743 2003-05-27 Frank Koormann <[email protected]>
7744
7745 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7746
7747 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7748
7749 2003-05-27 Jan-Oliver Wagner <[email protected]>
7750
7751 * test/test_menu.py (MenuTest.test): Added test for
7752 Menu.RemoveItem().
7753
7754 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7755 the menu.
7756
7757 2003-05-27 Frank Koormann <[email protected]>
7758
7759 Nonmodal dialogs without parent (i.e. they can fall behind the main
7760 window)
7761
7762 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7763 all dialogs in the dialogs dictionary and the canvas.
7764
7765 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7766 parent, i.e. can fall behind other windows.
7767 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7768 dictionary before removing it.
7769
7770 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7771
7772 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7773 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7774 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7775
7776 2003-05-27 Bernhard Herzog <[email protected]>
7777
7778 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7779 tableview dialog
7780 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7781 Also, don't use the table's titles as the dialog names. The titles
7782 aren't guaranteed to be unique.
7783 (MainWindow.TableOpen): Open a table view dialog after opening the
7784 table
7785
7786 2003-05-27 Bernhard Herzog <[email protected]>
7787
7788 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7789 effect can be achieved by simply closing the window showing the
7790 table.
7791 (MainWindow.TableHide): Removed.
7792 (main_menu): Removed "table_hide"
7793
7794 2003-05-27 Frank Koormann <[email protected]>
7795
7796 Fix legend tree display problems under Win32
7797
7798 * Thuban/UI/legend.py: BMP_SIZE_W = 15
7799 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7800 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7801
7802 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7803
7804 2003-05-27 Jan-Oliver Wagner <[email protected]>
7805
7806 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7807 'after' now allows to insert separators almost anywhere in the menu.
7808
7809 2003-05-27 Frank Koormann <[email protected]>
7810
7811 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7812 "S" of selection box label to hint on hot key (Alt-S). Works under
7813 Win32 but is ignored under GTK.
7814
7815 2003-05-26 Frank Koormann <[email protected]>
7816
7817 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7818 Center Choices.
7819
7820 2003-05-26 Bernhard Herzog <[email protected]>
7821
7822 Remove the Precision methods again. They're too DBF specific to be
7823 part of the table interface and they're only used in table_to_dbf
7824 anyway.
7825
7826 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7827 fixed precision of 12 for doubles.
7828 (TransientTableBase.Precision): Removed
7829 (AutoTransientTable.Width): Delegate to self.table.
7830
7831 * Thuban/Model/table.py (DBFTable.Precision)
7832 (MemoryTable.Precision): Removed.
7833 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7834 (table_to_dbf): Use a fixed precision of 12 for floats unless the
7835 column object specifies something else.
7836
7837 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7838 test for table_to_dbf
7839
7840 2003-05-26 Bernhard Herzog <[email protected]>
7841
7842 * test/test_transientdb.py
7843 (TestTransientTable.run_iceland_political_tests): Fix a comment.
7844
7845 2003-05-26 Bernhard Herzog <[email protected]>
7846
7847 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7848 implementation. Mark parts of the file format strings for
7849 localization.
7850
7851 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7852 file and add the table to the tables managed by the session
7853
7854 * test/test_session.py (TestSessionSimple.test_open_table_file):
7855 New. test case for OpenTableFile
7856
7857 2003-05-26 Jan-Oliver Wagner <[email protected]>
7858
7859 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7860 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7861 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7862 Replace the true/false of wxWindows by True/False of Python 2.2.1.
7863
7864 2003-05-26 Jan-Oliver Wagner <[email protected]>
7865
7866 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7867 already a selection present, update the grid accordingly.
7868
7869 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7870 resizeable and increase its initial size.
7871
7872 2003-05-26 Frank Koormann <[email protected]>
7873
7874 Table export functionality
7875
7876 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7877 Return width (in characters) for a column.
7878 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7879 (table_to_dbf): Write table to dbf file.
7880 (table_to_csv): Write table to csv file.
7881
7882 * Thuban/Model/transientdb.py (TransientTableBase.Width,
7883 TransientTableBase.Precision): Return column width and precision.
7884
7885 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7886 or table_to_csv depending on file selection.
7887
7888 * test/test_dbf_table.py:
7889 Test table_to_dbf (extension of former part of test).
7890
7891 * test/test_csv_table.py:
7892 Test table_to_csv.
7893
7894 2003-05-23 Jan-Oliver Wagner <[email protected]>
7895
7896 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7897 Use QueryTableFrame instead of TableFrame.
7898
7899 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7900 table window with 'Layer Table:' instead of 'Table:'.
7901
7902 2003-05-23 Jan-Oliver Wagner <[email protected]>
7903
7904 Give all tables a title via mix-in TitledObject.LayerShowTable
7905
7906 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7907 only if it exists.
7908
7909 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7910 and call its init-method with a default title. Remove Title() method.
7911
7912 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7913 AutoTransientTable): mix-in TitledObject and call its init-method with
7914 a default title. Remove Title() method.
7915
7916 2003-05-23 Bernhard Herzog <[email protected]>
7917
7918 * Thuban/Model/session.py (Session.AddShapeStore): Define
7919 AddShapeStore analogously to AddTable.
7920
7921 * test/test_session.py (TestSessionSimple.test_add_shapestore):
7922 New. Test for AddShapeStore
7923
7924 2003-05-23 Jan-Oliver Wagner <[email protected]>
7925
7926 Introducing QueryTableFrame and a very coarse ShowTable implementation.
7927
7928 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7929 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7930 The latter implements the selection GUI without dependency on a layer.
7931 LayerTableFrame now is derived from QueryTableFrame and connects
7932 to a layer.
7933
7934 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7935 implementation that still needs work.
7936
7937 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7938
7939 2003-05-22 Frank Koormann <[email protected]>
7940
7941 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7942 Added "outer_join = False" as optional parameter.
7943 (TransientJoinedTable.create): If outer join is true, perform a
7944 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7945 the left table. Records not matching are filled with 0 / None.
7946
7947 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7948 (JoinDialog.OnJoin): Consider outer join check box.
7949
7950 2003-05-22 Bernhard Herzog <[email protected]>
7951
7952 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7953 somewhat safer way. Storing the traceback in a local variable can
7954 lead to memory leaks
7955
7956 2003-05-22 Bernhard Herzog <[email protected]>
7957
7958 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7959 the wxMessageDialog's Destroy() method.
7960
7961 2003-05-22 Frank Koormann <[email protected]>
7962
7963 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7964 TransientTable.Title()
7965
7966 2003-05-22 Frank Koormann <[email protected]>
7967
7968 Join Dialog, initial version.
7969
7970 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7971
7972 * Thuban/UI/join.py (JoinDialog): Functional implementation of
7973 former framework. Renamed Table1/Table2 to LeftTable/RightTable
7974 in all occurences.
7975
7976 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7977 Typo fixed.
7978
7979 2003-05-22 Bernhard Herzog <[email protected]>
7980
7981 Give the tables titles so that the GUI can display more meaningful
7982 names. For now the titles are fixed but depend on e.g. filenames
7983 or the titles of the joined tables.
7984
7985 * Thuban/Model/transientdb.py (TransientTable.Title)
7986 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7987
7988 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7989
7990 * test/test_transientdb.py
7991 (TestTransientTable.test_auto_transient_table_title): New. Test
7992 for the Title method
7993 (TestTransientTable.test_transient_joined_table)
7994 (TestTransientTable.test_transient_table): Add test for the Title
7995 methods
7996
7997 * test/test_memory_table.py (TestMemoryTable.test_title): New.
7998 Test for the Title method
7999
8000 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8001 the Title method
8002
8003 2003-05-22 Bernhard Herzog <[email protected]>
8004
8005 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8006 Provide a better way to destroy the layers
8007 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8008 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8009 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8010 the new way to destroy the layers.
8011 (TestLayer.test_derived_store): New. Test for using a layer with a
8012 DerivedShapeStore
8013
8014 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8015 filename if the shape store actually has one.
8016
8017 2003-05-22 Bernhard Herzog <[email protected]>
8018
8019 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8020 for the filename
8021
8022 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8023 for the FileName method
8024 (TestDBFTableWriting.test_write): Fix spelling of filename
8025
8026 2003-05-22 Thomas Koester <[email protected]>
8027
8028 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8029 from SciParam that now really is immutable.
8030
8031 2003-05-22 Frank Koormann <[email protected]>
8032
8033 Layer Top/Bottom placement added to legend.
8034
8035 * Thuban/UI/legend.py
8036 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8037 bound to tool events.
8038 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8039 New, methods binding the event methods with the map methods.
8040
8041 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8042 layer at top/bottom of layer stack.
8043
8044 * Resources/Bitmaps/top_layer.xpm: New button icon.
8045
8046 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8047
8048 2003-05-22 Bernhard Herzog <[email protected]>
8049
8050 * Thuban/Model/session.py (Session.RemoveTable): New method to
8051 remove tables
8052
8053 * test/test_session.py (TestSessionSimple.test_remove_table): New.
8054 Test for RemoveTable
8055
8056 2003-05-22 Thomas Koester <[email protected]>
8057
8058 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8059 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8060
8061 2003-05-22 Bernhard Herzog <[email protected]>
8062
8063 Implement a way to discover dependencies between tables and
8064 shapestores.
8065
8066 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8067 (TransientJoinedTable.Dependencies)
8068 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8069 interface
8070 (TransientJoinedTable.__init__): Keep tack of the original table
8071 objects in addition to the corresponding transient tables.
8072
8073 * Thuban/Model/table.py (DBFTable.Dependencies)
8074 (MemoryTable.Dependencies): New. Implement the dependencies
8075 interface
8076
8077 * Thuban/Model/data.py (ShapeTable): New. Helper class for
8078 ShapefileStore
8079 (ShapefileStore.__init__): Use ShapeTable instead of
8080 AutoTransientTable
8081 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8082 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8083 methods for filename and type
8084 (ShapefileStore.Dependencies): New. Implement the dependencies
8085 interface
8086 (DerivedShapeStore): New class to replace SimpleStore. The main
8087 difference to SimpleStore is that it depends not on a shapefile
8088 but another shapestore which expresses the dependencies a bit
8089 better
8090 (SimpleStore.__init__): Add deprecation warning.
8091
8092 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8093 Test for the Dependencies method.
8094
8095 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8096 New. Test for the Dependencies method.
8097
8098 * test/test_transientdb.py
8099 (TestTransientTable.test_auto_transient_table_dependencies): New.
8100 Test for the Dependencies method.
8101 (TestTransientTable.test_transient_joined_table): Add test for the
8102 Dependencies method.
8103
8104 * test/test_session.py (TestSessionSimple.setUp)
8105 (TestSessionSimple.tearDown): New. Implement a better way to
8106 destroy the sessions.
8107 (TestSessionSimple.test_initial_state)
8108 (TestSessionSimple.test_add_table): Bind session to self.session
8109 so that it's destroyed by tearDown
8110 (TestSessionSimple.test_open_shapefile): New. Test for
8111 OpenShapefile and the object it returns
8112
8113 2003-05-22 Bernhard Herzog <[email protected]>
8114
8115 * Thuban/Model/session.py (Session.AddTable): New method to
8116 register tables with the session.
8117 (Session.Tables): Return the tables registered with AddTable too.
8118
8119 * test/test_session.py (TestSessionSimple.test_add_table): New.
8120 Test case for the AddTable method
8121
8122 2003-05-22 Frank Koormann <[email protected]>
8123
8124 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8125 lower right corner, center labels for selections, initialize controls
8126 in reasonable order for keyboard navigation.
8127
8128 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8129 (ProjFrame.__DoOnProjAvail): Determine position of current projection
8130 using the wxListBox.FindString() method. Still a problem (#1886)
8131
8132 * Thuban/UI/classifier.py
8133 (Classifier.__init__, SelectPropertiesDialog.__init__)
8134
8135 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8136 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8137 different classification types from here to __init__.
8138 (GenUniquePanel.__init__): Set the column width of the first field
8139 in the Field ListCtrl to the full width.
8140
8141 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8142 Button to 'Export'. Center Buttons in Selection Box, set Focus to
8143 Grid.
8144 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8145 changes focus to the Selection when pressing "Alt-S".
8146
8147 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8148 the text if not visible. The italic font sometimes exceeds the
8149 rendering area.
8150
8151 2003-05-21 Jonathan Coles <[email protected]>
8152
8153 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8154 to OnClose so that Thuban closes correctly.
8155
8156 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8157 DockFrame.OnClose, not DockFrame._OnClose.
8158
8159 2003-05-21 Jonathan Coles <[email protected]>
8160
8161 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8162 references to 'inf' and use new Range __init__ to pass floats
8163 directly rather than converting them to strings first.
8164 Fixes RTBug #1876.
8165
8166 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8167 Use new Range ___init__ to pass floats.
8168
8169 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8170 filename is a valid image file. Throw IOError otherwise.
8171
8172 * Thuban/Model/range.py: Brought over new Range from SciParam that
8173 is immutable and has an __init__ which can accept floats.
8174
8175 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8176 into try block. AddLayer doesn't throw any exceptions anymore.
8177 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8178 try block.
8179
8180 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8181 the first item in choices. Fixes RTBug #1882.
8182
8183 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8184 has gone to 0 which is a serious problem. abort.
8185 (MapRenderer.draw_raster_layer): Catch IOError seperately and
8186 print the error from GDAL.
8187
8188 * Thuban/UI/tableview.py (TableGrid.__init__): Call
8189 ToggleEventListeners to turn on listening.
8190 (TableGrid.ToggleEventListeners): New. Turns event listening on
8191 and off so as to prevent excessive messages.
8192 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8193 to suppress excessive messages when selecting many rows.
8194 Fixes RTBug #1880.
8195
8196 * Thuban/UI/view.py: Added checks against if scale == 0. This
8197 is a serious problem that can occur when an image without
8198 geo data is loading and causes the map projection bounds to
8199 go to infinity. Right now, the solution is to simply try
8200 to recover.
8201
8202 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8203 to set the MFILEReceiver attributes even if the data is NULL.
8204
8205 * extensions/thuban/gdalwarp.cpp: Improved the error handling
8206 and passed GDAL messages back up to the Python layer. Also
8207 tried to fix some memory leaks that were present in the original
8208 utility but didn't matter because the program aborted.
8209
8210 * test/test_range.py: Copied over tests from SciParam. Removed
8211 tests against importing. Fixes RTBug #1867.
8212
8213 2003-05-21 Bernhard Herzog <[email protected]>
8214
8215 * test/test_load.py: Remove unused imports and restructure the
8216 test code
8217 (LoadSessionTest): Split into one class for each test and turn
8218 LoadSessionTest itself into the base class for all such session
8219 tests.
8220 (ClassificationTest): New base class for load tests that test
8221 classifications
8222 (TestSingleLayer, TestLayerVisibility, TestClassification)
8223 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8224 for the individual tests
8225
8226 * test/support.py (FileLoadTestCase.filename): New base class for
8227 file loading tests
8228
8229 2003-05-21 Jan-Oliver Wagner <[email protected]>
8230
8231 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8232 Mercator' to 'UTM Zone 32' as a more convenient example.
8233 Added 'Gauss Krueger Zone 6'.
8234
8235 * Data/iceland_sample_raster.thuban: political polygon now
8236 filled transparent to have the raster image visible at once.
8237
8238 2003-05-21 Frank Koormann <[email protected]>
8239
8240 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8241 OnClose() to keep in sync with extensions. Internally Thuban
8242 still uses "underscored" names.
8243
8244 2003-05-20 Jonathan Coles <[email protected]>
8245
8246 This puts back Raster layer support. These layers support projections
8247 through the GDAL library. Currently, the CVS version is being used.
8248 There are no Debian packages available although this may change soon.
8249 A GDAL driver was extended to support writing to memory rather to
8250 files.
8251
8252 There is still some work that needs to be done, such as some error
8253 handling when loading invalid images or when there is a problem
8254 projecting the image. This putback simply checks in the majority
8255 of the work.
8256
8257 * setup.py: Add gdalwarp library extension.
8258
8259 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8260 Defaults to False, but can be overridden by subclasses if they
8261 support classification.
8262 (RasterLayer): New. Defines a new layer that represents an
8263 image.
8264
8265 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8266 tag handler.
8267 (SessionLoader.start_layer): Encode the filename.
8268 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8269 New. Supports reading a rasterlayer tag.
8270
8271 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8272
8273 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8274 get a string in Latin1. If we get such as string convert it to
8275 unicode first, otherwise leave if alone before encoding.
8276 (SessionSaver.write_layer): Add support for writing both Layers
8277 and RasterLayers.
8278
8279 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8280 The right argument may not be a string, it could also be a Column.
8281
8282 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8283 Make initial window size 600x400. Fixes RTBug #1872.
8284
8285 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8286 the dialog is constructed so that we can support layers that
8287 do not have classifications.
8288 (Classifier._OnTry): Only build a classification if the layer
8289 supports one.
8290
8291 * Thuban/UI/legend.py: Change all checks that a layer is an
8292 instance of Layer into checks against BaseLayer.
8293 (LegendTree.__FillTreeLayer): Only add children to a branch if
8294 the layer supports classification.
8295
8296 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8297 MainWindow.OpenSession): Don't proceed with an action if the
8298 user chooses Cancel when they are asked to save changes.
8299 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8300 user to select an image file. Create a new RasterLayer and add
8301 it to the map.
8302
8303 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8304 for rendering RasterLayer layers.
8305 (MapRenderer.draw_raster_layer): Actually method that calls
8306 the GDALWarp python wrapper and constructs an image from the
8307 data returned.
8308
8309 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8310 Choices symbols to match those used in the table query method.
8311 Replace deprecated method calls on table with new method names.
8312
8313 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8314 how small the scale can get. This still needs more testing.
8315
8316 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8317 Provides a driver to output in .bmp format.
8318
8319 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8320 New. Provides IO routines which write to memory, rather than a file.
8321
8322 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8323 of the gdalwarp utility provided in GDAL. Added function calls
8324 that can be accessed from python.
8325
8326 * Data/iceland_sample_raster.thuban: New. Sample file that uses
8327 a raster layer.
8328
8329 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8330 layer image data.
8331
8332 * Doc/thuban.dtd: Added rasterlayer attribute definition.
8333
8334 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8335 tests associated with the raster layer code.
8336
8337 * test/test_transientdb.py
8338 (TestTransientTable.test_auto_transient_table_query): Added a test
8339 for using a Column object as the "right" parameter to a query.
8340
8341 2003-05-19 Frank Koormann <[email protected]>
8342
8343 * Thuban/version.py (get_changelog_date):
8344 Catch exceptions if ChangeLog does not exist.
8345
8346 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8347
8348 2003-05-19 Frank Koormann <[email protected]>
8349
8350 Extended version information for Thuban
8351
8352 * Thuban/version.py: New, version information for Thuban: Last
8353 modification date and last ChangeLog entry date.
8354
8355 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8356 information: Display Thuban, wxPython and Python version.
8357
8358 2003-05-16 Bernhard Herzog <[email protected]>
8359
8360 * Thuban/Model/save.py: Remove some unused imports including the
8361 __future__ import for nested_scopes as Thuban relies on Python 2.2
8362 now.
8363 (XMLWriter.encode): Remove the special case for a None argument.
8364 In the saver encode is always called with a string argument.
8365
8366 2003-05-16 Bernhard Herzog <[email protected]>
8367
8368 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8369 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8370 of the bug was that e.g. float("1.2") would fail. Thuban now
8371 requires 2.4.x.
8372
8373 2003-05-16 Frank Koormann <[email protected]>
8374
8375 Printing enhancement and WMF export (under Win32)
8376
8377 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8378 ScreenRenderer. Renders Map, Legend and Scalebar for export.
8379 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8380 PrintRender.
8381
8382 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8383 to fullfil information needed for PrinterRenderer.
8384 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8385 (MapCanvas.Print): Adapted to new MapPrintout.
8386 (OutputTransform): General calculations to transform from canvas
8387 coordinates to export/printing devices.
8388
8389 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8390 new method_command to call ExportMap, with platform dependency (only
8391 __WXMSW__)
8392
8393 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8394 of scalebar drawing area as new parameters.
8395
8396 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8397
8398 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8399 Update to extended scalebar.DrawScalebar header.
8400
8401 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8402
8403 * test/test_scalebar.py: Made test executable as standalone.
8404
8405 2003-05-16 Bernhard Herzog <[email protected]>
8406
8407 * Thuban/Model/table.py (Table): Remove this compatibility alias
8408 for DBFTable.
8409
8410 * test/test_table.py: Import DBFTable as Table because that alias
8411 doesn't exist anymore.
8412
8413 * Thuban/UI/classgen.py: Remove some unused imports
8414
8415 2003-05-14 Jonathan Coles <[email protected]>
8416
8417 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8418 Fix docstring.
8419 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8420 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8421 values of the supplied range to determine the beginning and end
8422 bounds of the generated classes.
8423
8424 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8425 do not have a leading 0 (.5 is now accepted as well as 0.5).
8426
8427 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8428 call to ClassGenerator.GenUniformDistribution.
8429
8430 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8431 layout bug with the 'Projection' label.
8432
8433 * test/support.py (FloatTestCase): New. Needed for the Range tests.
8434
8435 * test/test_range.py: New. Imported from SciParam.
8436
8437 2003-05-12 Jonathan Coles <[email protected]>
8438
8439 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8440 to table.UniqueValues() with calls that retrieve all the values
8441 from the table. This will need to be replaced by a method on table
8442 which can simply return the list (perhaps more efficiently).
8443
8444 2003-05-12 Jonathan Coles <[email protected]>
8445
8446 The return value of ClassGenerator.CalculateQuantiles has changed.
8447 Refer to the documentation for details.
8448
8449 * test/test_classgen.py: Modified Quantile tests to use the
8450 new return values.
8451
8452 * Thuban/Model/classgen.py
8453 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8454 use new return values from CalculateQuantiles to produce the correct
8455 range bounds in the Classification.
8456 (ClassGenerator.CalculateQuantiles): Add more comments describing
8457 the return values and parameters. Make minor adjustments to improve
8458 the legibility of the code. Fix problem with adjusted not being set
8459 in most cases.
8460
8461 2003-05-12 Frank Koormann <[email protected]>
8462
8463 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8464 and latin1. Fixes #1851 finally.
8465
8466 2003-05-09 Jonathan Coles <[email protected]>
8467
8468 * test/test_classgen.py: New. Tests the Quantile algorithm.
8469
8470 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8471 Clean up debugging statement, add comments, fix a small bug in the
8472 returned adjusted percentiles.
8473
8474 2003-05-09 Jonathan Coles <[email protected]>
8475
8476 Introduces Range class from SciParam into the ClassGroupRange class,
8477 and such ranges can now be saved and loaded from disk.
8478
8479 Quantiles are now available in the Classification Generator.
8480
8481 Initial support for building Queries on a table. Doesn't do anything
8482 but run some tests.
8483
8484 * Thuban/Model/classification.py: Explicit imports.
8485 (ClassGroupRange): Use the Range class to store the underlying
8486 range information. The interface remains the same, except for
8487 GetRange(), and you can also supply a Range object as the min
8488 parameter to SetRange or __init__.
8489
8490 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8491 string appropriately for use in Thuban. Fixes RTbug #1851.
8492 (SessionLoader.end_projection): Handle the context of the
8493 projection tag a bit better by looking at what objects are not
8494 None. There was an assumption that a projection tag for a map
8495 could occur before any layers.
8496 (SessionLoader.start_clrange): Provide backward compatibility for
8497 reading min/max values as well as the new range parameter.
8498
8499 * Thuban/Model/map.py: Explicit imports.
8500
8501 * Thuban/Model/resource.py: Import _.
8502 (ProjFileSaver.write): write header using projfile.dtd.
8503
8504 * Thuban/Model/save.py: Explicit imports.
8505 (XMLWriter.encode): New. Encode the given string from a format
8506 used by Thuban into UTF-8. Fixes RTbug #1851.
8507
8508 * Thuban/UI/classgen.py: Explicit imports.
8509 (ClassGenDialog.__init__): Clean up the code and add support
8510 for Quantiles.
8511 (ClassGenDialog.OnOK): Add support for Quantiles.
8512 (GenQuantilesPanel): New. Input panel for Quantiles.
8513 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8514 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8515
8516 * Thuban/Model/classgen.py: New. Contains all the classes named above.
8517
8518 * Thuban/UI/classifier.py: Explicit imports.
8519 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8520 ClassTable.SetValueAsCustom): Reworked to use new Range class.
8521
8522 * Thuban/UI/legend.py: Explicit imports.
8523
8524 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8525 a Table menu and associated method calls.
8526 (MainWindow.choose_color): Removed. No longer needed.
8527
8528 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8529 should be disabled if no projection is selected in the available
8530 list.
8531
8532 * Thuban/UI/renderer.py: Explicit imports.
8533
8534 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8535 with correctly selecting the rows and issuing the right events.
8536 Be sure to call Skip() to allow the grid to do some of its own
8537 handling which allows the rows to actually be selected.
8538 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8539 selecting multiple shapes.
8540 (LayerTableFrame): Support for building Queries.
8541 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8542
8543 * Thuban/UI/tree.py: Explicit imports.
8544
8545 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8546 table view can call it.
8547
8548 * test/test_classification.py: Explicit imports.
8549 (TestClassification.test_ClassGroupRange): Fix test for new
8550 Range class.
8551
8552 * Doc/thuban.dtd: Add range parameter for clrange.
8553
8554 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8555 object in ClassGroupRange, and also uesd for inputting ranges in
8556 the classifer table and elsewhere.
8557
8558 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8559 yet.
8560
8561 2003-05-09 Frank Koormann <[email protected]>
8562
8563 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8564
8565 2003-05-08 Frank Koormann <[email protected]>
8566
8567 Coding style updates
8568
8569 * test/test_scalebar.py: Replaced tab indentation by spaces.
8570
8571 * Thuban/UI/scalebar.py: Explicit imports.
8572
8573 2003-05-08 Frank Koormann <[email protected]>
8574
8575 * Thuban/UI/scalebar.py
8576 (ScaleBar.DrawScalebar): Format string bug fixed.
8577
8578 2003-05-08 Frank Koormann <[email protected]>
8579
8580 Reorganization of scalebar component (no wx in Thuban/Model)
8581
8582 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8583 (deriveInterval):
8584 Calculate scalebar interval and unit which fits in width for scale.
8585 (roundInterval): Round float.
8586
8587 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8588
8589 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8590
8591 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8592
8593 2003-05-08 Frank Koormann <[email protected]>
8594
8595 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8596 Initialize ScaleBar with canvas.map
8597
8598 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8599 round intervals to display smarter lengths
8600 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8601 layer. If the maps has no projection applied grey the scalebar.
8602
8603 2003-05-07 Frank Koormann <[email protected]>
8604
8605 Basic Scalebar features added.
8606
8607 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8608
8609 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8610 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
8611 and the renderer.
8612
8613 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
8614
8615 * Thuban/UI/messages.py: SCALE_CHANGED added.
8616
8617 2003-05-07 Bernhard Herzog <[email protected]>
8618
8619 * Thuban/Model/session.py (Session.__init__): New instance
8620 variable shapestores to hold a list of all open shapestore objects
8621 (Session.ShapeStores): New. Accessor method for the shapestores
8622 list.
8623 (Session._add_shapestore, Session._clean_weak_store_refs): New.
8624 Internal methods to maintain the shapestores list.
8625 (Session.Tables): New. Return all tables open in the session.
8626 (Session.OpenShapefile): Insert the new ShapeStore into the
8627 shapestores list.
8628
8629 * test/test_session.py (TestSessionSimple.test_initial_state): Add
8630 tests for ShapeStores and Tables
8631 (TestSessionWithContent.test_shape_stores)
8632 (TestSessionWithContent.test_tables): New. Test cases for
8633 ShapeStores and Tables
8634
8635 2003-05-07 Bernhard Herzog <[email protected]>
8636
8637 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
8638 Add comments about the optimizations used.
8639 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
8640 Implement the ReadValue table interface method.
8641
8642 * test/test_transientdb.py
8643 (TestTransientTable.run_iceland_political_tests)
8644 (TestTransientTable.test_transient_joined_table): Add tests for
8645 ReadValue
8646
8647 2003-05-07 Frank Koormann <[email protected]>
8648
8649 * Resources/Bitmaps/fulllayerextent.xpm,
8650 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
8651 new icons.
8652
8653 2003-05-06 Bernhard Herzog <[email protected]>
8654
8655 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8656 New. Simply delegate to the transient table's version.
8657
8658 * test/test_transientdb.py
8659 (TestTransientTable.test_auto_transient_table_query): New. Test
8660 case for AutoTransientTable's SimpleQuery
8661
8662 2003-05-06 Bernhard Herzog <[email protected]>
8663
8664 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
8665 Implement a simple query method for the query dialog
8666 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
8667 the row index or shapeid.
8668 (TransientTable.create): Insert the right value of the row index
8669 (TransientJoinedTable.create): Copy the row index of the left
8670 table to the joined result table
8671
8672 * test/test_transientdb.py
8673 (TestTransientTable.test_transient_table_read_twice): Fix
8674 doc-string
8675 (TestTransientTable.test_transient_table_query): New. Test for the
8676 SimpleQuery method
8677
8678 2003-05-06 Bernhard Herzog <[email protected]>
8679
8680 Convert all table users to use the new table interface. This only
8681 covers Thuban itself, not GREAT-ER or other applications built on
8682 Thuban yet, so the compatibility interface stays in place for the
8683 time being but it now issues DeprecationWarnings.
8684
8685 Finally, the new Table interface has a new method, HasColumn.
8686
8687 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
8688 issue deprecation warnings when they're. The warnings refer to the
8689 caller of the method.
8690 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
8691 for the deprecation warnings
8692
8693 * test/test_table.py: Ignore the deprecation warnings for the old
8694 table in the tests in this module. The purpose of the tests is to
8695 test the old interface, after all.
8696
8697 * test/test_transientdb.py
8698 (TestTransientTable.run_iceland_political_tests): Use the
8699 constants for the types. Add a test for HasColumn
8700 (TestTransientTable.test_transient_joined_table): Adapt to new
8701 table interface. Add a test for HasColumn
8702 (TestTransientTable.test_transient_table_read_twice): Adapt to new
8703 table interface
8704
8705 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8706 Adapt to new table interface
8707
8708 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8709 new table interface
8710
8711 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8712 (RecordTable.SetTable): Adapt to new table interface
8713
8714 * Thuban/UI/classifier.py (Classifier.__init__)
8715 (Classifier.__init__): Adapt to new table interface
8716
8717 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8718 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8719 to new table interface
8720
8721 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8722 (AutoTransientTable.HasColumn): Implement the new table interface
8723 method
8724 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8725 (AutoTransientTable.UniqueValues): Adapt to new table interface
8726
8727 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8728 Adapt to new table interface
8729
8730 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8731 simplify opening shapefiles a bit easier.
8732 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8733 (TestLayer.test_point_layer): Use the new helper method
8734 (TestLayer.test_get_field_type): New. Test for the GetFieldType
8735 method
8736
8737 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8738 the new table method
8739
8740 * test/test_memory_table.py (TestMemoryTable.test_has_column):
8741 Test for the new table method HasColumn
8742
8743 2003-05-06 Jonathan Coles <[email protected]>
8744
8745 Addresses the "Selection Extent" wish of RTbug #1787.
8746
8747 * Resources/Bitmaps/fulllayerextent.xpm,
8748 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8749 extent. These are just place holders for the real bitmaps.
8750
8751 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8752 calculate the bounding box once (the first time compute_bbox() is
8753 called).
8754 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8755 the bounding box for the shapes in lat/long coordinates.
8756
8757 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8758 option.
8759 (MainWindow.has_selected_shapes): New. Returns true if there are
8760 any selected shapes.
8761 (MainWindow.FullSelectionExtent): New. Calls
8762 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8763 (_has_selected_shapes): New. Returns true if there are any
8764 selected shapes.
8765
8766 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8767 true if there are any selected shapes.
8768
8769 * Thuban/UI/view.py (MapCanvas): Added delegated method
8770 HasSelectedShapes.
8771 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8772 shapes on the canvas using the map projection (if any).
8773
8774 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8775 for Layer.ShapesBoundingBox().
8776
8777 2003-05-06 Bernhard Herzog <[email protected]>
8778
8779 * Resources/Projections/defaults.proj: Fix spelling of Mercator
8780
8781 2003-05-05 Jonathan Coles <[email protected]>
8782
8783 Addresses the "Full Layer Extent" wish of RTbug #1787.
8784
8785 * Resources/Projections/defaults.proj: Added UK National Grid.
8786
8787 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8788 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8789 when the user selects the menu option.
8790
8791 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8792 scales the given layer on the canvas using the map projection.
8793
8794 2003-05-05 Bernhard Herzog <[email protected]>
8795
8796 Convert the table implementations to a new table interface. All
8797 tables use a common mixin class to provide backwards compatibility
8798 until all table users have been updated.
8799
8800 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8801 provide backwards compatibility for table classes implementing the
8802 new interface
8803 (DBFTable, MemoryTable): Implement the new table interface. Use
8804 OldTableInterfaceMixin as base for compatibility
8805 (DBFColumn, MemoryColumn): New. Column description for DBFTable
8806 and MemoryTable resp.
8807
8808 * test/test_dbf_table.py: New. Test cases for the DBFTable with
8809 the new table interface.
8810
8811 * test/test_memory_table.py: New. Test cases for the MemoryTable
8812 with the new table interface.
8813
8814 * test/test_table.py: Document the all tests in this file as only
8815 for backwards compatibility. The equivalent tests for the new
8816 interface are in test_memory_table.py and test_dbf_table.py
8817 (MemoryTableTest.test_read): field_info should be returning tuples
8818 with four items
8819 (MemoryTableTest.test_write): Make doc-string a more precise.
8820
8821 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8822 table interface. Derive from from OldTableInterfaceMixin for
8823 compatibility.
8824 (TransientTableBase.create): New intance variable column_map to
8825 map from names and indices to column objects
8826 (TransientTable.create): Use the new table interface of the input
8827 table
8828 (AutoTransientTable): Convert to new table interface. Derive from
8829 from OldTableInterfaceMixin for compatibility.
8830 (AutoTransientTable.write_record): Removed. It's not implemented
8831 yet and we still have to decide how to handle writing with the new
8832 table and data framework.
8833
8834 * test/test_transientdb.py
8835 (TestTransientTable.run_iceland_political_tests)
8836 (TestTransientTable.test_transient_joined_table): Use the new
8837 table interface
8838
8839 2003-05-05 Jonathan Coles <[email protected]>
8840
8841 This is namely a collection of UI updates to improve user interactivity.
8842 Tabbing between controls now exists and you can use ESC to close dialog
8843 boxes; ENTER will active the default button.
8844
8845 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8846 order that the controls are created so that tabbing works correctly.
8847 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8848 wxDialog can handle the default button correctly.
8849 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8850 same reasons as for OnOK.
8851 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8852 when we ask the table for the maximum/minimum values of a field
8853 which could take a very long time.
8854
8855 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8856 order that the controls are created so that tabbing works correctly.
8857 (SelectPropertiesDialog.__init__): Rearrange the order that the
8858 controls are created so that tabbing works correctly.
8859
8860 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8861 to derive from a wxDialog but behave like the original implementation
8862 which was derived from a wxFrame. wxDialog provides useful key
8863 handling functionality like ESC calling OnCancel and ENTER calling
8864 OnOK which is lost with wxFrame.
8865
8866 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8867 new dialogs.
8868
8869 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8870 order that the controls are created so that tabbing works correctly.
8871 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8872 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8873 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8874 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8875 can provide the "UK National Grid" as a default projection.
8876 (UTMPanel.__init__): Rearrange the order that the controls are
8877 created so that tabbing works correctly.
8878
8879 2003-05-05 Bernhard Herzog <[email protected]>
8880
8881 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8882 (project_point): If a map projection but no layer projection is
8883 given, convert degrees to radians before applying the map
8884 projection.
8885
8886 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8887 (TableGrid.allow_messages): New methods to make it possible to
8888 inhibit message sending.
8889 (TableGrid.issue): Only send the message if not inhibited.
8890 (LayerTableGrid.select_shape): Use the new methods to make sure
8891 that no ROW_SELECTED message is sent while we're updating the
8892 selected rows to match the selected shapes.
8893
8894 2003-05-02 Jan-Oliver Wagner <[email protected]>
8895
8896 Implementation of MemoryTable.
8897
8898 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8899 implementation that operates on a list of tuples. All of the data
8900 are kept in the memory.
8901
8902 * test/test_table.py (MemoryTableTest): New.
8903
8904 * test/test_transientdb.py (SimpleTable): Removed.
8905 (TestTransientTable.test_transient_joined_table,
8906 (TestTransientTable.test_transient_table_read_twice): Replaced
8907 SimpleTable by MemoryTable.
8908
8909 2003-04-30 Jonathan Coles <[email protected]>
8910
8911 * Data/iceland_sample.thuban: Now contains correct projections
8912 for each of the layers.
8913
8914 * Resources/Projections/defaults.proj: Geographic projection
8915 contains unit conversion parameter.
8916
8917 2003-04-30 Jonathan Coles <[email protected]>
8918
8919 The most important part of this putback is the projection changes.
8920 It should now be possible to specify the projection that a layer
8921 is in and then specify a different projection for the map. The
8922 projection dialog has an extra parameter for a geographic projection
8923 which lets the user select if the input is in degrees or radians.
8924
8925 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8926 to say that the parameter is a tuple of unprojected
8927 points (which is what the callers to this method were assuming).
8928 Also, since the points are unprojected we need to projected them.
8929
8930 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8931 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8932 groups are selected, move the layer up/down. Fixes RTbug #1833.
8933
8934 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8935
8936 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8937 parameter in call to SetClientData.
8938 (GeoPanel): Add support for selecting the units that the
8939 source data is in (Radians or Degrees).
8940
8941 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8942 the rendering loop by reducing the number of if's, removing the
8943 unnecessary try/except block, and checking if the old group
8944 is the same as the new one (which happens a lot if there is
8945 no classification, or lots of shapes are in the same group).
8946
8947 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8948 around the redraw routine to try to catch problems that the user
8949 may create by selecting invalid projections for the data set and
8950 map. Clears the display if there are any problems and prints the
8951 error.
8952 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8953 rectangle.
8954
8955 * extensions/thuban/wxproj.cpp (project_point): First invert the
8956 supplied point (which should be in projected coordinates) using
8957 the layer's projection and then project the point using the
8958 map's projection.
8959 (project_points): Use project_point() to project each point.
8960
8961 2003-04-30 Jan-Oliver Wagner <[email protected]>
8962
8963 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8964 don't set the Classification to None if the classfication field
8965 is None (ie only a DEFAULT).
8966
8967 2003-04-30 Bernhard Herzog <[email protected]>
8968
8969 * Thuban/UI/view.py: Fix some typos.
8970
8971 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8972 not pop up the dialog if the selection becomes empty (this could
8973 happen if e.g. a new selection is opened while the identify tool
8974 is active and dialog had been closed)
8975
8976 2003-04-30 Bernhard Herzog <[email protected]>
8977
8978 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8979 instance variable read_record_last_result
8980 (TransientTableBase.read_record): Make sure reading the same
8981 record twice works. The implementation uses the new instance
8982 variable read_record_last_result
8983
8984 * test/test_transientdb.py
8985 (TestTransientTable.test_transient_table_read_twice): New test
8986 case for the above bug-fix.
8987
8988 2003-04-29 Jonathan Coles <[email protected]>
8989
8990 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8991
8992 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8993
8994 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8995 (ClassTable.SetValueAsCustom): Rename keyword argument in
8996 ClassGroup* constructors to match argument name.
8997
8998 2003-04-29 Bernhard Herzog <[email protected]>
8999
9000 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9001 transient DB if it exists to make sure it doesn't leave a journal
9002 file in the temp directory.
9003
9004 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9005 self.conn to None after closing the connection to make sure it's
9006 not closed twice
9007
9008 2003-04-29 Jonathan Coles <[email protected]>
9009
9010 Add a visible parameter in the layer XML tag. The default value is
9011 "true". If anything other than "false" is specified we also assume
9012 "true". Addresses RTbug #1025.
9013
9014 * Doc/thuban.dtd: Add visible parameter to a layer.
9015
9016 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9017 of visible from 1 to True.
9018 (Layer.__init__): Change default value of visible from 1 to True.
9019
9020 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9021 parameter.
9022
9023 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9024 parameter.
9025
9026 * test/test_load.py: Add new test data contents_test_visible.
9027 (LoadSessionTest.setUp): save test data.
9028 (LoadSessionTest.testLayerVisibility): Test if the visible flag
9029 is loaded correctly.
9030
9031 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9032 for saving an invisible layer.
9033
9034 2003-04-29 Jonathan Coles <[email protected]>
9035
9036 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9037 legend dialog box and tell it to change its map to the one
9038 supplied to SetMap(). Fixes RTbug #1770.
9039
9040 2003-04-29 Bernhard Herzog <[email protected]>
9041
9042 Next step of table implementation. Introduce a transient database
9043 using SQLite that some of the data is copied to on demand. This
9044 allows us to do joins and other operations that require an index
9045 for good performance with reasonable efficiency. Thuban now needs
9046 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9047 haven't tested that.
9048
9049 * Thuban/Model/transientdb.py: New. Transient database
9050 implementation.
9051
9052 * test/test_transientdb.py: New. Tests for the transient DB
9053 classes.
9054
9055 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9056 classes to help automatically remove temporary files and
9057 directories.
9058 (Session.__init__): New instance variables temp_dir for the
9059 temporary directory and transient_db for the SQLite database
9060 (Session.temp_directory): New. Create a temporary directory if not
9061 yet done and return its name. Use AutoRemoveDir to have it
9062 automatically deleted
9063 (Session.TransientDB): Instantiate the transient database if not
9064 done yet and return it.
9065
9066 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9067 AutoTransientTable so that data is copied to the transient DB on
9068 demand.
9069 (SimpleStore): New class that simply combines a table and a
9070 shapefile
9071
9072 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9073 DBFTable and update its doc-string to reflect the fact that this
9074 is only the table interface to a DBF file. Table is now an alias
9075 for DBFTable for temporary backwards compatibility.
9076
9077 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9078 the last reference to the session goes away so that the temporary
9079 files are removed properly.
9080
9081 * test/test_load.py (LoadSessionTest.tearDown): Remove the
9082 reference to the session to make sure the temporary files are
9083 removed.
9084
9085 2003-04-29 Bernhard Herzog <[email protected]>
9086
9087 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9088 the __parser instance variable into a normal local variable in
9089 read. It's only used there and read will never be called more than
9090 once. Plus it introduces a reference cycle that keeps can keep the
9091 session object alive for a long time.
9092
9093 2003-04-29 Jonathan Coles <[email protected]>
9094
9095 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9096 Projection an immutable item. Fixes RTbug #1825.
9097 (Projection.__init__): Initialize instance variables here.
9098 (ProjFile.Replace): New. Replace the given projection object with
9099 the new projection object. This solves the problem of needing the
9100 mutator Projection.SetProjection() in the ProjFrame class and
9101 allows a projection to change parameters without changing its
9102 location in the file.
9103
9104 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9105 be of type wxSAVE and should verify overwriting a file.
9106
9107 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9108 ProjFile.Replace() method instead of the mutator
9109 Projection.SetProjection(). Also requires that we reassign the
9110 client data to the new projection.
9111
9112 * test/test_proj.py (TestProjection.test): Test GetName() and
9113 GetAllParameters()
9114 (TestProjFile.test): Remove tests for Set*() methods. Add tests
9115 for Replace().
9116
9117 2003-04-25 Jonathan Coles <[email protected]>
9118
9119 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9120 to save the name of the projection.
9121
9122 * test/test_save.py (SaveSessionTest.testLayerProjection): New
9123 test to verify layer projections are saved correctly.
9124
9125 2003-04-25 Jonathan Coles <[email protected]>
9126
9127 * Thuban/Model/proj.py (Projection.SetName): Set the name
9128 to "Unknown" if name is None.
9129 (Projection.SetAllParameters): New. Set the projection's
9130 parameter list to the one supplied.
9131 (Projection.SetProjection): New. Set the projection's
9132 properties to those of the supplied Projection.
9133
9134 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9135 the dialog title to include the map's title.
9136 (MainWindow.LayerProjection): Set the dialog title to include
9137 the layer's title.
9138
9139 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9140 error dialogs into a single method call.
9141 (ProjFrame.__VerifyButtons): Add more states to check.
9142 (ProjFrame.__GetProjection): Return the current state of an
9143 edited projection or None.
9144 (ProjFrame.__FillAvailList): Remove checks for states that
9145 shouldn't exist.
9146 (ProjFrame._OnNew): Clear all selected items and supply
9147 a projection panel if necessary.
9148
9149 * test/test_proj.py (TestProjFile.test): Add tests for
9150 ProjFile.SetAllParameters, ProjFile.SetProjection,
9151 ProjFile.SetName.
9152
9153 2003-04-25 Jonathan Coles <[email protected]>
9154
9155 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9156 takes an optional argument to select the current projection.
9157 This does not guarantee that the item is visible due to
9158 limited wxWindows functionality. Fixes RTBug #1821.
9159
9160 2003-04-25 Jonathan Coles <[email protected]>
9161
9162 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9163 the projection name and use it when constructing the Projection
9164 object.
9165
9166 * Thuban/Model/proj.py (Projection.__init__): Change the default
9167 value for 'name' to None and then test if name is equal to None
9168 in the body of the constructor. This way the caller doesn't have to
9169 know what the default value should be. Namely, useful in load.py
9170 where we have to pick a default value if the 'name' parameter
9171 doesn't exist in the XML file.
9172
9173 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9174 Tests a file where a layer has a projection.
9175
9176 2003-04-25 Jonathan Coles <[email protected]>
9177
9178 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9179 tree for projection information.
9180
9181 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9182 XMLReader.GetFileName.
9183 (SessionLoader): Added support for loading projection tags that
9184 appear inside a layer.
9185
9186 * Thuban/Model/proj.py (ProjFile): Document the class. Move
9187 back to using a list because the order of the projections in
9188 the file is important to maintain. Fixes RTbug #1817.
9189
9190 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9191 to ProjFile.GetFilename.
9192
9193 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9194 information.
9195
9196 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9197 ProjFrame._OnSaveAs. Removed old dead code from previous
9198 implementation.
9199 (ProjFrame._OnExport): Add support for exporting more than one
9200 projection to a single file.
9201 (ProjFrame.__FillAvailList): use string formatting (% operator)
9202 to build strings that are (partly) translated. Fixes RTbug #1818.
9203
9204 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9205 class.
9206
9207 2003-04-24 Bernhard Herzog <[email protected]>
9208
9209 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9210
9211 * po/fr.po: New. French translation by Daniel Calvelo Aros
9212
9213 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9214 empty strings.
9215
9216 2003-04-24 Jonathan Coles <[email protected]>
9217
9218 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9219 implement the interface that the ProjFrame dialog expects.
9220
9221 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9222 name of the projection to be changed.
9223 (ProjFile): Use a dictionary instead of a list so that removing
9224 projections is easier and we are sure about uniqueness.
9225 (ProjFile.Remove): Remove the given projection object.
9226
9227 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9228 Return a list with only one projection file instead of searching for
9229 any projection file. This simplifies many things if the user can
9230 only have one system file and one user file.
9231
9232 * Thuban/UI/classgen.py: Change all references to
9233 genCombo to genChoice.
9234
9235 * Thuban/UI/mainwindow.py: Add a Projection option under the
9236 layer menu.
9237 (MainWindow.LayerProjection): New. Open up a projection window
9238 for a layer.
9239
9240 * Thuban/UI/projdialog.py: Large changes to how the dialog is
9241 laid out. Use three panels instead of one. One for the list of
9242 projections, one for the edit controls, and one for the buttons.
9243 Fixed resizing problems so that the dialog resizes correctly
9244 when the projection panel changes. Added import/export, save, and
9245 new buttons/functionality.
9246
9247 2003-04-24 Bernhard Herzog <[email protected]>
9248
9249 First step towards table management. Introduce a simple data
9250 abstraction so that we replace the data a layer uses more easily
9251 in the next step.
9252
9253 * Thuban/Model/data.py: New file with a simple data abstraction
9254 that bundles shapefile and dbffile into one object.
9255
9256 * Thuban/Model/session.py (Session.OpenShapefile): New method to
9257 open shapefiles and return a shape store object
9258
9259 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9260 object instead of a shapefile filename. This introduces a new
9261 instance variable store holding the datastore. For intermediate
9262 backwards compatibility keep the old instance variables.
9263 (open_shapefile): Removed. No longer needed with the shape store.
9264 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9265 get the shape store used by a layer.
9266 (Layer.Destroy): No need to explicitly destroy the shapefile or
9267 table anymore.
9268
9269 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9270 (MainWindow.AddLayer): Use the session's OpenShapefile method to
9271 open shapefiles
9272
9273 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9274 session's OpenShapefile method to open shapefiles
9275
9276 * test/test_classification.py
9277 (TestClassification.test_classification): Use the session's
9278 OpenShapefile method to open shapefiles and build the filename in
9279 a more platform independed way
9280
9281 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9282 Implement to have a session to use in the tests
9283 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9284 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9285 session's OpenShapefile method to open shapefiles
9286 (TestLayerLegend.setUp): Instantiate a session so that we can use
9287 it to open shapefiles.
9288 (TestLayerLegend.tearDown): Make sure that all references to
9289 layers and session are removed otherwise we may get a resource
9290 leak
9291
9292 * test/test_map.py (TestMapAddLayer.test_add_layer)
9293 (TestMapWithContents.setUp): Instantiate a session so that we can
9294 use it to open shapefiles.
9295 (TestMapWithContents.tearDown): Make sure that all references to
9296 layers, maps and sessions are removed otherwise we may get a
9297 resource leak
9298 ("__main__"): use support.run_tests() so that more info about
9299 uncollected garbage is printed
9300
9301 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9302 session's OpenShapefile method to open shapefiles
9303 ("__main__"): use support.run_tests() so that more info about
9304 uncollected garbage is printed
9305
9306 * test/test_selection.py (TestSelection.tearDown): Make sure that
9307 all references to the session and the selection are removed
9308 otherwise we may get a resource leak
9309 (TestSelection.get_layer): Instantiate a session so that we can
9310 use it to open shapefiles.
9311 ("__main__"): use support.run_tests() so that more info about
9312 uncollected garbage is printed
9313
9314 * test/test_session.py (TestSessionBase.tearDown)
9315 (TestSessionWithContent.tearDown): Make sure that all references
9316 to the session and layers are removed otherwise we may get a
9317 resource leak
9318 (TestSessionWithContent.setUp): Use the session's OpenShapefile
9319 method to open shapefiles
9320
9321 2003-04-24 Jonathan Coles <[email protected]>
9322
9323 * Thuban/Model/load.py (XMLReader.read): Should have been checking
9324 if the file_or_filename object had the 'read' attribute.
9325
9326 2003-04-23 Jonathan Coles <[email protected]>
9327
9328 * Thuban/Model/resource.py: Fixes RTbug #1813.
9329 (ReadProjFile): Add documentation about which exceptions are raised.
9330 Always pass the exceptions up to the caller.
9331 (GetProjFiles): If the directory can't be read return an empty list.
9332 If any of the proj files can't be read skip that file and go
9333 on to the next one.
9334
9335 * test/test_proj.py: Added test cases to handle nonexistent files,
9336 unreadable files, and files that don't parse correctly.
9337
9338 2003-04-23 Jonathan Coles <[email protected]>
9339
9340 Projection dialog. Allows the user to select from a list
9341 of projection templates and optionally edit them and save new ones.
9342
9343 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9344 (ProjPanel): Base class for projection specific panels.
9345 (TMPanel): Projection panel for Transverse Mercartor.
9346 (UTMPanel): Projection panel for Universal Transverse Mercartor.
9347 (LCCPanel): Projection panel for Lambert Conic Conformal.
9348 (GeoPanel): Projetion panel for Geographic Projection.
9349
9350 2003-04-23 Jonathan Coles <[email protected]>
9351
9352 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9353 promote symmetry. There now exists XMLReader and XMLWriter.
9354 (XMLReader.read): New. Call to read the given file descriptor or
9355 filename.
9356 (XMLReader.close): New. Make sure the file is closed.
9357 (XMLReader.GetFileName): New. Return just the file name that is being
9358 read from.
9359 (XMLReader.GetDirectory): New. Return just the directory of the file
9360 that is being read.
9361 (XMLReader.AddDispatchers): New. Take a dictionary which contains
9362 the names of functions to call as the XML tree is parsed.
9363 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9364 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9365 (SessionLoader): Removed class variables start_dispatcher and
9366 end_dispatcher since this functionality is now part of a class
9367 instance. Fixes RTbug #1808.
9368 (SessionLoader.__init__): Add dispatcher functions.
9369 (load_xmlfile): Code was moved into the XMLReader.read().
9370 (load_session): Use modified SessionLoader.
9371
9372 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9373 map's projection.
9374
9375 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9376 GetAllParameters.
9377 (Projection.GetParameter): Returns the value for the given parameter.
9378
9379 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9380 (GetProjFiles): Renamed from GetProjections. Now returns a list
9381 of ProjFile objects.
9382 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9383 a list of ProjFile objects whose files are not user defined.
9384 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9385 list of ProjFile objects whose files are user defined.
9386 (ProjFileReader): Extend new XMLReader.
9387
9388 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9389 promote symmetry.
9390
9391 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9392 control instead of a wxComboBox. wxChoice controls do not generate
9393 events as the uses highlights possible choices which fixes problems
9394 with resizing the dialog when the use selects an option.
9395
9396 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9397 control instead of a wxComboBox.
9398
9399 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9400 dialog.
9401
9402 * test/test_proj.py (TestProjection.test): New tests for GetParameter
9403 method.
9404
9405 2003-04-22 Bernhard Herzog <[email protected]>
9406
9407 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9408 constants
9409
9410 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9411 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9412
9413 2003-04-17 Bernhard Herzog <[email protected]>
9414
9415 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9416 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9417 anymore.
9418 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9419 (Layer.ShapeType, Layer.Shape): No need to call
9420 self.open_shapefile since it's always called in __init__
9421
9422 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9423 In wxPython 2.4 there's no need to extend MainLoop anymore since
9424 wxPython itself makes sure OnExit is called.
9425
9426 2003-04-16 Jonathan Coles <[email protected]>
9427
9428 Initial putback of projection management code. Includes new
9429 classes to read and write projection files. The current load
9430 and save classes were abstracted a bit so they could be reused.
9431 The Projection class was extended to provide new methods and
9432 have a name.
9433
9434 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9435 general XML reading methods that were part of ProcessSession.
9436
9437 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9438 name.
9439 (ProjFile): New. Represents a file that contains projection
9440 information.
9441
9442 * Thuban/Model/resource.py: New. Contains general utilities
9443 for read and writing projection files.
9444
9445 * Thuban/Model/save.py (XMLSaver): New. Contains all the
9446 general XML writing methods that were part of SessionSaver.
9447 (SessionSaver): Renamed from Saver.
9448
9449 * test/test_proj.py: New test cases for the projection
9450 file read and write functions.
9451
9452 2003-04-16 Jonathan Coles <[email protected]>
9453
9454 * Thuban/Model/classification.py: Use repr() around values
9455 in the ClassGroup*.__repr__() methods so it is clearer when
9456 a value is a string and when it is a number.
9457
9458 * test/test_load.py: Rework the classification test to test
9459 that we can load old files.
9460 (testLabels): Test a file where the groups have labels.
9461
9462 2003-04-16 Bernhard Herzog <[email protected]>
9463
9464 Safer implementation of the performance enhancements of the
9465 low-level renderer:
9466
9467 * extensions/thuban/wxproj.cpp (extract_projection)
9468 (extract_pointer): Rename extract_projection to extract_pointer
9469 and redefine its purpose to return the pointer stored in a CObject
9470 returned by the object's cobject method. Update all callers.
9471 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9472 handling of these low-level parameters so that each s_draw_info
9473 instance is handled as a CObject at python level that also
9474 contains real references to the actual python objects which
9475 contain the values in the struct. Add free_draw_info as the
9476 destructor.
9477 (draw_polygon_shape): Add the py_draw_info parameter which must a
9478 cobject containing an s_draw_info pointer.
9479
9480 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9481 method to instantiat the low-level render parameter
9482 (MapRenderer.draw_shape_layer): Use the new method. Remove some
9483 commented out code.
9484 (MapRenderer.draw_polygon_shape): Make the first parameter not the
9485 layer but the low-level render parameter
9486 (ScreenRenderer.draw_shape_layer): Use the low-level render
9487 parameter.
9488
9489 2003-04-15 Jonathan Coles <[email protected]>
9490
9491 * Thuban/Model/classification.py: Implemented __repr__ for
9492 the ClassGroup* classes to make debugging a bit easier.
9493 (ClassGroup.SetLabel): Check that the string is an instance
9494 of StringTypes not StringType. Accounts for Unicode strings.
9495
9496 * Thuban/Model/color.py: Implemented __repr__ to make
9497 debugging a bit easier.
9498
9499 * Thuban/Model/save.py (Saver.write_classification): Need to
9500 save the group label.
9501
9502 * test/test_load.py (testClassification): New. Loads the
9503 iceland_sample_test.thuban file and checks if it was loaded
9504 correctly.
9505
9506 2003-04-15 Jonathan Coles <[email protected]>
9507
9508 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9509 to improve rendering performance by initializing the variables
9510 that are not change each time draw_polygon_shape() is called.
9511 The values are stored in a global struct draw_info.
9512 (draw_polygon_shape): Removed initialization code that is
9513 now in draw_polygon_init().
9514
9515 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9516 drawing initialization call to draw_polygon_init()
9517 (MapRenderer.draw_polygon_shape): Use new signature of
9518 draw_polygon_shape.
9519
9520 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9521 weirdness by setting the range to (1, maxint).
9522
9523 * Thuban/Model/classification.py (ClassGroupProperties): Make
9524 instance variables private and optimize comparison operator
9525 by first checking if the color references are the same.
9526 (ClassGroupSingleton): Make instance variables private.
9527 (ClassGroupRange): Make instance variables private.
9528
9529 * HOWTO-Release: Filled in missing steps for releasing packages.
9530
9531 2003-04-15 Bernhard Herzog <[email protected]>
9532
9533 First stab at internationalized messages:
9534
9535 * Thuban/__init__.py (_): Implement the translation function for
9536 real using the python gettext module.
9537
9538 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9539 translate empty strings.
9540
9541 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9542 Add a missing space to a warning message
9543
9544 * po/README: New. Notes about the management of the translation
9545 files.
9546
9547 * po/Makefile: New. Makefile to help manage the translation files.
9548
9549 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9550
9551 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9552 translations and support files in po/
9553
9554 * setup.py (data_files): Add the *.mo files to the data_files too
9555
9556 * README: Add note about the translations when building from CVS
9557
9558 2003-04-14 Jonathan Coles <[email protected]>
9559
9560 * Thuban/UI/dock.py: Fixes some window resizing problems most
9561 noticable under windows. Always assume the button bitmaps will
9562 be there. Code clean up.
9563 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9564 images for the dock/undock button to the same images.
9565 Work around for RTbug #1801.
9566
9567 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9568 be allowed to grow within the sizer. Fixes a bug under Windows
9569 where the toolbar wasn't being drawn.
9570
9571 2003-04-14 Frank Koormann <[email protected]>
9572
9573 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9574 Updated design to try to make the button functionality more
9575 transparent.
9576
9577 2003-04-14 Jonathan Coles <[email protected]>
9578
9579 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9580 finalize the intialization of the panel.
9581
9582 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9583 creation of the panel. Should be the last thing called in the
9584 initializer of a subclass.
9585
9586 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9587 set the current selections in the combo boxes. This is needed
9588 under Windows.
9589
9590 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9591 level panel to the dialog so that the background colors are
9592 consistent under Windows.
9593
9594 2003-04-11 Jonathan Coles <[email protected]>
9595
9596 * Thuban/UI/classgen.py: Change color ramps to start at white
9597 not black.
9598
9599 * Thuban/UI/legend.py: Enable/disable the legend buttons when
9600 the legend changes. Fixes RTbug #1793.
9601
9602 * test/test_classification.py: Added test for copying of
9603 classifications.
9604
9605 2003-04-11 Jonathan Coles <[email protected]>
9606
9607 * Thuban/UI/resource.py: New. Centralize the loading of resources
9608 such as bitmaps.
9609
9610 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
9611 added images to the move buttons, added 'reverse' button.
9612 (CustomRampPanel.__init__): Added images to the move buttons.
9613 (GreyRamp): New. Generates a ramp from white to black.
9614 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
9615
9616 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
9617 ID_PROPERTY_*.
9618 (Classifier.__init__): Minor changes to the layout.
9619 (Classifier._OnTitleChanged): Listen for when the user edits the
9620 title and update the dialog's title and the layer's title.
9621
9622 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
9623
9624 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
9625 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
9626 if the layer's title changes.
9627
9628 * Thuban/UI/mainwindow.py: Added new menu item and associated code
9629 to open a dialog to rename the map.
9630 (MainWindow): Use new resource class to import bitmaps.
9631
9632 2003-04-11 Jonathan Coles <[email protected]>
9633
9634 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
9635 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
9636 Resources/Bitmaps/group_use_none.xpm,
9637 Resources/Bitmaps/group_use_not.xpm,
9638 Resources/Bitmaps/hide_layer.xpm,
9639 Resources/Bitmaps/layer_properties.xpm,
9640 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
9641 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
9642 New.
9643
9644 2003-04-10 Jonathan Coles <[email protected]>
9645
9646 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
9647 Should pass group to ClassGroup constructor.
9648
9649 2003-04-10 Jonathan Coles <[email protected]>
9650
9651 * Thuban/Model/classification.py: (ClassGroup): Move all the common
9652 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
9653 here. Implement SetVisible(), IsVisible().
9654 (ClassGroup.__init__): Add group parameter which acts as a copy
9655 constructor.
9656
9657 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
9658 "Visible" check boxes.
9659 (Classifier): Rename the buttons and refactor the code to match
9660 the new labels.
9661
9662 * Thuban/UI/legend.py: Classify button is now called "Properties".
9663 Refactored the code to change variable names.
9664 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
9665
9666 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
9667 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
9668 renamed to MainWindow.LayerEditProperties.
9669 (MainWindow.ToggleLegend): Don't include map name in legend title.
9670 (MainWindow.SetMap): Added the map name to the window title.
9671 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
9672 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
9673 Functionality is found in the layer properties dialog.
9674
9675 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9676 draw visible groups.
9677
9678 2003-04-09 Jonathan Coles <[email protected]>
9679
9680 * Thuban/UI/classgen.py: Modifications to allow simple
9681 addition and selection of new color schemes.
9682 (MonochromaticRamp): New. Generates a ramp between two colors.
9683 (RedRamp): New. Generates a ramp of all red.
9684 (GreenRamp): New. Generates a ramp of all green.
9685 (BlueRamp): New. Generates a ramp of all blue.
9686
9687 2003-04-09 Jonathan Coles <[email protected]>
9688
9689 * Thuban/Model/classification.py (Classification.__deepcopy__):
9690 Need to copy over field and fieldType attributes.
9691
9692 * Thuban/Model/table.py (Table.field_range): New. Retrive the
9693 maximum and minimum values over the entire table for a given
9694 field.
9695 (Table.GetUniqueValues): New. Retrieve all the unique values
9696 in the table for a given field.
9697
9698 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9699 (GenUniquePanel): New. Controls to allow the user to select
9700 which unique field values they would like in the classification.
9701 (CustomRampPanel): Code that was in ClassGenDialog that allows
9702 the user to select the properties for a custom ramp.
9703 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9704
9705 * Thuban/UI/classifier.py: Removed a lot of debugging code.
9706 (Classifier._SetClassification): Callback method so that the
9707 class generator can set the classification in the grid.
9708 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9709 editing of a group properties class into a wxWindows control.
9710
9711 * Thuban/UI/dock.py: It was decided that if the user closes
9712 a dockable window the window should simply hide itself. That
9713 way if the user wants to show the dock again it appears in the
9714 same place as it was when it was closed.
9715 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9716 (DockableWindow._OnButtonClose): Hide the window instead of
9717 destroying it.
9718 (DockableWindow._OnClose): Hide the window instead of
9719 destroying it.
9720
9721 * Thuban/UI/legend.py (LegendTree): Use a private method to
9722 consistently set the font and style of the text. Fixes RTbug #1786.
9723
9724 * Thuban/UI/mainwindow.py: Import just the Classifier class.
9725
9726 2003-04-07 Bernhard Herzog <[email protected]>
9727
9728 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9729 to the map module
9730
9731 2003-04-07 Bernhard Herzog <[email protected]>
9732
9733 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9734 favor of ToggleSessionTree
9735 (MainWindow.ToggleSessionTree): New method to toggle visibility of
9736 the session tree.
9737 (MainWindow.SessionTreeShown): New method to return whether the
9738 session tree is currently shown.
9739 (MainWindow.ToggleLegend): New method to toggle visibility of the
9740 legend
9741 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9742 LegendShown
9743 (MainWindow.LegendShown): New method to return whether the legend
9744 is currently shown.
9745 (_method_command): Add checked parameter so we can define check
9746 menu items
9747 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9748 mainwindow methods.
9749 (show_session_tree, show_legend commands): Removed.
9750 (toggle_session_tree, toggle_legend commands): New commands to
9751 toggle the visibility of the dialogs
9752
9753 2003-04-07 Jonathan Coles <[email protected]>
9754
9755 * Thuban/UI/classgen.py: Fix Windows problem.
9756
9757 * Thuban/UI/dock.py: Fix Windows problem.
9758
9759 * Thuban/UI/mainwindow.py: Use False instead of false.
9760 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9761
9762 2003-04-07 Jonathan Coles <[email protected]>
9763
9764 Since we now say that the order of the groups in a classification
9765 matters, it makes sense to be able to manipulate that order. Most
9766 of the changes to Thuban/Model/classification.py are to that end.
9767
9768 * Thuban/Model/classification.py (Classification.AppendGroup,
9769 Classification.InsertGroup, Classification.ReplaceGroup,
9770 Classification.RemoveGroup, Classification.GetGroup): Do as the
9771 names imply.
9772 (Classification.FindGroup): This was called GetGroup, but GetGroup
9773 takes an index, while FindGroup takes a value.
9774 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9775 REFERENCE. Currently there is a cyclic reference between the layer
9776 and its classification. If the classification doesn't need to know
9777 its owning layer we can change this, since it may make sense to be
9778 able to use the same classification with different layers.
9779
9780 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9781
9782 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9783 not AddGroup()
9784
9785 * Thuban/UI/classifier.py: Now that we can depend on the order in
9786 a Classification and have methods to manipulate that order we don't
9787 need to use our own data structures in the grid. We can simply make
9788 the grid/table access the information they need from a copy of
9789 the classification object.
9790 (Classifier._OnCloseBtn): Event handler for when the user clicks
9791 'Close'. This is needed so if the user applies changes and then
9792 continues to change the table the user has the option of discarding
9793 the most recent changes and keeping what they applied.
9794
9795 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9796 into the same group.
9797
9798 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9799 with a really old version of proj, PJ_VERSION won't even be defined.
9800 If it isn't defined then just compile so that the function always
9801 returns Py_False.
9802
9803 * test/test_classification.py: Fix tests to use the renamed methods.
9804 Still need to write tests for the new methods.
9805
9806 2003-04-04 Jonathan Coles <[email protected]>
9807
9808 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9809 call to SetSelection out of the method and before the call
9810 to __SelectField in __init__. This prevents a recursion of events
9811 when _OnFieldSelect is triggered by the user.
9812
9813 2003-04-04 Jonathan Coles <[email protected]>
9814
9815 * Thuban/Model/classification.py: Rename Color.None to
9816 Color.Transparent.
9817 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9818 Don't bother copying the color, since Colors are immutable.
9819
9820 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9821 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9822 Thuban/UI/renderer.py, Thuban/UI/view.py:
9823 Rename Color.None to Color.Transparent.
9824
9825 * test/test_classification.py, test/test_load.py: Rename Color.None
9826 to Color.Transparent.
9827
9828 2003-04-04 Jonathan Coles <[email protected]>
9829
9830 * Thuban/Model/classification.py: Fix assert calls.
9831 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9832 Copy the color parameter rather than hold onto a reference.
9833
9834 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9835 the color object.
9836 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9837 are sure there exists only one refernce to Color.None in the system.
9838 This allows us to use 'is' rather than the comparision functions.
9839
9840 * Thuban/Model/save.py: Fix assert calls.
9841
9842 * Thuban/UI/classifier.py: Fix assert calls.
9843 (ClassGrid._OnCellDClick): Call up to the classifier to open the
9844 dialog to edit the groups properties.
9845 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9846 correctly if a cell is resized.
9847 (ClassTable.SetClassification): New. Changes the classification
9848 that is in the table.
9849 (ClassTable.__SetRow): Allow groups to be prepended.
9850 (Classifier): New code for opening the EditProperties and
9851 GenerateRanges dialogs.
9852 (SelectPropertiesDialog.__GetColor): Only set the color in the
9853 color dialog if the current color is not None.
9854
9855 * Thuban/UI/dock.py: Fix assert calls.
9856
9857 * Thuban/UI/legend.py: Fix assert calls.
9858
9859 * Thuban/UI/renderer.py: Fix assert calls.
9860
9861 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9862 classifications.
9863 (GenRangePanel): Panel specific to range generation.
9864 (GenSingletonPanel): Panel specific to singleton generation.
9865 (ClassGenerator): Class responsible for actually generating
9866 the classification from the data gathered in the dialog box.
9867 (PropertyRamp): Generates properties whose values range from
9868 a starting property to an ending property.
9869
9870 2003-04-03 Bernhard Herzog <[email protected]>
9871
9872 * test/support.py (print_garbage_information): New function that
9873 prints information about still connected messages and memory
9874 leaks.
9875 (run_suite): Removed.
9876 (run_tests): New function for use as a replacement of
9877 unittest.main in the test_* files. This one calls
9878 print_garbage_information at the end.
9879
9880 * test/runtests.py (main): Use support.print_garbage_information
9881
9882 * test/test_layer.py: Use support.run_tests instead of
9883 unittest.main so we get memory leak information
9884 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9885 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9886 (TestLayerLegend.test_visibility): Call the layer's Destroy method
9887 to fix a memory leak.
9888
9889 * test/test_classification.py: Use support.run_tests instead of
9890 unittest.main so we get memory leak information
9891 (TestClassification.test_classification): Call the layer's Destroy
9892 method to fix a memory leak.
9893
9894 2003-04-02 Bernhard Herzog <[email protected]>
9895
9896 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9897 Handle the reference counts of the return value and errors in
9898 PyArg_ParseTuple correctly.
9899
9900 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9901 sure the filename is absolute to avoid problems when saving the
9902 session again
9903
9904 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9905
9906 2003-04-01 Jonathan Coles <[email protected]>
9907
9908 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9909 that there actually are points in the returned list of points
9910 before trying to index into the list. The list may be empty if
9911 the shape is a Null Shape.
9912
9913 2003-04-01 Bernhard Herzog <[email protected]>
9914
9915 * test/test_map.py: Don't use from <module> import *
9916
9917 2003-04-01 Jonathan Coles <[email protected]>
9918
9919 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9920 LAYER_LEGEND_CHANGED
9921
9922 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9923 self.Destroy() to close the window after yesterday's changes.
9924
9925 * test/test_map.py, test/test_session.py: Fix messages that
9926 are sent from maps and layers.
9927
9928 2003-03-31 Jonathan Coles <[email protected]>
9929
9930 * Thuban/UI/classifier.py: Commented out some debugging statements.
9931 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9932 RTbug #1769.
9933
9934 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9935 position (although position doesn't work yet under GTK).
9936 (DockableWindow.Destroy): New. Called when the window must be
9937 closed. Namely needed when the DockFrame closes and must close
9938 its children.
9939 (DockFrame): Listen for EVT_CLOSE and destroy all children.
9940
9941 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9942 when then window is told to close.
9943 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9944 comment in source for more info.
9945
9946 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9947
9948 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9949 symmetry with other such methods.
9950 (MainWindow.ShowLegend): Show the legend docked by default.
9951
9952 2003-03-28 Jonathan Coles <[email protected]>
9953
9954 * Thuban/UI/classifier.py: Support for highlighting a specific
9955 group within the grid when the classification dialog is opened.
9956 Also contains a lot of debugging printouts which will later
9957 be removed.
9958
9959 * Thuban/UI/dock.py: Complete rework on the dock code so that
9960 that it is fairly removed from the rest of the Thuban application.
9961 It is easy to add new docks which the rest of the program having
9962 to be aware of them.
9963
9964 * Thuban/UI/legend.py: Modifications to support selecting a
9965 specific group in the classification dialog. Changed how layers
9966 are drawn when the layer is visible/invisible.
9967
9968 * Thuban/UI/mainwindow.py: Removed legend specific code and
9969 replaced it with calls to the new dock code.
9970
9971 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9972 to check if scale > 0. Trying to track down a divide by zero.
9973
9974 2003-03-26 Jonathan Coles <[email protected]>
9975
9976 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9977 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9978 now part of DockableWindow.
9979 (LegendPanel.DoOnSelChanged): Select the current layer in the
9980 map.
9981 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9982 with the selected layer and/or group.
9983
9984 2003-03-26 Jonathan Coles <[email protected]>
9985
9986 This putback contains the code for dockable windows. There is
9987 no support in wxWindows as of this date for windows that can
9988 attach themselves to other windows.
9989
9990 The current model contains a DockableWindow which has a parent
9991 window for when it is detached and a dock window that it puts
9992 its contents in when it is docked. The contents of a DockableWindow
9993 must be a DockPanel. DockPanel itself derives from wxPanel.
9994
9995 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9996 message, not a LAYER_LEGEND_CHANGED message.
9997
9998 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9999
10000 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10001 as one of the style properties for the fieldTypeText item to
10002 be sure that its size is correct when the text changes.
10003
10004 * Thuban/UI/dock.py: New. Classes for the DockPanel and
10005 DockableWindow.
10006
10007 * Thuban/UI/legend.py: Added some more buttons and made the
10008 LegendPanel a DockPanel.
10009
10010 * Thuban/UI/mainwindow.py: Added sash windows to the main window
10011 and supporting functions for manipulating the sashes.
10012 (MainWindow.ShowLegend): Create a DockableWindow with the
10013 LegendPanel as the contents.
10014
10015 * Thuban/UI/messages.py: Added DOCKABLE_* messages
10016
10017 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10018 not LAYER_LEGEND_CHANGED, messages.
10019
10020 2003-03-25 Jonathan Coles <[email protected]>
10021
10022 * setup.py: Added custom script bdist_rpm_build_script so that
10023 when the rpm is built the path to wx-config is correct.
10024
10025 * setup.cfg: Added line saying to use the custom build script
10026
10027 2003-03-20 Jonathan Coles <[email protected]>
10028
10029 Initial implementation of the Legend.
10030
10031 * Thuban/UI/legend.py: New. Creates a window that shows the map's
10032 Legend information and allows the user to add/modify classifications
10033 and how the layers are drawn on the map.
10034
10035 * setup.py: New command 'build_docs' which currently uses
10036 happydoc to generate html documentation for Thuban.
10037
10038 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10039 Returns a string which is appropriately describes the group.
10040
10041 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10042 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10043
10044 * Thuban/Model/map.py (Map): Rename messages and use new, more
10045 specific, messages.
10046
10047 * Thuban/Model/messages.py: New message to indicate that a layer's
10048 data has changed (LAYER_CHANGED). New map messages to indicate
10049 when layers have been added/removed/changed or if the stacking order
10050 of the layers has changed.
10051
10052 * Thuban/Model/session.py: Rename and use new messages.
10053
10054 * Thuban/UI/classifier.py: Remember if any changes have actually
10055 been applied so that if the dialog is cancelled without an application
10056 of changes we don't have to set a new classification.
10057 (ClassDataPreviewer): Pulled out the window specific code and put it
10058 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10059 symbols on any DC.
10060
10061 * Thuban/UI/mainwindow.py: New code to open the legend.
10062
10063 * Thuban/UI/view.py: Use new message names.
10064
10065 2003-03-19 Jonathan Coles <[email protected]>
10066
10067 * Thuban/UI/main.py (verify_versions): New. Checks the versions
10068 of Python, wxPython, and some other libraries.
10069
10070 * extensions/thuban/wxproj.cpp (check_version): Checks the given
10071 version against what wxproj was compiled with.
10072 (check_version_gtk): If wxproj was compiled with gtk then check
10073 the given version against the version of the gtk library
10074 currently being used.
10075
10076 2003-03-14 Bernhard Herzog <[email protected]>
10077
10078 * test/test_command.py: Run the tests when the module is run as a
10079 script
10080
10081 2003-03-14 Bernhard Herzog <[email protected]>
10082
10083 Implement selection of multiple selected shapes in the same layer:
10084
10085 - Introduce a new class to hold the selection. This basically
10086 replaces the interactor which was nothing more than the
10087 selection anyway. A major difference is of course that the new
10088 selection class supports multiple selected shapes in one layer
10089
10090 - Move the object that represents the selection from the
10091 application to the canvas. The canvas is a better place than the
10092 application because the selection represents which shapes and
10093 layer of the map displayed by the canvas are selected and
10094 affects how the map is drawn.
10095
10096 - Make the selection and its messages publicly available through
10097 the mainwindow.
10098
10099 - The non-modal dialogs do not get a reference to the interactor
10100 anymore as they can simply refer to their parent, the
10101 mainwindow, for the what the interactor had to offer.
10102
10103 * Thuban/UI/selection.py: New module with a class to represent the
10104 selection.
10105
10106 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10107 these unused messages
10108
10109 * Thuban/UI/application.py (ThubanApplication.OnInit)
10110 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10111 interactor is gone now.
10112 (ThubanApplication.CreateMainWindow): There is no interactor
10113 anymore so we pass None as the interactor argument for now for
10114 compatibility.
10115
10116 * Thuban/UI/view.py (MapCanvas.delegated_messages)
10117 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10118 Unsubscribe, delegate messages according to the delegated_messages
10119 class variable.
10120 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10121 attributes from instance variables as described with the
10122 delegated_methods class variable.
10123 (MapCanvas.__init__): New instance variable selection holding the
10124 current selection
10125 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10126 pass them on to the renderer
10127 (MapCanvas.SetMap): Clear the selection when a different map is
10128 selected.
10129 (MapCanvas.shape_selected): Simple force a complete redraw. The
10130 selection class now takes care of only issueing SHAPES_SELECTED
10131 messages when the set of selected shapes actually does change.
10132 (MapCanvas.SelectShapeAt): The selection is now managed in
10133 self.selection
10134
10135 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10136 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10137 Unsubscribe, delegate messages according to the delegated_messages
10138 class variable.
10139 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10140 attributes from instance variables as described with the
10141 delegated_methods class variable.
10142 (MainWindow.__init__): The interactor as ivar is gone. The
10143 parameter is still there for compatibility. The selection messages
10144 now come from the canvas.
10145 (MainWindow.current_layer, MainWindow.has_selected_layer):
10146 Delegate to the the canvas.
10147 (MainWindow.LayerShowTable, MainWindow.Classify)
10148 (MainWindow.identify_view_on_demand): The dialogs don't need the
10149 interactor parameter anymore.
10150
10151 * Thuban/UI/tableview.py (TableFrame.__init__)
10152 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10153 (LayerTableFrame.row_selected): The interactor is gone. It's job
10154 from the dialog's point of view is now done by the mainwindow,
10155 i.e. the parent. Subscribe to SHAPES_SELECTED instead
10156 of SELECTED_SHAPE
10157
10158 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10159 is gone. It's job from the dialog's point of view is now done by
10160 the mainwindow, i.e. the parent.
10161
10162 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10163 gone. It's job from the dialog's point of view is now done by the
10164 mainwindow, i.e. the parent.
10165
10166 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10167 gone. It's job from the dialog's point of view is now done by the
10168 mainwindow, i.e. the parent.
10169 (SessionTreeCtrl.__init__): New parameter mainwindow which is
10170 stored as self.mainwindow. The mainwindow is need so that the tree
10171 can still subscribe to the selection messages.
10172 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10173 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10174 selection is now accessible through the mainwindow. Subscribe to
10175 SHAPES_SELECTED instead of SELECTED_SHAPE
10176
10177 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10178 SHAPES_SELECTED message now.
10179 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10180 so deal with multiple shapes
10181 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10182 gone. It's job from the dialog's point of view is now done by the
10183 mainwindow, i.e. the parent.
10184
10185 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10186 parameter is now a list of shape ids.
10187 (RecordTable.SetTable): The second parameter is now a list of
10188 indices.
10189
10190 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10191 selected_shape parameter and ivar to selected_shapes. It's now a
10192 list of shape ids.
10193 (MapRenderer.draw_label_layer): Deal with multiple selected
10194 shapes. Rearrange the code a bit so that the setup and shape type
10195 distinctions are only executed once.
10196
10197 * test/test_selection.py: Test cases for the selection class
10198
10199 2003-03-11 Jonathan Coles <[email protected]>
10200
10201 * Thuban/Model/load.py: Temporary fix so that the xml reader
10202 doesn't cause Thuban to crash.
10203
10204 * Thuban/Model/layer.py: Handle the cyclic references between
10205 a layer and its classification better, and be sure to disconnect
10206 the classification from the layer when the layer is destroyed
10207 so that we don't maintain a cyclic reference that may not be
10208 garbage collected.
10209
10210 * Thuban/Model/classification.py: See comment for layer.py.
10211
10212 2003-03-12 Jan-Oliver Wagner <[email protected]>
10213
10214 * HOWTO-Release: New. Information on the steps for releasing
10215 a new version of Thuban.
10216
10217 2003-03-11 Jonathan Coles <[email protected]>
10218
10219 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10220 Use True instead of true.
10221 (Classifier): Should have a single panel in which all the controls lie.
10222
10223 * Thuban/UI/proj4dialog.py: Add normal border.
10224
10225 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10226
10227 * Thuban/UI/mainwindow.py: Use True instead of true.
10228
10229 * setup.py: Update some definitions to use wxWindows2.4 files
10230
10231 * Data/iceland_sample_class.thuban: Fixed file so that the
10232 field_type information is present.
10233
10234 2003-03-10 Jonathan Coles <[email protected]>
10235
10236 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10237 field type label grow so that when the text changes the
10238 size is updated correctly. This may be a wxWindows bug.
10239
10240 2003-03-10 Jonathan Coles <[email protected]>
10241
10242 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10243 SESSION_REPLACED.
10244
10245 * Thuban/UI/classifier.py: Wrap text with _().
10246 (ClassGrid.CreateTable): Set dimensions and size hints here,
10247 instead of in Reset, so we only set the size once.
10248
10249 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10250
10251 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10252 Call Close() instead of Shutdown().
10253
10254 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10255
10256 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10257 Go back to using OnClose() instead of Shutdown().
10258
10259 2003-03-10 Jonathan Coles <[email protected]>
10260
10261 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10262 to know the old field index as well as the new one.
10263
10264 2003-03-10 Jonathan Coles <[email protected]>
10265
10266 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10267 to correctly set the table information and call this from
10268 __init__ and from _OnFieldSelect so that all the information
10269 is up to date when the dialog opens and when a field is changed.
10270
10271 2003-03-10 Jonathan Coles <[email protected]>
10272
10273 * Thuban/Model/classification.py (Classification): Don't use
10274 layer's message function directly, use the ClassChanged() method
10275 when then classification changes. SetField/SetFieldType/SetLayer
10276 must keep the information about field name and field type in
10277 sync when an owning layer is set or removed.
10278
10279 * Thuban/Model/layer.py: Added ClassChanged() so that the
10280 classification can tell the layer when its data has changed.
10281 (Layer.SetClassification): Accepts None as an arguement to
10282 remove the current classification and correctly handles
10283 adding a new classification.
10284
10285 * Thuban/Model/load.py: Comment out print statement
10286
10287 * test/test_classification.py, test/test_save.py: New and
10288 improved tests.
10289
10290 2003-03-07 Jonathan Coles <[email protected]>
10291
10292 * Thuban/Model/classification.py: Implemented __copy__ and
10293 __deepcopy__ for ClassGroup* and ClassGroupProperites so
10294 they can easily be copied by the classifier dialog.
10295 (ClassGroupProperites.__init__): The default line color should
10296 have been Color.Black.
10297
10298 * Thuban/UI/classifier.py: Setting and Getting table values now
10299 uses a consistent set of functions.
10300 (Classifier): Now non-modal. Has field type label which changes
10301 as the field changes. Keep track of buttons in a list so that
10302 we can enable/disable the buttons when the None field is selected.
10303 (SelectPropertiesDialog): Add buttons to make the colors transparent.
10304
10305 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10306 does what OnClose did, but can be called by the application to
10307 close a window. Needed when a session changes, and we have to
10308 close the classifier windows.
10309
10310 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10311 Shuts down open dialogs. Used when a new session is created
10312 or a session is opened.
10313 (MainWindow.SaveSession): Should only call application.SaveSession()
10314 if we don't call SaveSessionAs first.
10315 (MainWindow.Classify): Allow different classifier dialogs for
10316 different layers.
10317
10318 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10319 the parent class handle it. Add Shutdown() to unsubscibe from
10320 event notification and call the parent Shutdown(). This was
10321 necessary so the application can close the tree window.
10322
10323 2003-03-06 Jonathan Coles <[email protected]>
10324
10325 * Thuban/Model/classification.py: Minor documentation changes,
10326 Addition of __eq__ and __ne__ methods.
10327 (Classification.SetLayer): prevent recursion between this method
10328 and Layer.SetClassification().
10329
10330 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10331
10332 * Thuban/Model/layer.py (SetClassification): prevent recursion
10333 between this method and Classification.SetLayer().
10334
10335 * test/test_classification.py, test/test_load.py,
10336 test/test_session.py: Fixed and added tests for the classification
10337 classes.
10338
10339 2003-03-06 Bernhard Herzog <[email protected]>
10340
10341 * Thuban/UI/classifier.py (ClassGrid.__init__)
10342 (ClassGrid.CreateTable): Move the SetSelectionMode call to
10343 CreateTable because otherwise it triggers an assertion in
10344 wxPython/wxGTK 2.4.
10345
10346 2003-03-05 Jonathan Coles <[email protected]>
10347
10348 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10349
10350 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10351
10352 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10353
10354 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10355
10356 2003-03-05 Jonathan Coles <[email protected]>
10357
10358 * Thuban/UI/classifier.py: Added class documentation.
10359 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10360 Store just the groups in the table and generate the other
10361 column information when it is requested. Add "None" field
10362 to pull-down to select no classification.
10363
10364 * Thuban/common.py: Moved FIELDTYPE constants from table.py
10365 (Str2Num): Only catch ValueError exceptions.
10366
10367 * Thuban/Model/classification.py: Class documentation. Renaming
10368 of methods with Stroke to Line. Groups are stored in a single
10369 list with the default as the first element. Groups are searched
10370 in the order they appear in the list.
10371
10372 * Thuban/Model/color.py: Documentation.
10373
10374 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10375 the kind of data represented by a field.
10376
10377 * Thuban/Model/load.py (ProcessSession): Use proper string
10378 conversion function; fixes RTbug #1713.
10379
10380 * Thuban/Model/save.py (Saver): Store field type information.
10381
10382 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10383 (Table): Add field_info_by_name() to retrieve field information
10384 by specifying the field name, not the number.
10385
10386 * Thuban/UI/mainwindow.py: Function name changes.
10387
10388 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10389 get the layer classification once. Don't try to classify
10390 values when the field is None: just use the default properties.
10391
10392 * Thuban/UI/view.py: Function name changes.
10393
10394 * Doc/thuban.dtd: Add field_type attribute to a classification.
10395
10396 2003-03-04 Bernhard Herzog <[email protected]>
10397
10398 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10399 the fill and stroke layer attributes optional with suitable
10400 default values. Add the stroke_width layer attribute. Use correct
10401 syntax for empty elements. Make the attribute list for labels
10402 refer to the label element.
10403
10404 2003-03-04 Bernhard Herzog <[email protected]>
10405
10406 * setup.py (thuban_build_py.build): Add a comment about distutils in
10407 Python 2.3 containing some of the functionality we implement in
10408 setup.py ourselves.
10409
10410 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10411 before the selection mode. Doing it the other way round triggers
10412 an assertion in wxWindows.
10413
10414 * Thuban/Model/save.py (escape): Fix typo in doc-string
10415
10416 * Thuban/Model/classification.py: Remove unnecessary wxPython
10417 import
10418
10419 2003-03-04 Jonathan Coles <[email protected]>
10420
10421 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10422 Parameter 'value' should default to None.
10423
10424 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10425 the class attribute __classification is now private.
10426
10427 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10428 Classifier to ClassGrid. Added support for removing selected rows,
10429 which including code for keeping track of when cells are selected,
10430 and deselected.
10431 (ClassTable): Support for added/removing rows. Fixed a problem
10432 with __ParseInput whereby it would not allow strings (only numbers)
10433 to be entered.
10434 (Classifier): Added button and supporting code for removing
10435 selected rows.
10436
10437 2003-02-27 Jonathan Coles <[email protected]>
10438
10439 * Thuban/common.py: Moved color conversion functions into
10440 Thuban/UI/common.py.
10441 (Str2Num): Now converts the float (not the string) to a long/int
10442 so that an exception isn't thrown.
10443
10444 * Thuban/UI/common.py: Common functions used in several UI modules
10445
10446 * Thuban/Model/classification.py: Changed the class hierarchy
10447 so that a Classification consists of Groups which return
10448 Properties when a value matches a Group.
10449
10450 * Thuban/Model/layer.py: Fixed name resolution problem.
10451
10452 * Thuban/Model/load.py: Use new Classification and Group functions.
10453
10454 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10455 failure.
10456 (Saver.write_classification): Use new Classification and Group
10457 functions.
10458
10459 * Thuban/UI/classifier.py: Changes to use new Classification and Group
10460 functions. Fix to create a tuple with a single value instead of
10461 simply returning the value.
10462
10463 * Thuban/UI/renderer.py: Use new Classification and Group functions.
10464 Use common.py functions.
10465
10466 * Thuban/UI/tree.py: Use common.py functions.
10467
10468 * test/test_classification.py: Use new Classification and Group
10469 classes.
10470
10471 2003-02-24 Jonathan Coles <[email protected]>
10472
10473 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10474 functions from Thuban color objects to wxWindow colour objects.
10475
10476 * Thuban/Model/classification.py (Classification): Renamed
10477 GetProperties() to GetClassData(). Used the new iterator
10478 in TreeInfo().
10479 (ClassIterator): Iterator implementation to iterate over the
10480 ClassData objects in a classification object.
10481
10482 * Thuban/Model/save.py (Saver.write_classificaton): Uses
10483 the new iterator to save the classification information.
10484
10485 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10486 for changing the stroke and fill colors and previewing the
10487 changes.
10488
10489 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10490 MainWindow.SaveSessionAs): Text string changes so the dialogs
10491 have more meaningful titles.
10492
10493 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10494 Classification method name from GetProperties to GetClassData.
10495
10496 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10497 instead of accessing now non-existent class variables.
10498
10499 2003-02-24 Bernhard Herzog <[email protected]>
10500
10501 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10502 unneeded Shape() call. Rendering is substantially faster without
10503 it and it avoids some problems with broken shape files.
10504
10505 2003-02-20 Frank Koormann <[email protected]>
10506
10507 Force minimal size of identify and label dialogs. The autosizing
10508 looked too ugly.
10509
10510 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10511 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10512 Set size of listctrl.
10513 * Thuban/UI/identifyview.py (IdentifyView.__init__):
10514 Set size of dialog.
10515
10516 2003-02-19 Jonathan Coles <[email protected]>
10517
10518 * test/test_classification.py, test/test_layer.py,
10519 test/test_load.py, test/test_map.py, test/test_session.py:
10520 Updated the tests to use the new functions that are in the
10521 respective classes.
10522
10523 * Thuban/Model/classification.py (Classification):
10524 Uses the new ClassData* classes. Modification messages are
10525 passed up to the parent layer (if it exists).
10526 (ClassData): New class to encapsulate the common data in each
10527 classification property.
10528 (ClassDataDefault): Represents the Default class. data.
10529 (ClassDataPoint): Represents a single class. data point
10530 (ClassDataRange): Represents a class. range
10531 (ClassDataMap): Represents a class. map (unused).
10532
10533 * Thuban/Model/color.py: Added Color.None to represent something
10534 with no color. Color.Black represents the color black.
10535 (NoColor): Helper class derived from Color to represent something
10536 with no color.
10537
10538 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10539 stroke_width attributes. Made the 'classification' attribute private.
10540 New methods for setting/getting the classification.
10541
10542 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10543 to get the classifcation and use the new ClassData* classes to
10544 hold the classification data. Use Str2Num to convert numbers
10545 properly.
10546
10547 * Thuban/Model/save.py (Saver): Use new Color and Classification
10548 methods
10549
10550 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10551 custom grid.
10552 (ClassTable): Support for editing Values and Labels and for
10553 changing what type (point or range) of data is stored in each
10554 property based on how the user enters the data.
10555 (Classifier): Support for saving the new classifications and
10556 launching the dialog to edit a property.
10557 (SelectPropertiesDialog): New class for editing the visual
10558 properties of a classification (stroke color, width, and fill color)
10559 (ClassPreviewer): Took the Draw method from ClassRenderer and
10560 made most of it into this new class. Intend to use this class in
10561 the SelectPropertiesDialog for previewing changes.
10562
10563 * Thuban/UI/renderer.py: Use new Color and Classification methods.
10564
10565 * Thuban/UI/tree.py: Formatting changes.
10566
10567 * Doc/thuban.dtd: Add 'label' element
10568
10569 * Thuban/common.py: New. Contains common routines used throughout
10570 the code.
10571 (Str2Num): Takes a string and converts it to the "best" type of
10572 number.
10573
10574 2003-02-14 Bernhard Herzog <[email protected]>
10575
10576 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10577 dragging flag is always set to 0 even when the tool implementation
10578 raises an exception
10579
10580 2003-02-11 Bernhard Herzog <[email protected]>
10581
10582 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10583 method to create a splash screen.
10584 (ThubanApplication.ShowMainWindow): New. Show the main window.
10585 Needed so the splash screen can display the mainwindow
10586 (ThubanApplication.OnInit): Call the
10587 new splash_screen method to determine whether the application
10588 should display a splash screen. If it displays a splash screen do
10589 not immediately show the main window.
10590
10591 2003-02-11 Jonathan Coles <[email protected]>
10592
10593 * Thuban/Model/classification.py: Added import line to fix
10594 feature conflicts between running on python2.2 and python2.1.
10595
10596 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10597 onto the clinfo parameter, so removed the deepcopy().
10598
10599 2003-02-10 Jonathan Coles <[email protected]>
10600
10601 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10602 Added element_open variable to track opening and closing of tags
10603 so that tags that don't span more than one line are closed with
10604 /> instead of </tag_name>. Use the GetDefault*() methods of
10605 the Classification class.
10606
10607 * Thuban/Model/classification.py (Classificaton): Added set and
10608 get methods for the default data. The class also takes a layer
10609 reference so that modification messages can be sent. Fixed the
10610 methods to use the new ClassData class.
10611 (ClassData): New class to encapsulate the classification data
10612
10613 * Thuban/Model/layer.py (Layer): Remove the
10614 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
10615 SetDefault*() methods on the layer's classification object.
10616 (Layer.__init__): Use the new SetDefault*() methods in the
10617 Classification class.
10618
10619 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
10620 object instead of a dictionary.
10621
10622 * Thuban/UI/classifier.py (ClassRenderer): New class to
10623 draw the classifications in the dialog box's table.
10624 (Classifier): Modified to use the ClassRenderer class.
10625
10626 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
10627 methods of the Classification class.
10628
10629 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
10630 of the ClassData class.
10631
10632 * test/test_classification.py, test/test_layer.py,
10633 test/test_map.py, test/test_session.py: Fix the tests to work
10634 with the above code changes.
10635
10636 2003-02-03 Jonathan Coles <[email protected]>
10637
10638 * Thuban/Model/classification.py (Classification): Added getNull()
10639 to return the NullData reference
10640
10641 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
10642 Layer.SetStrokeWidth): Modified these functions to change the
10643 null data in the classification rather than keep these values
10644 directly in the Layer class. Menu options to change these values
10645 work again.
10646
10647 2003-01-28 Jonathan Coles <[email protected]>
10648
10649 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
10650 Fixed crashing problem on some systems. Dialog box shows
10651 classification data.
10652
10653 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
10654 Colors in the tree view.
10655
10656 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
10657 the tree info for classifications. Commented out unnecessary lines.
10658
10659 * Thuban/Model/classification.py (Classification.TreeInfo): New
10660 function to add information about the classification into the
10661 tree view.
10662
10663 2003-01-27 Jan-Oliver Wagner <[email protected]>
10664
10665 * Thuban/__init__.py (_): New.
10666
10667 * Thuban/Model/classification.py, Thuban/Model/extension.py,
10668 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
10669 Thuban/Model/session.py, Thuban/UI/application.py,
10670 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
10671 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
10672 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
10673 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
10674 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
10675
10676 2003-01-27 Jonathan Coles <[email protected]>
10677
10678 * Thuban/Model/layer.py: Classification initialization calls.
10679
10680 * Thuban/Model/classification.py: Created class to encapsulate
10681 a layer classification. Supports specific data points and
10682 ranges.
10683
10684 * Thuban/Model/load.py: Added support for loading classification
10685 information.
10686
10687 * Thuban/Model/save.py: Added support for saving classification
10688 information.
10689
10690 * Thuban/UI/classifier.py: Initial class for a dialog box for
10691 specifying classification information.
10692
10693 * Thuban/UI/mainwindows.py: Support for opening the classifier
10694 dialog.
10695
10696 * Thuban/UI/renderer.py: Support for drawing a layer with the
10697 classification information.
10698
10699 * Data/iceland_sample_class.thuban: iceland_sample with
10700 classification data.
10701
10702 * test/test_classification: Tests for the Classification class.
10703
10704 2002-12-09 Bernhard Herzog <[email protected]>
10705
10706 * test/test_command.py: New. Tests for the command classes.
10707
10708 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
10709 (Command.IsTool): New method to distinguish between command
10710 switching tools and other commands.
10711
10712 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
10713 the tool to avoid direct assignments to instance variables
10714 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
10715 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
10716 change the tool
10717
10718 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
10719 active tool's command turns insensitive, disable the tool.
10720 (_tool_command): Use the new ToolCommand class
10721
10722 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
10723 SelectTool method to change the tool
10724 (iconfile): Use the ToolCommand class
10725
10726 2002-12-03 Bernhard Herzog <[email protected]>
10727
10728 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
10729 the case of selected items that are not children of Layers or Maps
10730 properly. Previously this bug would trigger an assertion in
10731 wxWindows.
10732
10733 2002-11-06 Frank Koormann <[email protected]>
10734
10735 * Thuban/UI/mainwindow.py: Altered the order of tools in the
10736 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10737 Full Extent).
10738
10739 2002-10-23 Bernhard Herzog <[email protected]>
10740
10741 * setup.py (setup call): version now 0.1.3
10742
10743 * MANIFEST.in: Add the files in test/
10744
10745 * test/README: Add note about tests requiring the iceland data
10746
10747 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10748 copyright notice.
10749
10750 2002-10-18 Bernhard Herzog <[email protected]>
10751
10752 * test/test_map.py
10753 (TestMapWithContents.test_projected_bounding_box): Use an explicit
10754 epsilon.
10755
10756 * test/support.py (FloatComparisonMixin.assertFloatEqual)
10757 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10758 message if the assertion fails and don't return the return value
10759 of self.assert_. In assertFloatSeqEqual the return meant that not
10760 all items of the sequence were compared.
10761
10762 2002-09-20 Bernhard Herzog <[email protected]>
10763
10764 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10765
10766 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10767
10768 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10769 the string with the bounding box on the fly because of platform
10770 differences in the way %g is handled.
10771
10772 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10773 DBFfile too because Thuban layers can't yet cope missing DBF
10774 files.
10775
10776 2002-09-20 Bernhard Herzog <[email protected]>
10777
10778 * test/test_menu.py: Use initthuban instead of
10779 add_thuban_dir_to_path to initialize Thuban.
10780
10781 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10782 Mixin class for float comparisons
10783 (SubscriberMixin): New. Mixin class to test messages sent through
10784 the Connector class
10785
10786 * test/README: Fix a typo and add the -v flag to the command for
10787 individual tests
10788
10789 * test/test_session.py: New. Test cases for Thuban.Model.session
10790
10791 * test/test_proj.py: New. Test cases for Thuban.Model.proj
10792
10793 * test/test_map.py: New. Test cases for Thuban.Model.map
10794
10795 * test/test_layer.py: New. Test cases for Thuban.Model.layer
10796
10797 * test/test_label.py: New. Test cases for Thuban.Model.label
10798
10799 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10800
10801 * test/test_color.py: New. Test cases for Thuban.Model.color
10802
10803 * test/test_base.py: New. Test cases for Thuban.Model.base
10804
10805 2002-09-13 Bernhard Herzog <[email protected]>
10806
10807 * Thuban/Model/session.py (Session.forwarded_channels): Forward
10808 the CHANGED channel too.
10809
10810 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10811 CHANGED channel too.
10812 (Map.__init__): Call the Modifiable constructor as well.
10813
10814 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10815 event if the modified flag changes.
10816 (Modifiable.changed): Tweak the doc-string.
10817
10818 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10819 (MainWindow.set_position_text): Put the code that puts the text
10820 with the mouse position into the status bar into the new method
10821 set_position_text so that it can overwritten in derived classes.
10822
10823 2002-09-12 Bernhard Herzog <[email protected]>
10824
10825 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10826 message box on the main window.
10827
10828 2002-09-11 Bernhard Herzog <[email protected]>
10829
10830 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10831 the 'E' because it's less likely to interfere with other menu
10832 entries.
10833 (MainWindow.build_menu): remove an incorrect comment.
10834
10835 2002-09-10 Bernhard Herzog <[email protected]>
10836
10837 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10838 (_tool_command): Add sensitive parameter
10839 (_has_visible_map): Sensitivity callback to tools and other
10840 commands that require a visible map. Use it in map_zoom_in_tool,
10841 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10842 and map_full_extent
10843
10844 2002-09-06 Bernhard Herzog <[email protected]>
10845
10846 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10847 VIEW_POSITION
10848
10849 2002-09-04 Frank Koormann <[email protected]>
10850
10851 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10852
10853 2002-09-02 Bernhard Herzog <[email protected]>
10854
10855 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10856 wxWindows already and our implementation doesn't work correctly
10857 with wxGTK 2.3:
10858 (MapCanvas.__init__): Remove the instance variable
10859 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10860 be drawin
10861 (MapCanvas.OnIdle): Removed.
10862
10863 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10864 a parameter to determine the size of the rectangle.
10865 (MapCanvas.find_shape_at): Create the box around the point on a
10866 layer by layer basis and make the size depend on the shape type.
10867 This solves a problem with the selection of point shapes at the
10868 border of the layer's bounding box
10869
10870 2002-08-30 Bernhard Herzog <[email protected]>
10871
10872 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10873 for the sensitivity of remove layer.
10874 (_can_remove_layer): New. Sensitivity callback for remove layer
10875 (Command layer_remove): Use _can_remove_layer
10876
10877 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10878 determine whether a given layer can be deleted.
10879
10880 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10881 (MapCanvas.do_redraw): Get rid of the unused update_region
10882 instance variable
10883
10884 * Thuban/UI/view.py: Add/update some doc-strings.
10885
10886 * test/: new subdirectory with a bunch of unit tests.
10887
10888 * test/README, test/test_table.py, test/test_save.py,
10889 test/test_menu.py, test/test_load.py: Initial set of tests and
10890 brief instructions on how to run them
10891
10892 2002-08-29 Bernhard Herzog <[email protected]>
10893
10894 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10895 arcs with multiple parts.
10896
10897 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10898 Handle degenrate rectangles.
10899
10900 * Thuban/Model/table.py: Make writing records work correctly:
10901 (Table.__init__): Keep track of whether the DBF is open for
10902 writing
10903 (Table.write_record): Open the DBF file for writing when necessary
10904
10905 2002-08-27 Bernhard Herzog <[email protected]>
10906
10907 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10908 dbf files only for reading by default. Use a new writable dbf
10909 object for writing.
10910
10911 2002-08-26 Bernhard Herzog <[email protected]>
10912
10913 * Thuban/UI/mainwindow.py: Refactor the context creation:
10914 (MainWindow.Context): New method to return a context
10915 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10916 new method
10917
10918 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10919 layer table specific code from TableGrid into LayerTableGrid
10920 (TableFrame, LayerTableFrame): Split the layer table specific code
10921 from TableFrame into LayerTableFrame
10922 (LayerTableGrid.select_shape): Remove a debug print
10923
10924 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10925 LayerTableFrame
10926
10927 2002-08-23 Bernhard Herzog <[email protected]>
10928
10929 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10930 absolute filename.
10931
10932 2002-08-22 Bernhard Herzog <[email protected]>
10933
10934 * Thuban/Model/table.py (Table.write_record): New method to write
10935 records.
10936 (Table.__init__): Open the DBF file for writing too.
10937
10938 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10939 into the underlying table.
10940
10941 * extensions/shapelib/shapefil.h (DBFCommit),
10942 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10943 commit any changes made to the DBF file.
10944
10945 * Thuban/UI/mainwindow.py (make_check_current_tool)
10946 (_tool_command): Put the code that generates the "checked"
10947 callback into a separate function so that we can reuse it
10948 elsewhere
10949
10950 * Thuban/Model/save.py (Saver): New class to handle serializing a
10951 session into an XML file. The main reason to introduce a class is
10952 that applications built on Thuban can derive from it so that they
10953 can save additional information in a session file.
10954 (save_session): Delegate almost all the work to the Saver class.
10955 Rename the filename argument to file because it may be a file like
10956 object now.
10957
10958 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10959 code. Remove the little test code which would be executed when the
10960 module is run as a script which didn't work anymore since it can't
10961 import the other Thuban modules.
10962 (ProcessSession, load_session): Refactor the ProcessSession to
10963 have one method for each element start and end tag so that derived
10964 classes can easily override the processing of individual tags.
10965 Also, always parse with namespaces enabled because applications
10966 built on top of Thuban will likely use namespaces if they extend
10967 the session file format.
10968
10969 2002-08-21 Bernhard Herzog <[email protected]>
10970
10971 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10972 because thubaninit_contents will do it for us.
10973
10974 2002-08-16 Jan-Oliver Wagner <[email protected]>
10975
10976 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10977 tree window already open
10978
10979 2002-08-15 Bernhard Herzog <[email protected]>
10980
10981 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10982 with self.
10983
10984 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10985 when we have actually captured it.
10986
10987 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10988 shapefile and destroy the table.
10989
10990 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10991
10992 2002-08-14 Bernhard Herzog <[email protected]>
10993
10994 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10995 instance variable columns
10996 (RecordTable.GetTypeName): row and col may be negative in some
10997 cases.
10998
10999 * setup.py (InstallLocal.initialize_options)
11000 (InstallLocal.finalize_options, InstallLocal.user_options): New
11001 option create-init-file to build a thubaninit.py when running
11002 install_local
11003 (InstallLocal.run): Create the thubaninit.py module when requested
11004 (thubaninit_contents): Split the template into several parts and
11005 create a new function thubaninit_contents that creates the
11006 contents of a thubaninit module.
11007 (ThubanInstall.run): Use the new function to create the thubaninit
11008 module.
11009
11010 2002-07-30 Bernhard Herzog <[email protected]>
11011
11012 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11013 cleanup.
11014 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11015
11016 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11017 direct base class' Destroy method.
11018
11019 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11020 layers.
11021 (Map.Destroy): Destroy the label_layer as well and call the
11022 inherited Desatroymethod first so that no more messages are
11023 issued.
11024 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11025 message if the stacking order actually has changed. Add
11026 doc-strings.
11027 (Map.BoundingBox): Correct the doc-string.
11028 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11029 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11030
11031 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11032 all labels.
11033
11034 2002-07-29 Bernhard Herzog <[email protected]>
11035
11036 * Thuban/Model/map.py (Map.subscribe_layer_channels)
11037 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11038 to a layer's channels into separate methods.
11039 (Map.RemoveLayer, Map.AddLayer): Call the new methods
11040 (Map.Destroy): Unsubscribe from a layer's channels before
11041 destroying it.
11042
11043 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11044 selected_layer parameter to searched_layer which is the layer to
11045 search in.
11046 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11047 search to that layer. Return the selected layer and shape.
11048
11049 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11050 typo
11051
11052 2002-07-24 Bernhard Herzog <[email protected]>
11053
11054 * Thuban/UI/application.py (ThubanApplication.create_session):
11055 Extend the doc string.
11056 (ThubanApplication.subscribe_session)
11057 (ThubanApplication.unsubscribe_session): New methods to
11058 subscribe/unsubscribe to/from session channels.
11059 (ThubanApplication.SetSession): Call the new methods here.
11060 (ThubanApplication.maps_changed, ThubanApplication.set_map):
11061 Renamed set_map to maps_changed. Its now a subscriber for
11062 MAPS_CHANGED.
11063
11064 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11065 x-coordinate in case of simple clicks
11066
11067 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11068 don't pass it as a parameter
11069
11070 * Thuban/Model/session.py (Session.RemoveMap): New
11071
11072 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11073 window size into a parameter.
11074
11075 2002-07-23 Bernhard Herzog <[email protected]>
11076
11077 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11078 just commands.
11079
11080 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11081 parameter list a bit to allow setting the window title and the
11082 initial message in the status bar. Update the callers.
11083
11084 * Thuban/UI/application.py (ThubanApplication.OnInit)
11085 (ThubanApplication.CreateMainWindow): Put the mainwindow
11086 instantiation into a separate method so that it can be overridden
11087 by a subclass.
11088
11089 2002-07-19 Bernhard Herzog <[email protected]>
11090
11091 * Thuban/Model/session.py: Issue a CHANGED message every time
11092 another changed message is issued to make it easier to get
11093 notified of changes.
11094 (Session): Update the doc string
11095 (Session.forward): Issue changed-events as CHANGED as well.
11096 (Session.changed): Overwrite the inherited version to issue
11097 CHANGED events as well.
11098
11099 * Thuban/UI/tree.py: We can now simply subscribe to the session's
11100 CHANGED channel to be informed of changes.
11101 (SessionTreeCtrl.session_channels): Not needed any longer.
11102 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11103 Only have to (un)subscribe CHANGED
11104
11105 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11106
11107 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11108 for the wxPython locale bug to __init__.py so that it's
11109 automatically executed by anybody using UI code from Thuban.
11110
11111 2002-07-18 Bernhard Herzog <[email protected]>
11112
11113 * Thuban/UI/main.py (main): app no longer needs to be global
11114
11115 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11116 as parameter and store it in an instance variable
11117 (MainWindow.invoke_command, MainWindow.update_command_ui)
11118 (MainWindow.save_modified_session, MainWindow.NewSession)
11119 (MainWindow.OpenSession, MainWindow.SaveSession)
11120 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11121 application object.
11122
11123 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11124 the main window with self.
11125
11126 * Thuban/UI/context.py: New module with the context class
11127
11128 * Thuban/UI/command.py (Command): Update doc string.
11129
11130 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11131 MainWindow.update_command_ui): Pass an instance of the context
11132 class to the command's methods
11133 (check_current_tool, call_method): Handle the new context
11134 implementation
11135
11136 * Examples/simple_extensions/simple_tool.py (simple_tool,
11137 check_simple_tool): Handle the new context implementation
11138
11139 * Examples/simple_extensions/simple_command.py (simple_command):
11140 Handle the new context implementation. Update the comments about
11141 the context.
11142
11143 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11144 doc-string
11145 (ThubanApplication.Session): New method to return the session
11146 object
11147
11148 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11149 interactor's selected_layer may not be a layer of the current
11150 session when the tree is updated while a new session is being set.
11151
11152 2002-07-17 Bernhard Herzog <[email protected]>
11153
11154 * Thuban/UI/tree.py (color_string): Removed. No longer used.
11155 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11156 update_tree into update_tree and add_items. The tree now uses a
11157 more generic way to display the contents of the tree.
11158 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11159
11160 * Thuban/Model/layer.py (Layer.TreeInfo),
11161 Thuban/Model/extension.py (Extension.TreeInfo),
11162 Thuban/Model/map.py (Map.TreeInfo),
11163 Thuban/Model/session.py (Session.TreeInfo):
11164 Add TreeInfo methods to implement the new tree view update scheme
11165
11166 2002-07-16 Bernhard Herzog <[email protected]>
11167
11168 * Thuban/UI/application.py: Don't use "import from" for the
11169 MainWindow. It can't always be resolved.
11170 (ThubanApplication.OnInit): change reference to MainWindow
11171 accordingly.
11172
11173 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11174 completely
11175
11176 2002-07-10 Bernhard Herzog <[email protected]>
11177
11178 * setup.py (create_init_module): New configurable variable whose
11179 default depends on the platform we're running on.
11180 (ThubanInstall.initialize_options): Initialize
11181 self.create_init_module from the global create_init_module
11182 (ThubanInstall.user_options): indictate that the options
11183 create-init-module and init-module-dir have arguments.
11184
11185 * setup.py: In the setup call change the version number to include
11186 cvs.
11187
11188 * MANIFEST.in: Add the files in Examples
11189
11190 2002-07-09 Bernhard Herzog <[email protected]>
11191
11192 * setup.py: In the setup call, use the thuban homepage as the
11193 value of the url parameter.
11194
11195 * Examples: New subdirectory for examples.
11196
11197 * Examples/simple_extensions/simple_tool.xpm,
11198 Examples/simple_extensions/simple_tool.py,
11199 Examples/simple_extensions/simple_command.py,
11200 Examples/simple_extensions/README: Simple examples showing how to
11201 add new commands and tools.
11202
11203 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11204 bdist_rpm that we also have an install script.
11205 (bdist_inno): Add 2002 to the copyright notice.
11206
11207 * setup.py: Create a file in python's site-packages directory to
11208 make installation of Thuban as a library easier.
11209 (ThubanInstall.user_options): Add two new options,
11210 create-init-module and init-module-dir
11211 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11212 filenames for installation in the default directories.
11213 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11214 the inherited methods to capture some filenames before they're
11215 transformed too much by distutils.
11216 (ThubanInstall.run): Create the init module if requested.
11217 (ThubanInstall.thuban_init_filename): New method to return the
11218 full name of the init module.
11219 (ThubanInstall.get_outputs): Append the filename of the init
11220 module.
11221
11222 2002-07-08 Bernhard Herzog <[email protected]>
11223
11224 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11225 handle the prefix properly which means that the default for the
11226 installation prefix should be /usr for RPMs and /usr/local when
11227 doing a normal source install.
11228 (bdist_rpm_install_script): Script to override the default install
11229 commands in the specfile generated by the bdist_rpm command.
11230 (thuban_bdist_rpm.user_options): Add a prefix option
11231 (thuban_bdist_rpm.initialize_options): Init the prefix option.
11232 Create the script files for the spec files as empty files here
11233 (thuban_bdist_rpm._make_spec_file): Override the inherited method
11234 to fill the script files with content.
11235
11236 * Thuban/Model/save.py (relative_filename): Wrapper around
11237 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11238 argument. save_session now automatically uses this version,
11239 solving a problem when saving to a relative filename.
11240
11241 * setup.py: In the setup call, make sure that the library
11242 directories are under $prefix/lib not directly under $prefix.
11243
11244 2002-06-20 Jan-Oliver Wagner <[email protected]>
11245
11246 * Thuban/Model/extension.py: new module to handle extension objects.
11247 * Thuban/Model/messages.py: new messages for extensions.
11248 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11249 Session.AddExtension): new for handling extensions.
11250 Also some other minor changes to round up extension handling.
11251 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11252 of Extension titles and title and names of its objects.
11253
11254 2002-05-29 Bernhard Herzog <[email protected]>
11255
11256 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11257 the events for a command.
11258 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11259 Call bind_command_events to bind the events. add_toolbar_command
11260 can now bind events too so that it's possible to have commands
11261 that are only available through the toolbar.
11262 (MainWindow.init_ids): New instance variable events_bound to keep
11263 track of for which commands events have been bound.
11264
11265 2002-05-28 Bernhard Herzog <[email protected]>
11266
11267 * Thuban/UI/menu.py: New module to build and manage menus.
11268
11269 * Thuban/UI/mainwindow.py: Remove some unused imports.
11270 (MainWindow.__init__, main_menu): move the definition of the main
11271 menu from __init__ to the Menu instance main_menu.
11272 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11273 build the menu bar and sub-menus from a menu description.
11274
11275 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11276 startup file
11277 (ThubanApplication.read_startup_files): New method to run
11278 ~/.thuban/thubanstart.py
11279
11280 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11281 Move the toolbar definition to the Menu instance main_toolbar.
11282 (MainWindow.build_toolbar): New method to build the toolbar
11283 similar to the build_menu methods
11284
11285 2002-05-23 Bernhard Herzog <[email protected]>
11286
11287 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11288 layer_outline_color. Fix it in the definition of the command too.
11289
11290 * Thuban/UI/command.py (Command): Fix typo in doc string
11291
11292 2002-05-22 Bernhard Herzog <[email protected]>
11293
11294 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11295 in the docstring
11296
11297 2002-05-15 Bernhard Herzog <[email protected]>
11298
11299 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11300 when the shapefile is empty.
11301 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11302 now return None for empty shapefiles. Update doc-strings.
11303
11304 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11305 the layer's bbox being None.
11306
11307 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11308 layer's bbox being None.
11309
11310 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11311 necessary.
11312 (MapCanvas.__init__): New instance variables, last_selected_layer
11313 and last_selected_shape to determine how the selection has
11314 changed.
11315
11316 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11317 AutoSizeColumns because it will cause a traversal of the entire
11318 table which for large .dbf files will take a very long time.
11319
11320 2002-05-14 Bernhard Herzog <[email protected]>
11321
11322 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11323 maximum depth for the tree than shapelib does by default.
11324
11325 2002-05-10 Bernhard Herzog <[email protected]>
11326
11327 * setup.py (py_modules): The shptree modules doesn't have a
11328 wrapper, so don't include it in the py_modules
11329
11330 2002-05-08 Bernhard Herzog <[email protected]>
11331
11332 * extensions/shapelib/shptree.c (compare_ints): Make arguments
11333 const void * as in the qsort prototype
11334 (SHPTreeFindLikelyShapes): Remove some unused variables.
11335
11336 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11337 maintains to redraw the window during a drag.
11338 (MapCanvas.unprojected_rect_around_point): New method to determine
11339 a small region around a point for hit-testing.
11340 (MapCanvas.find_shape_at): Only test the shapes in a small region
11341 around the point.
11342
11343 * setup.py: Increment the version to 0.1.2
11344
11345 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11346 debug print and set session to None after unsubscribing
11347
11348 2002-05-07 Bernhard Herzog <[email protected]>
11349
11350 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11351 the file to have a .thuban extension.
11352
11353 * Thuban/UI/tree.py (session_channels): New class constant with
11354 all the session channels to subscribe to to update the tree
11355 (SessionTreeCtrl.session_changed): Remember the session so that we
11356 can unsubscribe properly. Use the new class constant to
11357 unsubscribe from the old session and subscribe to the new one.
11358 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11359 subscriptions of the SessionTreeCtrl.
11360 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11361
11362 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11363 Session Tree" command to the file menu.
11364
11365 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11366 as update_region to the renderer.
11367
11368 * Thuban/UI/renderer.py
11369 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11370 update box is now directly a tuple, not a wxRect anymore.
11371
11372 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11373 prints.
11374
11375 2002-05-07 Bernhard Herzog <[email protected]>
11376
11377 * setup.py: Add the shptree extension module. See
11378 extensions/pyshapelib/ChangeLog for more details.
11379
11380 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11381 extensions/shapelib/dbfopen.c: Really update to the versions of
11382 shapelib 1.2.9. For some reason it wasn't really done on
11383 2002-04-11.
11384
11385 * extensions/shapelib/shptree.c: Modified version of shptree.c of
11386 shapelib 1.2.9. The only real difference is the use of qsort
11387 instead of a bubble sort implementation
11388
11389 * Thuban/Model/layer.py (Layer.__init__): New instance variable
11390 shapetree to hold the shapelib quadtree for the shapefile
11391 (Layer.open_shapefile): Create the quad tree.
11392 (Layer.ShapesInRegion): New method to return the ids of shapes in
11393 a given region using the quad tree.
11394
11395 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11396 comment
11397 (draw_polygon_shape): Accept both arcs and polygons.
11398 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11399 the api.
11400
11401 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11402 return the shape ids to be rendered in a given layer.
11403 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11404 ids. Use draw_polygon_shape to draw arc shapes as well.
11405 (ScreenRenderer.RenderMap): New parameter for the rectangle that
11406 has to be updated
11407 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11408 calling it's ShapesInRegion method.
11409
11410 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11411 update_region for the update region.
11412 (MapCanvas.OnPaint): Maintain the update region
11413 (MapCanvas.do_redraw): Pass the bounding box of the update_region
11414 to the renderer when drawing the bitmap. Reset the update_region.
11415
11416 2002-05-03 Bernhard Herzog <[email protected]>
11417
11418 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11419 MainWindow.OpenSession): Change the file extension of the session
11420 files to .thuban
11421
11422 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11423 Move the map channels to be forwarded by the session into the
11424 class constant with forwarded_channels. Also add
11425 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11426 forwarded_channels
11427
11428 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11429 typo and some rewording).
11430
11431 2002-05-02 Bernhard Herzog <[email protected]>
11432
11433 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11434 around to speed up most redraws:
11435 (MapCanvas.__init__): New instance variable bitmap which holds the
11436 bitmap
11437 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11438 self.bitmap to draw.
11439 (MapCanvas.full_redraw): New method to force a full redraw
11440 including the bitmap
11441 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11442 make sure the bitmap is redrawn.
11443 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11444 MapCanvas.shape_selected): Call full_redraw instead of readraw to
11445 make sure the bitmap is redrawn.
11446 (MapCanvas.OnSize): New method to handle size events so that the
11447 bitmap can be redrawn.
11448
11449 2002-04-29 Bernhard Herzog <[email protected]>
11450
11451 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11452 canvas' VIEW_POSITION event
11453 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11454 Update the text in the status-bar accordingly.
11455
11456 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11457 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11458 called.
11459 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11460 current_position
11461 (MapCanvas.set_current_position): New method to set
11462 current_position. Issue a VIEW_POSITION event
11463 (MapCanvas.CurrentPosition): New public method to return the value
11464 of current_position. Should be called when the VIEW_POSITION event
11465 is processed.
11466 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11467 Update the position.
11468 (MapCanvas.OnLeaveWindow): Set the position to None.
11469
11470 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11471 position in the statusbar
11472
11473 2002-04-26 Frank Koormann <[email protected]>
11474
11475 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11476
11477 2002-04-24 Frank Koormann <[email protected]>
11478
11479 * Resources/Bitmaps/identify.xpm: shadow added
11480
11481 * Resources/Bitmaps/fullextent.xpm: new
11482
11483 2002-04-22 Jan-Oliver Wagner <[email protected]>
11484
11485 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11486 box
11487
11488 2002-04-21 Jan-Oliver Wagner <[email protected]>
11489
11490 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11491
11492 * Thuban/UI/tree.py (update_tree): added added map extent
11493
11494 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11495 icon; added map_full_extend as tool
11496
11497 2002-04-19 Jan-Oliver Wagner <[email protected]>
11498
11499 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11500 saving _new_ sessions
11501
11502 * Thuban/Model/session.py (create_empty_session): new session
11503 don't have a filename (set to None)
11504
11505 * Thuban/UI/tree.py (update_tree): added filename and modified flag
11506
11507 * Thuban/Model/load.py (ProcessSession): convert projection
11508 parameters from unicode to regular string
11509
11510 * Data/iceland_sample.session: Added UTM Zone 26 projection.
11511
11512 2002-04-11 Bernhard Herzog <[email protected]>
11513
11514 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11515 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11516 1.2.9
11517
11518 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11519 the pyshapelib directoy into the list of include dirs, so that
11520 pyshapelib_api.h can be found.
11521
11522 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11523 holds the pyshapelib C-API
11524 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11525 pyshapelib_api to access the shapelib functions.
11526 (initwxproj): Import the c_api from the shapelib module and
11527 initialize pyshapelib_api.
11528
11529 2002-04-04 Bernhard Herzog <[email protected]>
11530
11531 * setup.py (thuban_bdist_rpm.initialize_options): Use
11532 initialize_options to create the scripts for the rpm.
11533
11534 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11535
11536 2002-04-03 Bernhard Herzog <[email protected]>
11537
11538 * setup.py: Increment version to 0.1.1
11539
11540 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11541 Layer" and "Remove Layer" commands from the layer menu to the map
11542 menu
11543
11544 2002-02-15 Bernhard Herzog <[email protected]>
11545
11546 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11547 argument (python <= 1.5.2 erroneously accepted multiuple
11548 arguments)
11549
11550 2002-02-04 Bernhard Herzog <[email protected]>
11551
11552 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11553 RecordGrid in the identifyview.
11554 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11555 IdentifyListCtrl. The grid allows editing of the values.
11556
11557 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11558 implementing a grid for a single row of a thuban table.
11559
11560 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11561 layers by default. Easier to use than the previous default of only
11562 searching through the select layer which meant that if no layer
11563 was selected, you couldn't select a shape.
11564
11565 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11566
11567 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11568 stroke_width attribute
11569
11570 * Thuban/Model/save.py (save_session): Write the new stroke_width
11571 attribute
11572
11573 * Thuban/Model/load.py (ProcessSession.startElement): Read the
11574 stroke_width attribute
11575
11576 * Thuban/Model/layer.py (Layer.__init__): New parameter and
11577 instance variable stroke_width
11578 (Layer.SetStrokeWidth): Set the stroke_width.
11579
11580 2002-02-01 Bernhard Herzog <[email protected]>
11581
11582 * extensions/thuban/wxproj.cpp (project_points): Fix two
11583 off-by-one errors in the last loop that joins the various parts
11584 together.
11585
11586 2002-01-14 Bernhard Herzog <[email protected]>
11587
11588 * setup.py (data_dist.make_distribution): Fix some typos
11589
11590 2001-09-18 Bernhard Herzog <[email protected]>
11591
11592 * README: Slight tweaking in preparation for the 0.1 release
11593
11594 * setup.cfg: Add section for sdist to create both tgz and zip
11595 archives
11596
11597 * setup.py: increase version number to 0.1
11598 (data_dist): New command class for data distribution
11599
11600 2001-09-14 Bernhard Herzog <[email protected]>
11601
11602 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11603 Handle the case of no layer (i.e. layer is None) properly.
11604
11605 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11606 Set the initial selection of the combo boxes to reflect the
11607 projection we're starting with in a way that works on windows,
11608 too.
11609
11610 * Thuban/Lib/connector.py (Connector.print_connections): Print the
11611 puiblisher's ids in hex to make it easier to compare them to the
11612 standard repr of python methods
11613
11614 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
11615 messages
11616
11617 2001-09-13 Bernhard Herzog <[email protected]>
11618
11619 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
11620 deselect the layer if no layer is selected
11621
11622 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
11623 idle time when there actually is something to draw. If there's
11624 nothing to draw simply clear the window
11625 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
11626 (MapCanvas.SetMap): force a redraw in all cases because
11627 FitMapToWindow doesn't always do it.
11628 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
11629 specify the point to move into the center of the window
11630 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
11631 dragged, zoon in/out by a factor of 2
11632 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
11633 index, i.e. reversed drawing order) so that objects appearing to
11634 be in from of others are selected first. This is probably mostly
11635 relevant for point shapes where the symbols used may overlap
11636
11637 * Thuban/Model/session.py (create_empty_session): Unset the
11638 modified bit before returning it
11639
11640 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
11641 create_empty_session session to create the new, empty session.
11642
11643 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
11644 the tool bitmaps.
11645 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
11646 the code that asks whether the session should be saved into the
11647 new method save_modified_session.
11648 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
11649 method to save modified session here too.
11650
11651 2001-09-11 Bernhard Herzog <[email protected]>
11652
11653 * setup.py (InnoIconItem): fix typo
11654
11655 (thuban_bdist_inno.run):
11656 (bdist_inno.run): Move the decision not to create symlinks on
11657 non-nt platforms to thuban_bdist_inno and do it unconditinally
11658 since we never want to create the symlinks here
11659
11660 2001-09-10 Bernhard Herzog <[email protected]>
11661
11662 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
11663 identify view immediately
11664
11665 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
11666 and SelectableRecordListCtrl that implement the code shared by the
11667 identify view and the label dialog
11668
11669 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
11670 new class RecordListCtrl
11671
11672 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
11673 return value of GetValue is None instead of using it as a boolean
11674 directly so that Zero numbers are handled properly.
11675 (LabelListCtrl): Derive from the new class
11676 SelectableRecordListCtrl
11677
11678 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
11679 (Proj4Dialog.dialogLayout): Make the window resizable and set the
11680 size of the text control explicitly to make the sizers work on
11681 both Windows and X.
11682
11683 2001-09-07 Bernhard Herzog <[email protected]>
11684
11685 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
11686 that can limit the search to the currently selected layer.
11687 (MapCanvas.SelectShapeAt): Make sure that the currently selected
11688 layer stays selected even when no shape is found
11689 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
11690 height do nothing (avoids zero division errors)
11691
11692 2001-09-06 Bernhard Herzog <[email protected]>
11693
11694 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
11695 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
11696 convenient :-)
11697 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
11698 a new instvar layer_to_item to map layers to tree items
11699 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
11700 to match the current selection in the interactor
11701
11702 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
11703 (Interactor.HasSelectedLayer): New methods to query the current
11704 selection
11705
11706 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
11707 (MainWindow.has_selected_layer): Simply call the appropriate
11708 interactor method
11709
11710 * Thuban/UI/mainwindow.py (MainWindow.__init__):
11711 (MainWindow.LayerShowTable):
11712 (MainWindow.identify_view_on_demand): Store the interactor in an
11713 instvar and use that reference instead of going through main.app
11714
11715 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11716 * Thuban/UI/application.py (ThubanApplication.OnInit):
11717 * Thuban/UI/main.py (main): Create the session tree view in main
11718 with the new mainwindow method ShowSessionTree and not directly
11719 the application's OnInit method
11720
11721 * Thuban/UI/tree.py (myTreeCtrlPanel):
11722 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
11723 TreeCtrl isntead of a panel. This affects most method since we now
11724 refer to self instead of self.tree
11725 (SessionTreeView): New class implementing a non-modal dialog
11726 showing the session tree.
11727
11728 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
11729 layer to the tableview dialog.
11730
11731 * Thuban/UI/tableview.py: Add some doc-strings
11732 (TableGrid):
11733 (TableGrid.OnRangeSelect):
11734 (TableGrid.OnSelectCell):
11735 (TableFrame.__init__):
11736 (TableFrame.row_selected):
11737 Selecting rows in the grid view now updates the selected shapes
11738 through the TableFrame. To achieve this we derive TableGrid from
11739 Publisher and introduce the message type ROW_SELECTED which the
11740 TableFrame subscribes to and which is issued by OnRangeSelect and
11741 OnSelectCell
11742
11743 (DataTable.SelectRow): Removed because it's no longer needed in
11744 the row/shape selection scheme
11745
11746 * Thuban/UI/dialogs.py: New file implementing common classes for
11747 dialogs
11748
11749 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11750 the SELECTED_SHAPE message anymore. This is now handled by the
11751 parent.
11752 (TableGrid.select_shape): Only update the selection if the shape
11753 is not None.
11754 (TableFrame): Inherit from the new NonModalDialog class.
11755 (TableFrame.__init__, TableFrame.select_shape): Handle the
11756 SELECT_SHAPE message.
11757 (TableFrame.OnClose): Extend the inherited method to unsubscribe
11758 SELECT_SHAPE
11759
11760 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11761 (MainWindow.add_dialog):
11762 (MainWindow.dialog_open):
11763 (MainWindow.remove_dialog):
11764 (MainWindow.get_open_dialog): New methods to maintain a dictionary
11765 of opened non-modal dialogs.
11766
11767 (MainWindow.__init__): Initialize the new non-modal dictionary
11768 management code
11769 (MainWindow.LayerShowTable): maintain separate dialogs for each
11770 table using the non-modal dialog management code to only open a
11771 view once for each table.
11772
11773 (MainWindow.IdentifyTool):
11774 (MainWindow.__init__):
11775 (MainWindow.identify_view_on_demand): Don't open the identify view
11776 in IdentifyTool anymore. This will be done automatically by the
11777 new method identify_view_on_demand which handles the
11778 SELECTED_SHAPE message so that the identify view will be opened on
11779 demand
11780
11781 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11782 the interactor argument. The SELECTED_SHAPE message is now handled
11783 by the parent.
11784 (IdentifyView.__init__): Add the interactor argument so that we
11785 can handle the SELECTED_SHAPE message here
11786 (IdentifyView.selected_shape): New method to handle the
11787 SELECTED_SHAPE messages
11788
11789 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11790 NonModalDialog class
11791 (IdentifyView.OnClose): Extend the inherited version to
11792 unsubscribe SELECT_SHAPE
11793
11794 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11795
11796 2001-09-05 Bernhard Herzog <[email protected]>
11797
11798 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11799
11800 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11801 interactor to pass through to the MapCanvas
11802
11803 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11804 argument to the MainWindow constructor to get rid of the ugly hack
11805 that made main.app available early just so that the mapcanvas
11806 could access the interactor object.
11807
11808 2001-09-04 Bernhard Herzog <[email protected]>
11809
11810 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11811 that runs a modal message box
11812 (MainWindow.OnClose): Use the new method
11813 (MainWindow.RemoveLayer): Just do nothing in case no layer is
11814 selected. The command should be grayed out anyway, so there's no
11815 need to pop up a message box.
11816 (MainWindow.AddLayer): Pop up a message box with an error message
11817 if the shape file can't be opened
11818
11819 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11820 immediately. This will cause an exception in case the file can't
11821 be opened and we can display an appropriate message.
11822
11823 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11824
11825 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11826 specific bdist_rpm command.
11827
11828 * Thuban/UI/main.py: Catch ImportError exceptions when importing
11829 the locale module because it may not be available on some
11830 installations.
11831
11832 * extensions/pyprojection/LICENSE: Copy of the license text in
11833 Projection.i. Having it in a separate file makes it easier to
11834 refer to license text in e.g. RPMs
11835
11836 2001-09-03 Bernhard Herzog <[email protected]>
11837
11838 * setup.py: use wx-config instead of wxgtk-config because it's
11839 more generic
11840
11841 * setup.py (ThubanInstall.get_outputs): Add the symlink in
11842 <prefix>/bin to the outputs
11843 (ThubanInstall.link_file): New method to link files. We need this
11844 because the standard copy_files refuses to link non-existing
11845 files.
11846 (ThubanInstall.run): Remove the leading install root from the
11847 script filename if an install root was specified and use the new
11848 link_file method
11849
11850 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11851 the window when the first layer is added to the map.
11852
11853 * setup.py (ThubanInstall.run): Honor the build root (self.root)
11854 when linking thuban.py to <prefix>/bin
11855
11856 2001-08-31 Bernhard Herzog <[email protected]>
11857
11858 * setup.py: In the setup call, the install parameters shouldn't
11859 have trailing slashes because distutils on non-posix platforms
11860 doesn't like that. The same applies to other directories like
11861 "Resources/Bitmaps"
11862
11863 In the configuration section for nt, move the wxWindows directory
11864 optins into the part clearly marked as editable.
11865
11866 (InstallLocal.initialize_options):
11867 (InstallLocal.user_options): remove the currently unused debug
11868 flag
11869 (thuban_build_py.find_all_modules): Add this method so that it
11870 works for our case of having packages and modules in one
11871 distribution as well.
11872 (ThubanInstall.initialize_options):
11873 (ThubanInstall.finalize_options):
11874 (ThubanInstall.user_options):
11875 (ThubanInstall.boolean_options): Add new options, do-symlink and
11876 extra files. Since these are the first ThubanInstall specific
11877 options, override user_options and boolean_options
11878 (ThubanInstall.run): Honor the new do-symlink and extra-files
11879 options.
11880 (ThubanInstall.get_outputs): Add to override the base-class's
11881 version and add the extra-files to the outputs
11882 (bdist_inno): New class for windows distributions with Inno Setup
11883 (InnoIconItem): Helper class for bdist_inno
11884 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11885 this together with the appropriate parameters, to the setup call.
11886
11887 * setup.cfg (bdist_inno): added new section for the inno setup
11888 installer
11889
11890 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11891 changing_selection to avoid recursive selection events when
11892 modifying the selection in response to a selection event.
11893 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11894 changing the tree's selection.
11895 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11896 we're not being called indirectly from normalize_selection.
11897
11898 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11899 event.Check only if the command is actuall checkable.
11900 (MainWindow.__init__): Call the toolbar's Realize method to make
11901 sure that the items are actually shown
11902
11903 2001-08-28 Bernhard Herzog <[email protected]>
11904
11905 * setup.py: Fix some doc strings
11906
11907 * ChangeLog: started
11908

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26