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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2622 - (show annotations)
Fri May 6 14:20:20 2005 UTC (19 years, 10 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 458911 byte(s)
Add support for saving and loading the opacity and mask type properties of
RasterLayers. Also add support for proper use of alpha information while
drawing images not in 'RAW' format.  If transparency in an image format
(e.g, PNG) is supported by wxWidgets then the image would previously have been
draw with transparent regions, but the opaque regions would have been
unaffected by a change in the layer's opacity. This patch corrects the problem.

1 2005-05-06 Jonathan Coles <[email protected]>
2
3 Add support for saving and loading the opacity and mask type
4 properties of RasterLayers. Also add support for proper use
5 of alpha information while drawing images not in 'RAW' format.
6 If transparency in an image format (e.g, PNG) is supported by
7 wxWidgets then the image would previously have been draw with
8 transparent regions, but the opaque regions would have been
9 unaffected by a change in the layer's opacity. This patch
10 corrects the problem.
11
12 * Thuban/Model/layer.py (RasterLayer): Added opacity and
13 masktype parameters to the constructor, and set the
14 appropriate variables to those values.
15
16 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
17 code to read the opacity and mask type of the layer and construct
18 a new layer with the additional parameters.
19
20 * Thuban/Model/save.py (SessionSaver.write_layer): Added code
21 to save the opacity and mask type of a layer.
22
23 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
24 the opacity of the layer to draw_raster_data rather than the layer.
25 (BaseRenderer.draw_raster_data): Remove the layer parameter because
26 the function doesn't need to know about the layer. Add the optional
27 opacity parameter whose default is 1.0. Add 'PNG' as a supported
28 graphics format.
29
30 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
31 signature to match that in BaseRenderer. Use the new opacity argument
32 in place of calling layer.Opacity(). In the case where the
33 format is not 'RAW', alpha_data is None and the loaded image has
34 alpha information, use the file's alpha information. This is
35 still subject to the layer's opacity setting.
36
37 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
38 Fixed signature to match that in BaseRenderer.
39
40 * test/test_load.py (TestRasterLayer): Change file_contents to
41 include opacity and masktype variables.
42 (TestRasterLayer.test): Include tests for opacity and masktype
43 changes.
44
45 * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
46 test to cover a variety of combinations of masktype and opacity
47 settings.
48
49 2005-05-02 Jan-Oliver Wagner <[email protected]>
50
51 * debian/rules: add --use-wx-python-swig-hack
52 to the build command.
53 Thanks to Moritz Lennert for pointing this out.
54
55 2005-04-28 Jan-Oliver Wagner <[email protected]>
56
57 Introduce OGRFileShapeStore in ogr extension.
58 This allows at least that loaded shapefile shape stores
59 can be saved correctly in the thuban session file
60 and reloaded again (reload is via core shapefile
61 routine, not OGR). For other types, .thuban files
62 can not be reloaded for the time being.
63
64 * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
65 class ist to be used for any file-based shape stores
66 accessed through OGR.
67
68 * Extensions/ogr/ogrstart.py (open_with_ogr): Added
69 forgotten _ for i18n. Adapted call OpenFileShapestore
70 regarding new parameter.
71 (OpenFileShapestore): Use OGRFileShapeStore instead of
72 OGRShapeStore. Fix return value (None instead of null).
73 Add new parameter "mainwindow" to avoid accessing global
74 context.
75
76 2005-04-27 Jan-Oliver Wagner <[email protected]>
77
78 Introduce FileShapeStore as generalization for
79 file-based shape stores. In a first instance
80 this allows additional modules to handle shapefile
81 format as well, namely the OGR extension.
82
83 * Thuban/Model/data.py: Various small fixes in doc-strings.
84 (FileShapeStore): New class.
85 (ShapefileStore): Derive from FileShapeStore.
86 (ShapefileStore.__init__): Call __init__ of FileShapeStore,
87 rename self.table to self._table, initialize self._bbox
88 (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
89 and self.FileName() instead of self.filename.
90 (ShapefileStore.Table): Use self._table instead of self.table.
91 (ShapefileStore.FileName): Removed (moved to FileShapeStore).
92 (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
93
94 * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
95 (SessionSaver.write_data_containers): Only use methods of the
96 base class FileShapeStore.
97
98 2005-04-26 Martin Schulze <[email protected]>
99
100 * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
101 function to the modified render engine
102
103 2005-04-25 Martin Schulze <[email protected]>
104
105 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
106 Added a description according to the CVS log message
107
108 2005-04-23 Martin Schulze <[email protected]>
109
110 * Thuban/UI/renderer.py: Added a missing import
111
112 2005-04-23 Russell Nelson <[email protected]>
113
114 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
115 way the previous tool is remembered, so that middle-button
116 panning works even if you haven't selected a tool.
117
118 2005-04-11 Bernhard Herzog <[email protected]>
119
120 * libraries/thuban/wxproj.cpp: Move the compatibility code that
121 deals with the wxPython 2.4 version of wxPython.h into the #ifdef
122 branch that includes wxPython.h because it's only needed when
123 wxPython.h is used. Also, it won't compile when
124 USE_WX_PYTHON_SWIG_HACK is set otherwise.
125
126 2005-04-07 Bernhard Herzog <[email protected]>
127
128 * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
129 (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
130 ClassGrid.__init__ and it's value is outside of the valid
131 range (must be < 32768). wxPython 2.5 complains about it with an
132 exception.
133
134 2005-04-05 Jan-Oliver Wagner <[email protected]>
135
136 * Doc/manual/thuban-manual-de.xml: More translations.
137
138 2005-04-05 Bernhard Herzog <[email protected]>
139
140 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
141 wxPython 2.4 as well. Also, remove a now obsolete comment.
142
143 2005-04-05 Bernhard Herzog <[email protected]>
144
145 Use wxPython.h by default but provide a workaround when it isn't
146 available.
147
148 * setup.py (wxproj_extension): New variable. Assign the Extension
149 instance for Lib.wxproj to this variable instead of putting it
150 directly into the listso that it can be accessed by other code
151 later.
152 (thuban_build_ext.user_options): Added boolean option
153 --use-wx-python-swig-hack.
154 (thuban_build_ext.initialize_options): Initialize the new option
155 to False.
156 (thuban_build_ext.finalize_options): If the new option was given,
157 define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
158 (thuban_build_ext): Update the doc-string
159
160 * libraries/thuban/wxproj.cpp: Normally we use
161 wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
162 defined, use swigPtrConvertHack.h instead.
163
164 * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
165 copied over from wxPython.h.
166 (decode_pointer_new): New. Equivalent of decode_pointer for
167 wxPython 2.5.
168 (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
169
170 * README: Add section on potential build problems which explains
171 how the work-around for a missing wxPython.h is activated.
172
173 2005-03-29 Bernhard Herzog <[email protected]>
174
175 * test/postgissupport.py (find_postgis_sql): Added yet another
176 potential location for (lw)postgis.sql because the file has moved
177 again in postgis 1.0.0 rc4.
178
179 2005-03-29 Bernhard Herzog <[email protected]>
180
181 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
182 match the site of the legend_icon_layer icon. Otherwise wxpython
183 2.5 complains when the legend is created with the error:
184
185 PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
186 bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
187 0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
188 in wxImageList: this might work on this platform but definitely
189 won't under Windows.
190
191 2005-03-23 Jonathan Coles <[email protected]>
192
193 These changes add support for adjusting the opacity of a raster layer.
194
195 * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
196 (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
197 a LAYER_CHANGED event if the opacity actually changes.
198
199 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
200 layer parameter needed in the implementation of this method in
201 renderer.py.
202
203 * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
204 typo 00 -> 0.
205
206 * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
207 control to adjust opacity.
208
209 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
210 alpha data based on the opacity level of the layer.
211
212 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
213 accepts a layer parameter.
214
215 * test/test_layer.py (TestLayerModification.test_raster_layer):
216 Rename opacity method calls and add test for LAYER_CHANGED.
217
218 2005-03-16 Bernhard Herzog <[email protected]>
219
220 * test/test_connector.py (DeletionTestMixin.check_deletions)
221 (DeletionTestMixin.check_deletetions): renamed to check_deletions.
222 update the callers.
223
224 2005-03-14 Jan-Oliver Wagner <[email protected]>
225
226 * Doc/manual/thuban-manual-de.xml: More translations.
227
228 2005-03-10 Jan-Oliver Wagner <[email protected]>
229
230 Introducing initialization callbacks for extensions.
231
232 * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
233 optional parameter init_callback.
234 (ExtensionDesc.init_ext): New. Executes the callback and sets
235 a status.
236
237 * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
238 initialization of the extensions.
239 (ThubanApplication.init_extensions): Init all extensions.
240
241 * Thuban/UI/about.py (About.__init__): Added status of the extensions
242 to the about text.
243
244 * Extensions/gns2shp/__init__.py: Added init method for Extension
245 description.
246 (init): New. Contains the initialization of the module.
247
248 2005-03-04 Nina Hüffmeyer <[email protected]>
249
250 * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
251 OGRConnection to open a datasource. Removed dialog to display all
252 available drivers. Added some doc strings.
253
254 * Extensions/ogr/ogrstart.py: Added menu entry for opening an
255 OGRDatasource with a string. Added two opening methods which return an
256 OGRDatasource (either data from file or from DB).
257
258 * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
259 represents a geometry reference of an OGRFeature. OGRShape now has a
260 list of referenced geometry objects (important for geometry
261 collections).
262 For OGRShapeStores loaded from a DB an ID column can be specified now.
263
264 2005-02-22 Jan-Oliver Wagner <[email protected]>
265
266 * test/test_map.py (TestMapWithContents.test_tree_info):
267 Added label layer for comparison.
268
269 2005-02-18 Jonathan Coles <[email protected]>
270
271 * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
272 which builds a mask. Handle the majority of an image in a loop,
273 creating 8 bits at a time. Later, handle the edge case where less
274 than 8 bits are packed.
275
276 2005-02-18 Bernhard Herzog <[email protected]>
277
278 * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
279 doc-string
280
281 2005-02-18 Jonathan Coles <[email protected]>
282
283 * setup.py: Remove wx_cs_params from gdal compile options.
284
285 2005-02-18 Jonathan Coles <[email protected]>
286
287 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
288 dependencies on wxPython. Added a new method projected_raster_layer()
289 that returns a raster layer image in projected space. This must be
290 implemented in classes derived from BaseRenderer. This also eliminates
291 the dependency on gdal in baserenderer.py.
292
293 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
294 new projected_raster_layer() to get projected raster image instead
295 of directly calling ProjectRasterFile().
296 (BaseRenderer.projected_raster_layer): New. This must be implemented
297 by derived classes. It takes almost the same arguments as ProjectRasterFile
298 did and returns a projected image with mask and alpha data (if requested).
299 (BaseRenderer.render_map_incrementally): Remove the check for gdal since
300 that check will be done in MapRenderer.projected_raster_layer(). This
301 also allows other implementations to use different projection code.
302
303 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
304 Implementation of BaseRenderer.projected_raster_layer. Checks for
305 gdal support and wxPython version. Also handles exceptions from
306 ProjectRasterFile.
307
308 * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
309 and added a variable which can be set through the options argument
310 of ProjectRasterFile.
311
312 * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
313 Calls ProjectRasterFile and returns the result.
314 (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
315 of calling projected_raster_layer() with different options.
316 (TestBaseRenderer.test_raster_no_projection): Removed tests based on
317 wxPython version and all tests of masks and alpha channels. These are
318 now in test_projected_raster_layer().
319
320 2005-02-17 Jan-Oliver Wagner <[email protected]>
321
322 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
323 doc-strings to comply with coding_guidelines.
324
325 2005-02-17 Jan-Oliver Wagner <[email protected]>
326
327 Docstring improvements and minor fixes for labellayer.
328
329 * Thuban/Model/map.py:
330 (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
331 Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
332 Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
333 Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
334 doc string.
335 (Map.BoundingBox): Removed superfluous test for label_layer
336 and improved doc string.
337 (Map.TreeInfo): Added label_layer and improved sdo string.
338
339 * Thuban/Model/label.py: Added import of _.
340 (Label, Label.__init__): Improved/added doc string.
341 (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
342 LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
343 Improved/added doc string.
344 (LabelLayer.AddLabel): Use already defined names for
345 align strings and improved doc string.
346 (LabelLayer.TreeInfo): New. Return the object data for
347 the tree view.
348
349 2005-02-16 Jonathan Coles <[email protected]>
350
351 Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
352 so that that wxproj doesn't crash. Added GUI support for selecting
353 alpha channel (opacity can't be selected yet).
354
355 NOTE: If wxPython.h is including in future distribution packages
356 then it will not be necessary to have the files swigPtrConvertHack.h
357 and wxPython_int.h included with Thuban. This is hopefully
358 a temporary workaround.
359
360 * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
361 access to the macro wxCHECK_VERSION so that it will properly
362 generate a bit mask. There was a problem between wx2.4 and wx2.5
363 that this works around.
364
365 * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
366 of RasterLayer.MaskType.
367 (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
368 (RasterLayer.MaskType): New. Returns the type of mask to use. Can
369 specify none, a bitmap, or an alpha channel.
370 (RasterLayer.SetMaskType): New. Set what kind of mask to use.
371
372 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
373 Set the raster warping options for the mask based on the value
374 of RasterLayer.MaskType.
375
376 * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
377 deprecated calls to SetItemSelectedImage in favor of SetItemImage
378 with wxTreeItemIcon_Selected.
379
380 * Thuban/UI/rasterlayerproperties.py: Support selecting to use
381 an alpha channel for the mask.
382
383 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
384 data if it is available and an alpha channel is supported under
385 the current version of wxPython.
386
387 * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
388 to select whether 1's or 0's select the desired portion of an image
389 in the bit mask. wx2.4 has a bug where the documentation is the opposite
390 from behavior.
391 (ProjectRasterFile): Only generate an alpha channel if the version
392 of wxPython is >= 2.5.3.
393
394 * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
395 When wxPython >= 2.5.3 use the special swig functions to decode an
396 object's address.
397
398 * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
399 based on the version of wxPython. If >= 2.5.3 use the special swig
400 functions from wxPython to decode wxPython objects, otherwise use
401 the old method of retrieving the address from the object __repr__ string.
402
403 * libraries/thuban/wxPython_int.h: Copied from wxPython source.
404 Unnecessary code was removed to make it smaller.
405
406 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
407 Add tests for returning an alpha channel.
408
409 * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
410 tests that used removed functions UseMask and SetUseMask
411
412
413 2005-02-08 Bernhard Herzog <[email protected]>
414
415 More wxPython 2.5 changes. This time taken from a patch from
416 Daniel Calvelo Aros.
417
418 * Thuban/UI/tableview.py (QueryTableFrame.__init__)
419 (QueryTableFrame.__init__): Pass the size of a spacer as a single
420 item.
421
422 * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
423 (ProjFrame.build_dialog): Pass the size of a spacer as a single
424 item.
425
426 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
427 size of a spacer as a single item.
428
429 * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
430 size of a spacer as a single item.
431
432 2005-02-08 Bernhard Herzog <[email protected]>
433
434 Compatibility with wxPython 2.5. The changes should make it work
435 better with 2.5 while still keeping compatibility with 2.4. There
436 are still problems with 2.5, though.
437
438 * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
439 of a spacer as a single item.
440
441 * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
442 from wxControl
443
444 * Thuban/UI/legend.py (LegendTree): When running with wxPython <
445 2.5, add an implementation of the GetFirstChild method that does
446 not require the second parameter.
447 (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
448 (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
449 (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
450 pass the second parameter to GetFirstChild
451
452 2005-02-08 Nina Hüffmeyer <[email protected]>
453
454 * Extensions/ogr/ogrshapes.py: Removed some print commands.
455
456 * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
457 additional menu but appears as a possibility in the menu Map.
458
459 2005-02-07 Jonathan Coles <[email protected]>
460 * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
461 and PYTHON_ERRF since they were no longer necessary.
462
463 2005-02-07 Bernhard Reiter <[email protected]>
464 * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
465 Enable translation for message string.
466
467 2005-02-06 Martin Schulze <[email protected]>
468
469 * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
470 the arguments of the contstructor to fit the global scheme
471
472 2005-01-31 Nina Hüffmeyer <[email protected]>
473
474 * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
475 some dialogs needed to start ogr.
476
477 * Extensions/ogr/__init__.py: Changed comments to avoid encoding
478 warnings.
479
480 * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
481 encoding warnings.
482
483 2005-01-28 Jonathan Coles <[email protected]>
484
485 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
486 mask is packed into a bit array. It's now slightly faster.
487
488 2005-01-28 Jonathan Coles <[email protected]>
489
490 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
491 default to true.
492
493 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
494 code that loads the state of the layer's use_mask flag. Its
495 usefulness is still being debated.
496
497 * Thuban/Model/save.py (SessionSaver.write_layer): Remove
498 code that saves the state of the layer's use_mask flag. Its
499 usefulness is still being debated.
500
501 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
502 options to ProjectRasterFile based on the state of layer.UseMask().
503 Catch more exceptions from ProjectRasterFile so that Thuban doesn't
504 quit is there is a problem projecting.
505 (BaseRenderer.draw_raster_data): Change the documentation to
506 describe the new format (XBM) that the mask data will be in.
507
508 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
509 data is in XBM format when format='RAW' which means it doesn't
510 need to be converted to a wxImage before being used as a mask
511 for a wxBitmap. Assume that if format != 'RAW' that the image
512 data and mask data are in the same format.
513
514 * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
515 and a mask is requested, convert the alpha band to a bit array in
516 XBM format. if an alpha channel is requested, simply return the
517 data in the alpha band. Provide better error handling by returning
518 python error messages (also fixes RT #2947).
519 (ProjectRasterFile): Support multiple mask options, rather than simply
520 a flag indicating that a mask should or should not be used. Provide
521 better error handling by returning python error messages.
522
523 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
524 Add mask data to test.
525
526 * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
527 should use the mask by default.
528 (TestLayerModificaton.test_raster_layer): Test that a layer should use
529 the mask by default.
530
531 * test/test_load.py (TestRasterLayer.test): Remove testing for
532 use_mask flag in file.
533
534 * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
535 for use_mask in file.
536
537 * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
538
539 2005-01-26 Jonathan Coles <[email protected]>
540
541 Add a new dialog box for raster layers. The dialog box allows
542 the user to toggle a mask that is generated by ProjectRasterFile
543 and is used to only draw the real parts of the projected image.
544
545 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
546 Instruct the warping code to generate a mask if the raster layer
547 requests one.
548 (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
549
550 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
551 obsolete optional mask argument.
552
553 * Thuban/UI/classifier.py (Classifier): Change the parent class
554 to LayerProperties and rework the code to support layout calls
555 from the parent.
556 (Classifier.dialog_layout): New. Layout the dialog box.
557 (Classifier.map_layers_removed): Removed. Moved to parent class.
558 (Classifier.map_replaced): Removed. Moved to parent class.
559 (Classifier._OnTry): Renamed to OnTry to support parent class.
560 (Classifier.OnClose): Removed. Supplied in parent class.
561 (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
562 (Classifier._OnOK): Renamed to OnOK to support parent class.
563 (Classifier._OnRevert): Renamed to OnRevert to support parent class.
564
565 * Thuban/UI/layerproperties.py: New. Base class for layer properties
566 dialog boxes.
567
568 * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
569 raster layer properties.
570
571 * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
572 with the non-simple version supplied with gdal. This allows added
573 features such as creating an alpha band.
574 (GetImageData): Generate a mask array from the alpha band that is
575 generated by gdal if the user has selected it. Try to support images
576 that have more than three bands, such as images with RGB plus an
577 alpha band.
578 (ProjectRasterFile): Convert python argument for mask and tell
579 gdal to enable or disable an alpha band.
580
581 * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
582 describing what kind of layer the class is. Defaults to "Unknown",
583 but should be overridden by subclasses.
584 (Layer.Type): New. Override base class method.
585 (RasterLayer.__init__): Create a flag for using a mask. Record extra
586 data from gdal for display in the properties dialog.
587 (RasterLayer.Type): New. Override base class method.
588 (RasterLayer.UseMask): New. Returns True if the mask should be used.
589 (RasterLayer.SetUseMask): New. Set if the mask should be used.
590 (RasterLayer.ImageInfo): New. Return extra information about the image.
591
592 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
593 the mask information.
594
595 * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
596
597 * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
598 Classifier classes as dialogs to use with the proper layer types.
599
600 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
601 Fix test.
602
603 * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
604 (TestLayerModification.build_path): New. Support function.
605 (TestLayerModification.test_raster_layer): New. Test new methods.
606
607 * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
608
609 * test/test_load.py (TestRasterLayer): Add tests for mask.
610
611 * test/test_load_1_0_1.py: New. Copied from test_load.py.
612
613 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
614 obsolete optional mask argument.
615
616 2005-01-26 Nina Hüffmeyer <[email protected]>
617
618 * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
619 which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
620 RowOrdinalToId() and ReadRowAsDict().
621
622 * Extensions/ogr/ogrstart.py: Added menu item which opens database
623 layers for existing database connections.
624
625 * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
626
627
628 2005-01-26 Jan-Oliver Wagner <[email protected]>
629
630 * Doc/manual/thuban-manual-de.xml: More translations.
631
632 2005-01-24 Bernhard Herzog <[email protected]>
633
634 Rework the status bar updates a bit to make sure the message about
635 the projections is produced at the right times.
636
637 * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
638 New class variable with messages that may require a status bar
639 update.
640 (MainWindow.view_position_changed)
641 (MainWindow.update_status_bar): Rename from view_position_changed
642 to update_status_bar. It's meaning has changed now that it may
643 also generate messages about problems with projection settings.
644 (MainWindow.__init__): Use the new update_status_bar_messages
645 class variable to subscribe update_status_bar
646 (MainWindow.set_position_text): Update doc-string. This method
647 has to be renamed at some point. See doc-string and comments.
648 (MainWindow.OnClose): Unsubscribe update_status_bar from all
649 messages in update_status_bar_messages
650
651 * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
652 class attribute. map messages to be forwarded by the viewport.
653 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
654 the messages in forwarded_map_messages
655
656 2005-01-21 Bernhard Herzog <[email protected]>
657
658 * test/postgissupport.py (PostGISDatabase.__init__): Tweak
659 doc-string
660 (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
661 different name for the initialization SQL file.
662
663 2005-01-21 Jonathan Coles <[email protected]>
664
665 * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
666 a projection and returns a formatted string representing the
667 parameters to feed to gdalwarp. This function eliminates
668 redundancy in draw_raster_layer().
669 (BaseRenderer.render_map_incrementally): Removed the optimization which
670 drew the top most raster layer first and then only those vector-
671 based layers that are above it. With the support for transparency
672 this optimization breaks correct behaviour.
673 (BaseRenderer.draw_raster_layer): Reorganize code to support possible
674 future enhancements to raster layer bounding box. The old behaviour has
675 not changed. Also, change calling parameters to draw_raster_data()
676 to specify new RAW data format and mask.
677 (BaseRenderer.draw_raster_data): Change signature to include an optional
678 parameter for mask information. Change documentation to mention
679 support for new parameter and added option for RAW data format.
680 The data argument is now a list of [width, height, data].
681
682 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
683 mask parameter. Add new condition for RAW format, which
684 significantly reduces rendering time. Add condition for
685 mask parameter.
686
687 * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
688 data array of RGB values from the projected image returned from
689 the gdal warping functions. In the case of palette based images, it
690 converts the NO_DATA index to the mask color.
691 (ProjectRasterFile): Removed all custom memory driver references
692 and replaced it with the standard in-memory dataset provided
693 by gdal. The return data is no longer a BMP file, but an array
694 of RGB values, one set triple per pixel.
695
696 * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
697 * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
698 * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
699
700 * setup.py (thuban_build_ext.finalize_options): Removed mention
701 of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
702 files. These are obsolete with the new version of gdalwarp.cpp
703
704 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
705 Updated signature.
706 (TestBaseRenderer.test_raster_no_projection): Changed the test
707 data to be data in the uncompressed RAW format returned from
708 ProjectRasterFile.
709
710 2005-01-21 Jan-Oliver Wagner <[email protected]>
711
712 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
713 string available for i18n.
714
715 2005-01-20 Russell Nelson <[email protected]>
716
717 * Resources/Projections/defaults.proj: Ruin the speling of the
718 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
719 It's the wrong thing to do in the long run, but it's necessary for
720 those users until that bug is fixed. Otherwise the projection
721 dialog segfaults. Better to annoy some Lambert-93 users with a
722 spelling mistake than every Fedora Core 3 user of Thuban-CVS.
723
724 2005-01-20 Bernhard Reiter <[email protected]>
725
726 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
727 docstring and comment that the warning code here is a hack.
728
729 2005-01-20 Russell Nelson <[email protected]>
730
731 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
732 user about misprojected layers when their lat/lon bounding
733 box exceeds rational lat/lon values.
734
735 2005-01-20 Bernhard Reiter <[email protected]>
736
737 * Thuban/UI/about.py (unicodeToLocale): Improved:
738 Use 'ascii' and then 'replace' for other characters
739 when getdefaultlocale returns None. Thanks to Bernhard H. .
740
741 2005-01-20 Bernhard Reiter <[email protected]>
742
743 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
744 that OnRangeText might be called twice and using None as argument.
745
746 2005-01-20 Bernhard Reiter <[email protected]>
747
748 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
749 OnRangeText(0) to work around a different in wx Behaviour noticed
750 on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
751
752 2005-01-20 Bernhard Reiter <[email protected]>
753
754 * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
755 None. (Fixes rt#2910.)
756
757 2005-01-18 Frank Koormann <[email protected]>
758
759 New Extension: mouseposition
760 Tool to collect mouse click positions (map coordinates) in a dialog.
761
762 * Extensions/mouseposition/__init__.py: New, extension registration
763
764 * Extensions/mouseposition/mouseposition.py: New, implements the
765 dialog and adds a tool to Thuban mainwindow.
766
767 * Extensions/mouseposition/position.xpm: New, icon for tool.
768
769 2005-01-14 Jan-Oliver Wagner <[email protected]>
770
771 * Doc/manual/thuban-manual-de.xml: More translations.
772
773 2005-01-11 Frank Koormann <[email protected]>
774
775 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
776 Fix indention bug.
777
778 2005-01-09 Frank Koormann <[email protected]>
779
780 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
781 BugFix 2901: Explicitly copy layers ClassificationColumn since it
782 is not part of the layers Classification.
783
784 2005-01-03 Frank Koormann <[email protected]>
785
786 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
787 BugFix 2883: Former implementation only worked on classified point
788 layers: KeyError was raised, now use the default size if field is None.
789
790 2004-12-27 Bernhard Reiter <[email protected]>
791
792 svgexport 1.0.0cvs: Fixed label export.
793
794 * Extensions/svgexport/test/test_svgmapwriter.py:
795 class TestSVGRenderer(): New class; new test test_label_font().
796
797 * Extensions/svgexport/svgmapwriter.py
798 (SVGRenderer.label_font()): initialised Font size with self.factor now,
799 makes test_label_font happy.
800
801 * Extensions/svgexport/TODO: crossed out fixed label export item.
802 Added item for options.
803
804 * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
805
806 2004-12-27 Russell Nelson <[email protected]>
807
808 Middle mouse button pans.
809
810 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
811 OnMiddleDown and OnMiddleUp events.
812 (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
813 previously used tool.
814 (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
815 pressing the middle mouse button.
816
817 2004-12-27 Jan-Oliver Wagner <[email protected]>
818
819 * Doc/manual/thuban-manual-de.xml: More translations.
820
821 2004-12-23 Jan-Oliver Wagner <[email protected]>
822
823 * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
824 \n to stderr after the warnings. Thanks to Russell Nelson.
825
826 2004-12-20 Nina Hueffmeyer <[email protected]>
827
828 * Extensions/ogr/ogrshapes.py: Fixed some issues from
829 Bernhard (coding guidelines etc.). Additionally it is now possible to
830 display shapefiles containing feature collections (e.g.polygons
831 with holes). Works with gdal 1.2.1 now.
832
833 * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
834 from Bernhard (coding guidelines etc.). If ogr can't be imported,
835 tests are skipped now.
836
837 * Extensions/ogr/ogrstart.py: Fixed some typings.
838
839 2004-12-20 Bernhard Reiter <[email protected]>
840
841 * Extensions/svgexport/TODO: updated to add support for
842 raster layers and labels for 1.0.1.
843
844 * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
845 Issue a warning now.
846
847 2004-12-19 Bernhard Reiter <[email protected]>
848
849 * Extensions/svgexport/TODO: Added idea to support triggering
850 the application down the pipe.
851
852 2004-12-19 Bernhard Reiter <[email protected]>
853
854 svgexport: Improved code quality, mainly by better naming.
855
856 * Extensions/svgexport/svgmapwriter.py:
857 DrawPath() renamed to DrawPolygonPath(),
858 added documentation, improved comments and variable names.
859
860 * Extensions/svgexport/svgmapwriter.py,
861 Extensions/svgexport/test/test_svgmapwriter.py:
862 All using DrawPolygonPath() now, the default parameter closed=True
863 omitted.
864
865 * Extensions/svgexport/test/test_svgmapwriter.py:
866 renamed test_polygon_opened() to test_polyline()
867 renamed test_transparent_polygon() to test_transparent_polyline()
868
869 2004-12-18 Jan-Oliver Wagner <[email protected]>
870
871 Some fixes of gns2shp extension.
872
873 * Extensions/gns2shp/test/__init__.py: New. Make this directory a
874 package.
875
876 * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
877 dynamically.
878
879 * Extensions/gns2shp/test/README: Simplified description how to test.
880
881 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
882 fixed some dimensions of fields according to the GNS documentation
883 which seems to change undocumented.
884 Now killing trailing \n and/or \r from MODIFY_DATE.
885 This fixes RT#2453.
886
887 2004-12-18 Bernhard Reiter <[email protected]>
888
889 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
890
891 * Extensions/svgexport/test/test_svgmapwriter.py:
892 Added new tests: test_export_polygon_with_hole()
893 and test_polygon_with_hole().
894
895 * Extensions/svgexport/svgmapwriter.py
896 (draw_polygon_shape()): Uses DrawPath correctly now.
897
898 * Doc/manual/thuban-manual.xml: Added documentation for stable
899 extention svgexport.
900 * Doc/manual/thuban-manual-de.xml: Copied English section about
901 svexport over.
902
903 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
904
905 * Extensions/svgexport/svgsaver.py,maplegend.py:
906 Moved from experimental to stable extension menu.
907
908 * Extensions/svgexport/TODO: updated.
909
910
911 2004-12-18 Bernhard Reiter <[email protected]>
912
913 Added Extensions/svgexport/TODO
914
915 2004-12-18 Bernhard Reiter <[email protected]>
916
917 Refactored in svgexport:
918 DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
919
920 * Extensions/svgexport/svgmapwriter.py
921 Added verbosity level 3 to print out polygon points.
922 (class Point): added __repr__
923 (class Brush, __str__()): Added space after ,.
924 (DrawPolygon): Renamed to DrawPath()
925 (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
926 (DrawLines): Using DrawPath now.
927
928 * Extensions/svgexport/test/test_svgmapwriter.py:
929 Replaced DrawPolygon() calls with DrawPath() and put the first argument
930 inside another list. Adapted test data with a newline before "M".
931
932 2004-12-18 Bernhard Reiter <[email protected]>
933
934 Refactored svgexport tests: 9 double tests runs eliminated;
935 code size reduced by 8 lines.
936
937 * Extensions/svgexport/test/test_svgmapwriter.py:
938 (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
939 (class BaseWithDCtools): New, subclass from BaseTestWithDC.
940 (class TestDrawSplines): now subclass from BaseTestWithDCtools,
941 this fixed the double running of the nine tests of TestVirtualDC.
942 (class TestVirtualDC): Using self.dc and self.file from setUp().
943
944 2004-12-17 Bernhard Herzog <[email protected]>
945
946 Two windows specific fixes ported from thuban-1­0-branch:
947
948 * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
949 instead of getlocale because getlocale doesn't return a usable
950 encoding name on a german windows 2000
951
952 * setup.py: windows build: Removed the absolute path names and
953 made all prfixes relative to the directory containing setup.py.
954 Makes it a little easier to adapt to a different system.
955
956 2004-12-16 Bernhard Herzog <[email protected]>
957
958 Add support for PostGIS tables with LINESTRING geometries.
959 Fixes RT#2299
960
961 * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
962
963 * test/postgissupport.py
964 (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
965 table to "roads-multi" because it now uses MULTILINESTRING
966 geometries and introduce a new "roads" table that uses LINESTRING
967 (coords_to_multilinestring): Make the doc string more precise
968 (coords_to_linestring): New. Create a LINESTRING WKT
969 representatin
970 (wkt_converter): Add coords_to_linestring
971 (upload_shapefile): Rephrase the doc-string a bit.
972
973 * test/test_postgis_db.py (TestPostGISShapestoreArc)
974 (LineStringTests)
975 (TestPostGISShapestoreLineString)
976 (TestPostGISShapestoreMultiLineString): Split
977 TestPostGISShapestoreArc into a base class LineStringTests and two
978 derived classes TestPostGISShapestoreLineString for LINESTRING
979 geometries and TestPostGISShapestoreMultiLineString for
980 MULTILINESTRING geometries. Most test methods are in the base
981 class with the exception of tests that explicitly check the raw
982 format.
983
984 2004-12-16 Bernhard Herzog <[email protected]>
985
986 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
987
988 * test/postgissupport.py (find_postgis_sql): Different postgis
989 versions put the postgis.sql file into slightly different places
990 so we have to look in both. The updated doc string describes this
991 is more detail.
992
993 * test/test_postgis_db.py
994 (TestPostGISSpecialCases.test_column_name_quoting): The return
995 value of UniqueValues is unsorted, so it has to be sorted for
996 comparison.
997
998 2004-12-16 Bernhard Herzog <[email protected]>
999
1000 Fix for RT#2237
1001
1002 * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1003 panel to be shown is the UnknownProjPanel disable the OK and Try
1004 buttons. Otherwise enable them.
1005 (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1006 the parameters. In that case __GetProjection also returns None
1007 now.
1008
1009 2004-12-15 Bernhard Herzog <[email protected]>
1010
1011 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1012 minimum number of classes to 2. The calculate_quantiles needs at
1013 least two and raises an exception otherwise.
1014 Fixes RT#2549
1015
1016 2004-12-15 Bernhard Herzog <[email protected]>
1017
1018 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1019 so that it returns a result for select statements.
1020 (PostgreSQLServer.server_version): New. Return the version of the
1021 server software.
1022 (PostgreSQLServer.require_authentication): The format of
1023 pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1024 server version and generate the file in the correct format
1025
1026 2004-12-15 Bernhard Herzog <[email protected]>
1027
1028 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1029 in the doc string and rephrase it a little.
1030
1031 2004-12-15 Frank Koormann <[email protected]>
1032
1033 * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1034 session has been loaded successfully. The check is called by the relevant
1035 tests after executing load_session().
1036
1037 2004-12-13 Bernhard Herzog <[email protected]>
1038
1039 Make sure the region used to determine which shapes are visible
1040 actually matches the region on the printed page. If this isn't
1041 done properly some shapes might not be printed.
1042 Fixes RT #2692
1043
1044 * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1045 renderer has to be at the same position as the mapregion
1046
1047 * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1048 has to be moved by (self.shiftx, self.shifty) too.
1049
1050 2004-12-13 Bernhard Herzog <[email protected]>
1051
1052 * libraries/pyprojection/Projection.i: Work around a bug in the
1053 generated python code which leads to exception in the __del__
1054 method when the constructor fails. See the comments in the code
1055 for more details.
1056
1057 * libraries/pyprojection/Projection.py: Updated from Projection.i
1058 with SWIG.
1059
1060 2004-12-13 Bernhard Herzog <[email protected]>
1061
1062 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1063 (TestAltPath.test_02_path_error_fix_from_list)
1064 (TestAltPath.test_05_path_error_fix_from_list_changed)
1065 (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1066 is destroyed in tearDown, so there's no need to do it in a test
1067 case.
1068
1069 * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1070 debug print
1071
1072 2004-12-13 Bernhard Herzog <[email protected]>
1073
1074 * Extensions/svgexport/test/test_svgmapwriter.py
1075 (TestDrawSplines.setUp): Do not use super with the unittest
1076 classes because in Python 2.2 they're still old-style classes.
1077
1078 2004-12-13 Frank Koormann <[email protected]>
1079
1080 Alternative Path feature: When loading a (moved) session where
1081 shapefiles cannot be found, ask the user. Use the specified path
1082 if further shapefiles are missing. However, ask the usr for confirmation
1083 in such cases.
1084
1085 * test/test_load.py (TestAltPath): New, tests for alternative path feature
1086 in load_session()
1087 (Shapefile_CallBack): Helper, implements controllable callback.
1088
1089 * Thuban/UI/application.py (ThubanApplication.OnInit):
1090 Added "alt_path" to self.path
1091 (ThubanApplication.OpenSession): Added shapefile_callback as second
1092 callback similar to db_connection_callback.
1093 (ThubanApplication.run_alt_path_dialog): New, implementaion of
1094 shapefile_callback. In addition to raising the dialog the control of
1095 self.path('alt_path') is implemented here.
1096
1097 * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1098 (SessionLoader.open_shapefile): Open shapefile, eventually with
1099 alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1100 formerly used in start_fileshapesource()/start_layer().
1101 (SessionLoader.start_fileshapesource): Call open_shapefile().
1102 (SessionLoader.start_layer): Call open_shapefile().
1103 (load_session): Added shapefile_callback.
1104
1105 * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1106 feature (search / check).
1107
1108 * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1109
1110 2004-12-11 Bernhard Reiter <[email protected]>
1111
1112 svgexport 0.9.2: Point size supports for maps.
1113
1114 * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1115 (def draw_point_shape): new parameter size defaults to 2 as before.
1116 (draw_shape_layer_incrementally): Moved draw_func log line higher.
1117 Added draw_func call with size when dealing with a point layer.
1118
1119 * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1120
1121 2004-12-11 Bernhard Reiter <[email protected]>
1122
1123 Made sure that newlines are inserted in the svg path d attributes
1124 to raise the chance that the line length will be below 255 characters,
1125 as recommended by REC SVG 1.1 in section 8.3.1.
1126
1127 * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1128 Adding \n before L's and changed whitespace handling.
1129
1130 * Extensions/svgexport/test/test_svgmapwriter.py:
1131 Adapted tests to new whitespace handling of DrawPolygon.
1132
1133 2004-12-11 Bernhard Reiter <[email protected]>
1134
1135 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1136
1137 * Extensions/svgexport/test/test_svgmapwriter.py:
1138 Removed test_drawbezier in favour of new test_drawspline3 and
1139 test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1140 All only to test DrawSpline.
1141
1142 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1143 New implementation now really using the strange algorithm of
1144 xfig 3.1's approximated splines and its conversion to postscript
1145 with one twist: SVG can do quadratic beziers, so skipped translation
1146 to cubic beziers.
1147 (TestWithDC): Typo in comment fixed.
1148
1149 2004-12-09 Martin Schulze <[email protected]>
1150
1151 * Thuban/Model/classgen.py: Added missing character encoding
1152
1153 * Extensions/wms/properties.py (OpenWMSProperties): removed
1154
1155 * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1156 support for get_srs_discrepancies() since there are no
1157 discrepancies anymore (was a thinko)
1158
1159 * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1160 format priority now that more formats are supported globally by
1161 the render engine.
1162
1163 2004-12-08 Silke Reimer <[email protected]>
1164 * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1165 because it is not available in all versions of ogr
1166
1167 2004-12-08 Bernhard Reiter <[email protected]>
1168 * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1169 global tests until a real one is commited.
1170
1171 2004-12-07 Nina Hüffmeyer <[email protected]>
1172
1173 * /Extensions/ogr/: Adding a new extension to read shapefiles with
1174 ogr. It is planned to add other vector formats.
1175
1176 * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1177
1178 2004-12-07 Jan-Oliver Wagner <[email protected]>
1179
1180 * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1181 part of a (non-)fix to renable that the tests are always
1182 executed.
1183
1184 2004-12-07 Bernhard Reiter <[email protected]>
1185
1186 * Extensions/svgexport/test/test_svgmapwriter.py:
1187 Added test_drawbezier() to test DrawSpline().
1188
1189 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1190 Really implemented bezier drawing.
1191
1192 * Extensions/svgexport/__init__.py: Bumped version of svgexport
1193 to 0.9.1 because now the legend examples lines styles
1194 will be drawing with beziers.
1195
1196 2004-12-05 Martin Schulze <[email protected]>
1197
1198 * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1199 GIF as supported bitmap image formats (helpful for the WMS extension)
1200
1201 2004-11-30 Martin Schulze <[email protected]>
1202
1203 * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1204 Improved the test for the internal compare method
1205
1206 2004-11-27 Jan-Oliver Wagner <[email protected]>
1207
1208 * Thuban/UI/about.py (About.__init__): Added
1209 Norbert Solymosi for hungarian translation and Ole Rahn
1210 as contrbutor. Moved Bernhard Reiter from Contributor
1211 to Developer.
1212
1213 2004-11-27 Bernhard Reiter <[email protected]>
1214
1215 * Extensions/svgexport/test/test_svgmapwriter.py:
1216 Removed Jan from author list as he did not change enough significant
1217 lines yet.
1218
1219 * Extensions/svgexport/__init__.py: Added Bernhard as author
1220 of the Extension.
1221
1222 2004-11-27 Jan-Oliver Wagner <[email protected]>
1223
1224 * po/hu.po: New. Hungarian translation. Contributed
1225 by Norbert Solymosi.
1226
1227 2004-11-26 Bernhard Herzog <[email protected]>
1228
1229 * Extensions/svgexport/test/test_svgmapwriter.py
1230 (Testobjectexport.test_transparent_polygon): Commented out some
1231 debug prints
1232
1233 2004-11-24 Jan-Oliver Wagner <[email protected]>
1234
1235 Fix broken tests for svg extension and added svg legend
1236 to Experimental menu.
1237
1238 * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1239 the test run correctly even if the extension is a package.
1240 Also removed the "import Thuban" which makes no sense.
1241
1242 * Extensions/svgexport/__init__.py: Fix to have the extensions'
1243 test module also be executed from the global test routine.
1244 This is done by looking for the absense of the DISPLAY variable.
1245
1246 * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1247 to Experimental menu since this module has yet not reached a stable
1248 status (ie. 1.0).
1249
1250 2004-11-22 Bernhard Reiter <[email protected]>
1251
1252 * Extensions/svgexport/svgmapwriter.py:
1253 Added verbose variable and some logging depending on it.
1254 (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1255 because counting i is not necessary.
1256 (class Pen, class Brush): Added simple __str__ methods.
1257 (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1258 not exported to svg file) Note: holes still unhandled.
1259
1260 * Extensions/svgexport/test/test_svgmapwriter.py:
1261 Made a baseclass TestWithDC for test needed a DC.
1262 Added tests for bug #2698 (transparent polygons are not
1263 exported to svg file):
1264 Testobjectexport.test_transparent_polygon()
1265
1266 * Thuban/Model/base.py (UnsetModified):
1267 Fixed some typos in docstring.
1268
1269 * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1270 Added hints on the used algorithm for handling holes.
1271
1272 2004-11-20 Jan-Oliver Wagner <[email protected]>
1273
1274 Some face lifting for the examples.
1275
1276 * Examples/__init__.py: Make this directory a package.
1277
1278 * Examples/simple_extensions/__init__.py: Make this directory a package.
1279
1280 * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1281 menu to Examples menu.
1282
1283 * Examples/simple_extensions/simple_command.py: Some more comments,
1284 minor changes.
1285
1286 * Examples/simple_extensions/simple_tool.py: Minor changes.
1287
1288 2004-11-20 Jan-Oliver Wagner <[email protected]>
1289
1290 Changed way of extension registry for wms and added extension
1291 registry for umn_mapserver extension.
1292
1293 * Extensions/wms/__init__.py: Added registry entry and the importing
1294 of the actual wms module. Included a test for the required PyOGCLib.
1295
1296 * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1297
1298 * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1299 importing of the actual umn mapserver management modules.
1300 Included a test for the required Python MapScript.
1301
1302 2004-11-20 Jan-Oliver Wagner <[email protected]>
1303
1304 Changed way of extension registry for importAPR, bboxdump
1305 and added extension registry for svgexport.extension registry for
1306 svgexport.
1307
1308 * Extensions/importAPR/__init__.py: Added registry entry and the importing
1309 of the actual importAPR module.
1310
1311 * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1312 __init__.py).
1313
1314 * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1315 »···of the actual bboxdump module.
1316
1317 * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1318 »···__init__.py).
1319
1320 * Extensions/svgexport/__init__.py: Added registry entry and the importing
1321 of the svgsaver module.
1322
1323 * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1324 to Experimental menu since this module has yet not reached a stable
1325 status (ie. 1.0).
1326
1327 2004-11-18 Jan-Oliver Wagner <[email protected]>
1328
1329 Now the hit test considers the size of point symbols.
1330
1331 * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1332 'size' defaulting to the previously fixed value 5.
1333 Extended doc-string.
1334 (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1335 for symbols.
1336 Now the size of the largest point symbol is determined to find out
1337 about whether the point has been hit.
1338 This fixes the problem that only clicks inside a fixed distance of
1339 5 where found.
1340
1341 2004-11-17 Jan-Oliver Wagner <[email protected]>
1342
1343 Another open issue fixed regarding sizeable symbols: correct rendering of
1344 selected symbols.
1345
1346 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1347 Added consideration of the specific size of point symbols.
1348 The property for each point symbol is retrieved and the size applied
1349 for the rendering method.
1350 Added doc-string.
1351
1352 2004-11-16 Jan-Oliver Wagner <[email protected]>
1353
1354 Changed way of Extension Registry for gns2shp and profiling.
1355
1356 * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1357 __init__.py).
1358
1359 * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1360 of the actual gns2shp module.
1361
1362 * Extensions/profiling/profiling.py: Removed registry entry (moved to
1363 __init__.py).
1364
1365 * Extensions/profiling/__init__.py: Added registry entry and the importing
1366 of the actual profiling module.
1367
1368 2004-10-28 Bernhard Reiter <[email protected]>
1369
1370 * Extensions/svgexport/: Minor improvements to doc strings.
1371
1372 2004-10-07 Jan-Oliver Wagner <[email protected]>
1373
1374 Further elements for sizable point objects now
1375 making this feature usable though not yet complete.
1376
1377 * Thuban/Model/save.py (SessionSaver.write_classification): Write
1378 attribute 'size' for cldata when the shape layer is of point type.
1379 This also now make the test_load.py tests happy.
1380
1381 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1382 gradient.
1383
1384 * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1385 ID_SELPROP_SPINCTRL_LINEWIDTH.
1386 (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1387 (ID_SELPROP_SPINCTRL_SIZE): New Id.
1388 (SelectPropertiesDialog.__init__): Added a second spin control
1389 for the size in case the corresponding layer is of point type.
1390 (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1391 (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1392 (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1393 and refresh preview.
1394
1395
1396
1397 2004-10-04 Martin Schulze <[email protected]>
1398
1399 * Extensions/wms/test/test_parser.py
1400 (TestWMSCapabilitiesParser.test_compareLists): Added missing
1401 self-test for compareLists()
1402 (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1403 self-test for compareDicts()
1404 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1405 to verify the test routine fails with non-equal arguments
1406 (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1407 to verify the test routine fails with non-equal arguments
1408
1409 2004-10-03 Jan-Oliver Wagner <[email protected]>
1410
1411 First elements for sizeable point objects.
1412
1413 * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1414
1415 * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1416
1417 * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1418 of a corresponding argument is given.
1419 (TestSymbolSize): New. Test the size attribute of cldata.
1420
1421 * Thuban/Model/classification.py: Removed some trailing whitespaces.
1422 (ClassGroupProperties.__init__): Set default size.
1423 (ClassGroupProperties.SetProperties): Set the size.
1424 (ClassGroupProperties.GetSize): New. Return the size.
1425 (ClassGroupProperties.SetSize): New. Set the size.
1426 (ClassGroupProperties__eq__): Compare also size.
1427 (ClassGroupProperties__repr__): Print also size.
1428
1429 * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1430 the size attribute.
1431
1432 * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1433 Also, now there is a return value that indicates whether the drawing
1434 size exceeded the given rect extent and if so the new extent.
1435 Finally, point objects are drawn depending on the size. If either
1436 the width or height is exceeded, the new extent is returned.
1437 (ClassRenderer.Draw): Now when calling the previewer drawing function,
1438 evaluate the return value and, if not None, adapt the grid widget size
1439 accordingly and redraw again.
1440
1441 * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1442 If the draw function is for points, call it with the size as additional
1443 parameter.
1444 (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1445 the size. Compute the radius using the size.
1446
1447 * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1448 that Thuban supports size, apply this correctly.
1449
1450 * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1451
1452 2004-10-03 Jan-Oliver Wagner <[email protected]>
1453
1454 * Doc/manual/thuban-manual-de.xml: Started translation of
1455 Map chapter.
1456
1457 2004-10-01 Martin Schulze <[email protected]>
1458
1459 * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1460 argument for general use through properties-dialog selector
1461
1462 * Thuban/UI/classifier.py: Register properties dialog classes for
1463 both provided layer classes/types.
1464
1465 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1466 map can be retrieved through the parent which is passed to the
1467 constructor anyway and doesn't require an argument of its own,
1468 required for the unification of arguments for general use through
1469 properties-dialog selector.
1470 (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1471 whether a dialog is already opened (and raising it to the users
1472 attention) and creating a new dialog into a function of its own
1473 (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1474 method
1475 (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1476 global registration of properties dialog classes (which are indeed
1477 layer-specific).
1478
1479 * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1480 for general use through properties-dialog selector, the map can be
1481 retrieved through the parent and doesn't require an argument of
1482 its own.
1483
1484 * Extensions/wms/wms.py: Register the properties dialog class for
1485 the provided WMS layer
1486
1487 2004-09-28 Jan-Oliver Wagner <[email protected]>
1488
1489 New feature: Registry for Extensions.
1490
1491 * Thuban/UI/extensionregistry.py: This module defines a registry for
1492 Extensions.
1493
1494 * Thuban/UI/about.py (About.__init__): Added description
1495 of the registered extensions with all of the information.
1496
1497 * Thuban/Model/extension.py (Extension): Improved doc-string.
1498
1499 * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1500 Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1501 Extensions/wms/wms.py: Added registration of the extension.
1502
1503 2004-09-27 Bernhard Reiter <[email protected]>
1504
1505 More fixes to svgexport to make used ids unique and
1506 conforming to XML's Name production.
1507
1508 * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1509 test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1510 test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1511 Added Bernhard R. as author.
1512 * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1513 concatenation char now (makes test_make_ide_nosetbaseid() valid).
1514 Also transform second id part with "%d" and catch the TypeError
1515 to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1516 Corrected typo inBernhard's author line.
1517 (SetBaseID): Return the transformed base id. Transform characters
1518 which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1519 import binascii. If to be set string starts with "xml" or so, add "t".
1520 (draw_shape_layer_incrementally): use the returned value of SetBaseID
1521 for used_baseids checks.
1522
1523 2004-09-25 Bernhard Herzog <[email protected]>
1524
1525 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1526 Remove a debug print and some tab characters.
1527
1528 2004-09-25 Bernhard Reiter <[email protected]>
1529
1530 * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1531 (SetBaseID, SetID, make_id): Improved docstring comments to explain
1532 the interaction of the three functions and the XML id contrains.
1533
1534
1535 2004-09-23 Jan-Oliver Wagner <[email protected]>
1536
1537 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1538 Module.
1539
1540 * Doc/README: Added info on ThubanModel.xmi.
1541
1542 2004-09-23 Jan-Oliver Wagner <[email protected]>
1543
1544 * Doc/README: New. Some info about how to generate technical
1545 documentation from the source code.
1546 This text was send to the Thuban developer mailing list on
1547 September 21st 2004 by Bernhard Reiter.
1548
1549 2004-09-21 Bernhard Reiter <[email protected]>
1550
1551 Improved the svgexport to only use unique ids. Will issues
1552 an error message dialoge when two layer names are the same.
1553 ShapeIDs are now added with a dash within the svg ids.
1554
1555 * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1556 * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1557 (TestSVGRenderer): New test class with test_make_in() and
1558 test_check_for_layer_name_clash()
1559 * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1560 and draw_shape_layer_incrementally() to not use a baseid twice,
1561 satisfying test_check_for_layer_name_clash()
1562 (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1563 test_make_in().
1564 * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1565 and wxICON_HAND.
1566 (write_to_svg): Put dc and rendering in a try statement and on
1567 catching SVGmapWriterError notify the user and delete the target file.
1568
1569 2004-09-20 Bernhard Reiter <[email protected]>
1570
1571 * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1572
1573 2004-09-03 Jan Schüngel <[email protected]>
1574
1575 * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
1576 small bug with the line color. Now the line color will now only set
1577 if it is set in Thuban an not Transparent.
1578
1579 * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
1580 deleting the layers from mapfile. Now all layers will delete backwards
1581 from the last.
1582
1583 2004-08-20 Silke Reimer <[email protected]>
1584
1585 * Thuban/Model/layer.py:
1586 Fixes bug in projection handling: Otherwise very large region might not
1587 have valid values in the layer's projection.
1588
1589 2004-08-20 Silke Reimer <[email protected]>
1590
1591 * Thuban/UI/about.py:
1592 small changes to be consistent with coding style.
1593
1594 2004-08-13 Martin Schulze <[email protected]>
1595
1596 * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
1597 Adjusted a comment
1598
1599 2004-08-11 Silke Reimer <[email protected]>
1600
1601 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
1602 too many and too enhanced imports of locale
1603
1604 2004-08-10 Silke Reimer <[email protected]>
1605
1606 * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
1607 function unicodeToLocale() to convert special characters to users
1608 locale encoding
1609
1610 2004-08-10 Jan-Oliver Wagner <[email protected]>
1611
1612 * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
1613 lower case letter'
1614
1615 2004-08-09 Jan Schüngel <[email protected]>
1616
1617 * ChangeLog: Rewrite the last ChangeLog entry to follow
1618 the standard way.
1619
1620 * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
1621 the function where it is needed, because it don't works if it stands
1622 at the beginning.
1623 (MF_Layer.__init__): Removed the extra numclassed variable. Now
1624 numclasses from the mapscript will be used.
1625 (MF_Layer.get_index): New. Return the index of the layer in mapfile.
1626 (MF_Layer.set_classes): New. A Classlist will be set to the layer.
1627 (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
1628 (MF_Layer.remove_allclasses): New. All class of the layer will remove.
1629 (MF_Map.create_new_layer): New. A new Layer is created and associated
1630 with the mapscript object.
1631 (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
1632 the mapscript.
1633 (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
1634 linked to the layer in thuban, else the layerobject linked to the
1635 thubanlayer will be used.
1636 AnnotationLayer will now store the filename of the shapefile.
1637 (MF_Map.remove_layer): If a layer is removed the associated object
1638 must be set new.
1639
1640 * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
1641 layers which are exists in thuban to the mapobj. All removed Layers
1642 will be removed from the mapobj.
1643 Added comments to all functions.
1644 (thuban_to_map): No layer will be removed here.
1645
1646 * Extensions/umn_mapserver/mf_handle.py
1647 (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
1648 Layersettings for the mapserver kann be edited.
1649
1650 * Extensions/umn_mapserver/mf_import.py: Now all layers which are
1651 imported, will be linked with the associated MF_Layer.
1652 (import_mapfile): All layers, which are not selected, will be removed.
1653 Disable the "import layer from mapfile" menu option.
1654
1655 * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
1656 Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
1657 layer on permanently.
1658
1659 2004-08-03 Jan Schüngel <[email protected]>
1660
1661 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1662 New. This function removes all metadata
1663 (MF_Layer.set_group): New. Set the group setting.
1664 (MF_Layer.get_group): New. Get the group setting.
1665 (MF_Map): Removed the extra numlayers variable, used the mapscript
1666 parameter instead.
1667 (MF_Map.get_numlayers): New. This get numlayers.
1668 (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1669 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1670 if the object is an instance. Also added the annotation layer here to
1671 export, but only the layer is created in the mapfile.
1672
1673 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1674 the check if a mapobj exist, because its not needed anymore. The
1675 export function is only available if a mapobj exist.
1676 Use the new function to remove all layers.
1677
1678 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1679 option and the metadata button. The layer dialog is temporary disabled.
1680 (Metadata_CustomDataTable): Added some functions to show the grid
1681 correct.
1682
1683 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1684 the number of layer from import_mapfile to this function.
1685 (AnnotationLayer): New. This Class shows the Annotation layer in
1686 thuban. The layer don't do anything. It's only to show the layer
1687 and to save the layer order.
1688 (add_annotationlayer): New. Import an annotation layer to thuban.
1689 (select_layer2import): New. Import only layers to thuban and not
1690 the other settings like projection or scalebar.
1691 (create_new_mapfile): Moved the _has_umn_mapobj function and the
1692 create_new_mapfile functions from mf_handle.py to mf_import.py.
1693
1694 * Extensions/umn_mapserver/sample/iceland.map: Added the group
1695 parameter to the roads and cultural layers. Also added a new
1696 Annotation Layer for the cultural points.
1697
1698 * Extensions/umn_mapserver/sample/iceland.html: Added the select
1699 option for the annotation layer.
1700
1701 * Extensions/umn_mapserver/sample/index.html: Added the start
1702 parameter for the annotation layer.
1703
1704 2004-08-01 Jan-Oliver Wagner <[email protected]>
1705
1706 * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1707 translation completed.
1708
1709 * Doc/manual/thuban-manual.xml (Chapter Session Management):
1710 Fixed unprecise description for Save Session.
1711
1712 2004-07-31 Jan-Oliver Wagner <[email protected]>
1713
1714 Started translation of Users Manual into german.
1715
1716 * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1717
1718 * Doc/manual/Makefile: Added build instructions for german
1719 users manual.
1720
1721 * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1722
1723 2004-07-28 Jan Schüngel <[email protected]>
1724
1725 * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1726 functions. Now all metadata will handle by the function and its not
1727 needed to initialize it from outside. Therefor the associated mapobj
1728 will be stored in the Metadata Object. So we can use the special
1729 functions from the associated mapobj to get the Metadata.
1730 Therefor all initialization code for the metadata is removed from the
1731 other classes.
1732 (MF_Layer): Added a function to get the metadata object.
1733 (MF_Map): Added a function to set the mappath, the path where
1734 the mapfile ist stored.
1735
1736 * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1737 to set the extent in the mapfile. Now the code is set by the displayed
1738 data in the Thuban-view.
1739 (export_mapfile): The shapepath is now set empty, until relative
1740 pathnames are supported.
1741
1742 * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1743 metadata. Yet only mapfile metadata are supported. Layer and class
1744 supported are not implemented.
1745 Added a dialog to handle layer informations. The dialog only shows the
1746 selected layer at the moment.
1747
1748 * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1749 code for setting the extent in thuban. Now the extent is set to the
1750 given extent from the mapfile.
1751 Fixed a logical mistake. Now the extent is set when realy a layer is
1752 loaded, and not if one is selected to load.
1753
1754 * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1755 move the shown map in the browser.
1756
1757 * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1758 line to the mapobj and added metadata to the political layer.
1759
1760 * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1761 for Metadata.
1762
1763 2004-07-26 Martin Schulze <[email protected]>
1764
1765 * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1766 ClassMapper
1767
1768 * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1769 case for the new ClassMapper
1770
1771
1772 2004-07-22 Bernhard Herzog <[email protected]>
1773
1774 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1775 visible extent of the map in projected coordinates
1776
1777 * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1778 (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1779 tests.
1780 (SimpleViewPortTest.test_visible_extent): New. The real test for
1781 VisibleExtent()
1782
1783 2004-07-22 Bernhard Herzog <[email protected]>
1784
1785 * test/test_viewport.py: Use support.run_tests as the main
1786 function when running asa script.
1787
1788 2004-07-22 Jan Schüngel <[email protected]>
1789
1790 * Extensions/umn_mapserver/mf_export.py: Added "import os"
1791 Removed the old "import Thuban.UI.mainwindow" code.
1792 (tbextent_to_map): Removed the extra function and at the code direct
1793 to "thuban_to_map" function.
1794 (write_creatorcomment): Added. Now a short comment is added to the
1795 beginning of an generated mapfile.
1796 (export_mapfile): Now the Path and filename are saved in to variables,
1797 and not together in one variable. This is needed for the new
1798 write_creatorcomment function.
1799
1800 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1801 import module "re". Also added Range and the ClassGroupRange import
1802 from Thuban. Both are needed for the new range expression import.
1803 (create_rangeexpression): Added. Creates a Range Expression in Thuban
1804 style from a given mapfile expression.
1805 (added_rasterlayer): Make some small code changes. The shapepath is
1806 now stored in an extra variable and the clazz_name is set empty if no
1807 class name set in the mapfile.
1808 Changed the Error message for Range Expressions, becaus the new
1809 function create a error string which will be shown in the dialog.
1810
1811 * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1812 range expression import.
1813
1814 2004-07-21 Jan-Oliver Wagner <[email protected]>
1815
1816 * Extensions/umn_mapserver/README: Added hint that
1817 installation as root can be avoided. Removed all tabs.
1818
1819 2004-07-16 Bernhard Herzog <[email protected]>
1820
1821 * test/test_viewport.py
1822 (ViewPortTest.test_changing_map_projection): Check that changing
1823 the projection of an empty map shown in a viewport doesn't lead to
1824 exceptions in the viewport's handler for the
1825 MAP_PROJECTION_CHANGED messages
1826
1827 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1828 try to keep the same region visible when the map actually contains
1829 something
1830
1831 2004-07-15 Jan Schüngel <[email protected]>
1832
1833 * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1834 mappath directly from the mapobj. Is needed because of the changes
1835 in mf_import.py.
1836 (MF_Layer.add_thubanclass): Added a new comment.
1837 (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1838 mapobj is empty there is no extent get from thuban an so no one can
1839 set to th mapobj.
1840
1841 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1842 the discription.
1843 Split the funktion in to three smaller ones. The new functions are
1844 add_rasterlayer, add_polygonlayer and select_layer2import.
1845 Removed the mapfilepath and filepath initialisation, because its know
1846 include in the new functions.
1847 Now nothing will be imported if cancel is pressed in the
1848 layer choice dialog.
1849
1850 2004-07-14 Jan Schüngel <[email protected]>
1851
1852 * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1853 import.
1854 (MF_Symbolset): Removed the extra variable for numsymbols.
1855 (MF_Class.__init__): Added a comment to the exception clause.
1856 Removed the extent init, because it was not needed anymore.
1857 (MF_Layer.add_thubanclass): Added the code to set the class name to
1858 the expression value from thuban if no label is defined.
1859 Added the code to export Range expressions from thuban to the mapfile.
1860 (MF_Map.set_extent): Removed the exception and replace it by some if
1861 code. If the size of a map is not defined the size will be set to 1,1.
1862 This is necessary because if the extent is set, mapscript checks if
1863 the size is greater than zero.
1864 (MF_Web): Added the get and set function for the template.
1865
1866 * Extensions/umn_mapserver/mf_export.py: Added the function to check
1867 if a mapobject exists and used it to set the status of the menu items.
1868 If no mapfile exists the settings could not be edditied.
1869 Define after which menuitem the exportitem will include.
1870
1871 * Extensions/umn_mapserver/mf_handle.py: Removed the import
1872 Thuban.UI.mainwindow clause, because it is not needed.
1873 Added the command Refresh() to all "OnChangeColor()" functions,
1874 because the color preview window was not updated on a color change.
1875 Added the function to check if a mapobject exists and used it to set the
1876 status of the menu items. If no mapobject exists the settings could not
1877 be edditied.
1878 (Map_Dialog): Moved the imagetype selector from the
1879 Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1880 (Web_Dialog): Removed the name label and added the template textbox.
1881
1882 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1883 the exception handling on loading the layers by an if statement. It
1884 is not necessary to us the exception there.
1885 The Filepath creation now use os.path.join to build the path.
1886
1887 * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1888 definition from global to the setUp function. Now the testMap will
1889 initialize new on each test.
1890
1891 * Extensions/umn_mapserver/sample/iceland.map: Include three new
1892 classes in the Line Layer, to test logical Expressions.
1893 Set the status of the class "Point9" in the Point Layer to off
1894
1895 2004-07-13 Bernhard Herzog <[email protected]>
1896
1897 * Thuban/UI/baserenderer.py
1898 (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1899 optimization that tries not to draw layers under a raster layer.
1900 The bug was harmless. All it effectively did was to produce The a
1901 strange messages about not being able to draw Layer instances for
1902 all vector layers below a raster layer which would be invisible
1903 anyway because the raster layer currently always covers the entire
1904 window
1905
1906 2004-07-08 Jan Schüngel <[email protected]>
1907
1908 * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1909 a list of supported outputformats. This formats are not alle supported
1910 because there is no possibility to get the outputformat without the
1911 name known. Make some formal changes to the code.
1912 (MF_Map.set_name()): Fixed a bug if the name is None.
1913
1914 * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1915 statement, because its not needed anymore. The Outputformat is now
1916 given as string from the object. Make some formal changes to the code.
1917
1918 * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1919 most of the new setting which were added during the last changes.
1920 Removed the MF_Size Test.
1921
1922 * Extensions/umn_mapserver/test/test.map: Added a new class to the
1923 cultural Layer to test expressions and the the status of that layer
1924 from on to default.
1925 Changed the data path the the correct Thuban Data
1926 Added the Outputformat Object and Symbol Object
1927
1928 2004-07-07 Jan Schüngel <[email protected]>
1929
1930 * Extensions/umn_mapserver/mapfile.py: Added some new
1931 settings to edit (outputformat, label, imagetype)
1932
1933 * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1934 the Label Dialog and add the OutputDialog.
1935 Make some changes to the code order.
1936
1937 2004-07-06 Jan Schüngel <[email protected]>
1938
1939 * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1940 and line Obj and add the scalebar_status_type, scalebar_style_type and
1941 scalebar_position_type.
1942 Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1943 are only used to create a Symbol like the circle in Thuban.
1944 Added the scalebarObject (MF_Scalebar)
1945 (MF_Class): Added set_status and get_status.
1946 (MF_Layer.add_thubanclass): Added code to set the class status
1947 (MF_Map): Added code to handle the symbols and scalebar
1948 (MF_Label): Added the set_partials and get_partials functions
1949
1950 * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1951 from mapfile. Added a function to create a circle object like the one
1952 from thuban if no one exists.
1953
1954 * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1955 press ok in the assosiated dialog and not at the end of the
1956 colordialog.
1957 Added the Dialog for the Scalebar.
1958 (Label_Dialog): Added the offset option
1959
1960 * Extensions/umn_mapserver/mf_import.py: Added code to import the
1961 status of the Classes.
1962 Fixed a bug with the projection. Now the to_meter parameter will be
1963 added to the Projection only if it doesn't exists.
1964
1965 2004-07-01 Jan Schüngel <[email protected]>
1966
1967 Added the functionality to handle the content thuban is not
1968 able to handle directly.
1969
1970 * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1971 Thuban with the possibility to edit the mapfile content.
1972
1973 * Extensions/umn_mapserver/mf_import.py: Added the possibility
1974 to import mapfiles without any layer selected. So it is possible
1975 to edit the other settings in a mapfile.
1976 (import_mapfile): Added code to use the editing functions.
1977 Added the possibility to import the projection to a layer if one
1978 is defined.
1979 Status settings (On,Off) will now set in thuban (visible, invisible).
1980 fixed a bug with with classnames. If no classname is set in mapfile
1981 the value in Thuban will set to the expression.
1982
1983 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1984 possibility to save a new mapfile or use the old one which is
1985 imported or new created.
1986 Added code to use the editing functions.
1987 Remove some not needed import statements
1988
1989 * Extensions/umn_mapserver/mapfile.py: Added new types which are
1990 need for the editing functions.
1991 Added needed set-functions for the editing functions.
1992 Added the possibility to export rasterimages.
1993 Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1994 MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1995 moment.
1996 (MF_Class.set_thubanstyle): Now point layers will set to a default
1997 symbol to show a circle in mapserver and not only a 1px dot.
1998 (MF_Style.__init__): Fixed a bug with the color. Color was not set
1999 correct before.
2000 (MF_Size): Removed, because it is not needed.
2001
2002 * Extensions/umn_mapserver/README: Added the hints to use the
2003 export and editing functions, too.
2004
2005 * Extensions/umn_mapserver/sample/iceland.map: Added the
2006 new parameter "UNITS METERS".
2007 Change the political layer to status OFF.
2008
2009 * Extensions/umn_mapserver/sample/README: Added some
2010 more details to setup the sample in the MapServer.
2011
2012 2004-06-26 Bernhard Reiter <[email protected]>
2013
2014 * Extensions/svgexport/test/test_svgmapwriter.py:
2015 Removed class VFile and used standard StringIO instead.
2016
2017 2004-06-23 Jan Schüngel <[email protected]>
2018
2019 Add the export function to the umn_mapserver extension.
2020
2021 * Extension/umn_mapserver/mf_export.py: New. This module extents
2022 Thuban with the possibility to export the Thuban content.
2023
2024 * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2025 with the export module. Especially added the possibility to
2026 add thuban objects directly to the map objects.
2027
2028 * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2029 because of the hint from Bernhard Herzog.
2030 Corrected the handling of absolute pathnames.
2031 Changed the Text of the Menu-Item, now the beginning is upper case.
2032
2033 * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2034
2035 2004-06-16 Jan Schüngel <[email protected]>
2036
2037 Add a sample and make some changes.
2038
2039 * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2040 import from * to explicit used statements. Changed the
2041 Thuban.UI.mainwindow import phrase, too.
2042 (import_mapfile):Corrected a clerical mistake.
2043 Added wxCHANGE_DIR in OpenFile Dialog.
2044 Added a MultipleChoiceDialog, to select the layers to load from
2045 mapfile into thuban. Thereby the projection is only set if one layer
2046 is selected.
2047 Added the possibility to handle relative pathnames which uses
2048 up-level references.
2049 Removed some doubled code.
2050 Corrected an error with integer values used as label in thuban
2051 ClassGroup.
2052
2053 * Extensions/umn_mapserver/sample: New.
2054
2055 * Extensions/umn_mapserver/sample/README: New. Describes the
2056 usage of the sample files.
2057
2058 * Extensions/umn_mapserver/sample/iceland.map: New. This is
2059 a suitable .map-file for the iceland data.
2060
2061 * Extensions/umn_mapserver/sample/index.html: New. The template
2062 for the mapfile.
2063
2064 * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2065 file for the Iceland Application on web.
2066
2067 * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2068 some details.
2069
2070 * Extensions/umn_mapserver/test/test_mapserver
2071 (mapserver_import_Test_generalClasses.test_MF_Color):
2072 Corrected the thubancolor test.
2073
2074 2004-06-15 Jan Schüngel <[email protected]>
2075
2076 * Extensions/umn_mapserver/README: New. Install instruction.
2077
2078 2004-06-14 Bernhard Reiter <[email protected]>
2079
2080 * libraries/thuban/cpl_mfile.h: Added copyright header.
2081
2082 * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2083 Free Software License so that it is most useful with gdalwarp
2084 and bmpdataset.
2085
2086 2004-06-14 Bernhard Herzog <[email protected]>
2087
2088 * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2089 import of wxPython.wx itself (as opposed to the contents of
2090 wxPython.wx). For some reason wxPython.wx is available as
2091 wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2092 wrt. wxPython 2.4.
2093
2094 2004-06-10 Jan Schüngel <[email protected]>
2095
2096 Initial version of new extension "umn_mapserver". This extension aims
2097 to manage configuration for the UMN MapServer application. This
2098 inital version just imports the .map-files and displays all, Thuban is
2099 capable of.
2100
2101 * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2102
2103 * Extensions/umn_mapserver/test/README: New. Describes how to run the
2104 tests.
2105
2106 * Extensions/umn_mapserver/test/test.map: New. This is a test
2107 .map-file for automated tests of the umn_mapserver extension of
2108 Thuban.
2109
2110 * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2111 UMN Mapserver classes.
2112
2113 * Extensions/umn_mapserver/__init__.py: New. Init to make this
2114 directory a package.
2115
2116 * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2117 '.map'-file objects.
2118
2119 * Extensions/umn_mapserver/mf_import.py: New. This module extends
2120 Thuban with the possibility to handle UMN MapServer mapfiles.
2121
2122 2004-06-03 Bernhard Herzog <[email protected]>
2123
2124 * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2125 to a tuple before using it as arguments to the % operator. This
2126 fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2127 reported today on thuban-list by Jan Schüngel
2128
2129 * test/test_layer.py (TestLayerModification.setUp): Save the
2130 filename as an instance variable so we can refer to it in tests
2131 (TestLayerModification.test_tree_info): Uncomment this method
2132 again and make it work. This tests for the formatting issue
2133 filed in RT#2239 on 2004-01-13
2134
2135 2004-05-28 Bernhard Herzog <[email protected]>
2136
2137 * Thuban/UI/baserenderer.py: Fix some typos.
2138
2139 2004-05-18 Jan-Oliver Wagner <[email protected]>
2140
2141 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2142 by increasing a field size.
2143
2144 2004-05-17 Bernhard Herzog <[email protected]>
2145
2146 Update to newest shapelib and get rid of Thuban specific
2147 extensions, i.e. use the new DBFUpdateHeader instead of our
2148 DBFCommit kludge
2149
2150 * libraries/shapelib/shpopen.c: Update to version from current
2151 shapelib CVS.
2152
2153 * libraries/shapelib/shapefil.h: Update to version from current
2154 shapelib CVS.
2155
2156 * libraries/shapelib/dbfopen.c: Update to version from current
2157 shapelib CVS.
2158 (DBFCommit): Effectively removed since shapelib itself has
2159 DBFUpdateHeader now which is better for what DBFCommit wanted to
2160 achieve.
2161 We're now using an unmodified version of dbfopen.
2162
2163 * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2164 value '1' to the Lib.dbflibc extension. This simply reflects the
2165 shapelib and pyshapelib updates
2166
2167 2004-05-16 Jan-Oliver Wagner <[email protected]>
2168
2169 Finished introduction of Menu.FindOrInsertMenu.
2170
2171 * Extensions/drawshape/drawshape.py: Add the command
2172 to the experimental menu additionally to the toolbar.
2173
2174 * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2175 finding menu on its own.
2176
2177 * Doc/manual/thuban-manual.xml: updated sample file
2178 to use FindOrInsertMenu().
2179
2180 * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2181 instead of finding menu on its own.
2182
2183 2004-05-11 Jan-Oliver Wagner <[email protected]>
2184
2185 * test/test_menu.py (MenuTest.test): Added testing
2186 of method Menu.FindOrInsertMenu.
2187
2188 2004-05-10 Jan-Oliver Wagner <[email protected]>
2189
2190 Introduce and use Menu.FindOrInsertMenu.
2191
2192 * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2193 given menu or, if not found, insert it.
2194
2195 * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2196 /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2197 /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2198 menu on its own.
2199
2200 2004-05-06 Jan-Oliver Wagner <[email protected]>
2201
2202 Introduce a abstract ColorDialog class and remove
2203 and outdated file.
2204
2205 * Thuban/UI/proj4dialog.py: Removed. It is has been
2206 replaced by projdialog for quite a while and is not used
2207 anymore.
2208
2209 * Thuban/UI/colordialog.py: New. Abstraction for color selection
2210 dialog(s).
2211
2212 * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2213 Now calls the abstract ColorDialog instead of wxColourDialog.
2214 This also removed the dependency to Color class conversion
2215 from this function.
2216
2217 2004-05-04 Frank Koormann <[email protected]>
2218
2219 * Extensions/bboxdump/__init__.py: Fixed string left over from
2220 copying.
2221
2222 * Extensions/bboxdump/bboxdump.py (bboxdump):
2223 Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2224 xrange(layer.NumShapes()). Compile the bboxmessage from a list
2225 of formatted outputs (string.join) instead of appending to the
2226 message. Two progress bar dialogs to report progress on the sometimes
2227 lenghty processing.
2228
2229 2004-04-22 Frank Koormann <[email protected]>
2230
2231 New Extension to dump bounding boxes of all shapes of the selected
2232 layer. An optional column can be specified to group the objects,
2233 in this case the bounding box is a union of the separate boxes.
2234 Dump can be displayed in a ScrolledMessageDialog or written to file.
2235 The Extension is simply a combination of available and well tested
2236 Thuban functionality.
2237
2238 * Extensions/bboxdump/__init__.py: New: Init to make this
2239 directory a package.
2240
2241 * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2242 all shapes of the selected layer.
2243
2244 2004-04-22 Jan-Oliver Wagner <[email protected]>
2245
2246 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2247 strings to be i18n now.
2248
2249 2004-04-18 Jan-Oliver Wagner <[email protected]>
2250
2251 Changing popup menu of legend from direct building
2252 to using the Menu construction as used for the mainwindow.
2253
2254 * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2255 layer_to_bottom, layer_visibility
2256 (MainWindow.LayerToTop): New. Put current layer to the top.
2257 (MainWindow.LayerToBottom): New. Put current layer to bottom.
2258 (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2259 Replace 1,0 by True, False.
2260 (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2261 current layer.
2262 (MainWindow.LayerShowTable): Removed raising of dialog.
2263 (_has_selected_layer_visible): New. Support function.
2264
2265 * Thuban/UI/legend.py: ID_POP_xxx: removed.
2266 (LegendPanel.__init__): Removed EVT_MENU bindings.
2267 (LegendTree._OnRightClick): Replace direct creation of
2268 menu via wx Classes by applying the menu definition
2269 as of Menu class of menu.py.
2270
2271 2004-04-16 Jan-Oliver Wagner <[email protected]>
2272
2273 * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2274 button string to stronger clearify that Thuban will be closed when hitting
2275 the button.
2276
2277 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2278 Now for layers without a ShapeStore a corresponding message is given
2279 to the user, that this layer has no table to show.
2280
2281 2004-04-15 Martin Schulze <[email protected]>
2282
2283 * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2284 recalculate the format for the internal render engine as well.
2285
2286 * Extensions/wms/properties.py (wmsProperties): First start for a
2287 properties dialog. It's functional for a first selection of
2288 layers, but still has some weired wxWidgets/GTK problems but
2289 beautification can be done later.
2290
2291 * Extensions/wms/layer.py: Added more documentation
2292 (WMSLayer.getFormats): New: Return list of supported image formats
2293 by the WMS server
2294 (WMSLayer.getLayers): New: Return the list of layer names
2295 supported by the WMS server
2296 (WMSLayer.getLayerTitle): New: Return the title of the named layer
2297 (WMSLayer.getWMSFormat): New: Return the image format that is used
2298 for WMS GetMap requests
2299 (WMSLayer.setWMSFormat): New: Set the image format that is used
2300 for WMS GetMap requests
2301 (WMSLayer.__init__): Move away from using only one layer to using
2302 a list of layers (unsorted at the moment, though).
2303 (WMSLayer.getVisibleLayers): New: Return the list of names for all
2304 visible layers
2305 (WMSLayer.setVisibleLayers): New: Set the list of names for all
2306 visible layers
2307
2308 * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2309 order to establish a clean structure.
2310
2311 * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2312 own in order to establish a clean structure.
2313
2314 2004-04-13 Martin Schulze <[email protected]>
2315
2316 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2317 support for oldstyle (WMS 1.0 apparently) image format
2318 specification.
2319
2320 * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2321 supported graphic formats back to JPEG and BMP, PNG and others are
2322 too *cough* experimental... Sorry, I meant to filter this out
2323 before I committed this part. This should make the WMS extension
2324 run from CVS again.
2325 (wms_dialog): Reset an empty URL to None so that the subsequent
2326 program can depend on this, since the dialog will indeed return an
2327 empty URL, causing another declaration of love by Python.
2328
2329 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2330 Whenever a native BoundingBox request cannot be fulfilled, check
2331 whether the requested SRS is EPSG:3426, in which case return the
2332 LatLonBoundingBox values.
2333
2334 * Extensions/wms/test/test_parser.py
2335 (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2336 ignoring AUTO:* SRS.
2337 (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2338 Added another test method to test whether the LatLonBoundingBox
2339 values will be returned if BoundingBox values are requested with
2340 SRS set to EPSG:3426.
2341
2342 * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2343 Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2344 the moment by placing them into a variable which is currently
2345 unused. Also test whether the EPSG SRS is numerical as it should
2346 be and add an error message if it is not.
2347
2348 * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2349 appear in the real world as well. Since we cannot handle them yet
2350 (OGCLib can't either), we will ignore them for the moment.
2351
2352 * Extensions/wms/parser.py: Use a variable for denoting the sample
2353 filename
2354 (WMSCapabilitiesParser.peekLayers): Added support for error
2355 messages during grok(). They will be aggregated in an array and
2356 may be displayed later. We may have to add a classification
2357 "Warning" and "Error" to this. That requires more experience,
2358 though, since not every error may be lethal.
2359
2360 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2361 ShowTable() dialog/frame when the user attempts to display it
2362 while it has been opened before already and not closed again.
2363
2364 2004-04-11 Martin Schulze <[email protected]>
2365
2366 * Extensions/wms/infodialog.py: Adjusted the class documentation
2367
2368 * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2369 Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2370 wxWidgets variants.
2371 (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2372
2373 * Extensions/wms/infodialog.py: Added an information dialog that
2374 will display various information about the WMS current resource,
2375 so that additional information such as the title, the abstract,
2376 fees and access constraints can be displayed for the user if they
2377 are documented in the WMS XML.
2378
2379 2004-04-10 Martin Schulze <[email protected]>
2380
2381 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2382 string handling. It's "foo".lower() and not lower(foo) without
2383 lower imported from strings or something.
2384
2385 * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2386 from capabilities.py and parser.py. Implement priority list for
2387 supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2388 and GIF are supported here, but not yet by main Thuban. Hence,
2389 support for them may be removed later. Special contribution to
2390 usability: get wxWidgets to change the cursor when we're waiting
2391 for data from the network so the user won't start to worry. This
2392 causes a redrawing error/warning, though.
2393
2394 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2395 the DOM object.
2396
2397 2004-04-01 Martin Schulze <[email protected]>
2398
2399 * Extensions/wms/capabilities.py: Adjusted documentation
2400 (WMSCapabilities.__init__): Improved documentation, fixed syntax
2401 (WMSCapabilities.saveCapabilities): Only catch IOError when
2402 handling files
2403 (WMSCapabilities.loadCapabilities): Only catch IOError when
2404 handling files
2405 __main__: corrected variable naming
2406 (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2407 class a specialisation of WMSCapabilitiesParser as well. Also
2408 execute grok() after loading or fetching capabilities, if that
2409 went well, so that subsequent calls can already access the data.
2410 (WMSCapabilities.getVersion): Export the used version of the
2411 GetCapabilities request, so we can use it for subsequent calls,
2412 i.e. for GetMap requests.
2413 (WMSCapabilities.fetchCapabilities): Added proper error handling
2414 when the GetCapabilities request failed, so that the surrounding
2415 program can act accordingly.
2416
2417 2004-03-30 Martin Schulze <[email protected]>
2418
2419 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2420 Adjusted the getLayerSRS method to return the list of SRSes
2421 extracted from <SRS> elements instead of <BoundingBox> elements.
2422 Added a bit of documentation as well.
2423 (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2424 since it was only implemented due to a misunderstanding.
2425
2426 * Extensions/wms/test/test_parser.py
2427 (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2428 reflect the corrected interpretation of the standard: i.e. a layer
2429 does not have to define a BoundingBox for all SRSes it supports.
2430 Hence the <SRS></SRS> specification is authoritative, not the list
2431 of BoundingBoxes.
2432 (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2433 to ensure None is returned for a non-existing SRS.
2434 (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2435 since it is not applicable anymore. Listing more SRSes in <SRS>
2436 elements is valid according to the specs.
2437
2438 2004-03-26 Bernhard Reiter <[email protected]>
2439
2440 * README: Nicer formatting of text. Improved descriptions.
2441 Reflected wxWidgets name change.
2442
2443 * Thuban/UI/about.py: Extended copyright to 2004 and added
2444 information about the thuban-devel mailinglist.
2445
2446 2004-03-24 Martin Schulze <[email protected]>
2447
2448 * Extensions/wms/capabilities.py: Renamed the class to contain
2449 'WMS', also added a linebreak where required
2450
2451 * Extensions/wms/parser.py: Finally added the XML parser for the
2452 GetCapabilities response.
2453
2454 * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2455 <SRS> elements match the <BoundingBox> elements, except for the
2456 layer 'beschriftung'.
2457
2458 * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2459 since Python uses unicode strings internally, otherwise
2460 comparisons will fail. Removed tests for getLayerBBoxSRS() since
2461 the SRS will be calculated anyway and this method is obsoleted by
2462 getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2463 Move loading the sample file into the setUp method. Added a test
2464 for finding the integrity problem in the sample response.
2465 Improved formatting.
2466
2467 * Extensions/wms/domutils.py: Added convenience routines for
2468 handling of Document Object Model (DOM) nodes.
2469
2470 * Extensions/wms/test/test_domutils.py: Added a test for the
2471 domutils module
2472
2473 2004-03-19 Martin Schulze <[email protected]>
2474
2475 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2476 Moved path detection and adding into a module of its own,
2477 adjustpath, which exports thubandir as main Thuban directory.
2478
2479 * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2480 detection and adding into a module of its own, adjustpath, which
2481 exports thubandir as main Thuban directory. Reorganised the
2482 module in order to support the SkipTest feature for Thuban test
2483 cases.
2484
2485 * Extensions/wms/test/adjustpath.py: Moved path detection and
2486 adding into a module of its own.
2487
2488 2004-03-18 Martin Schulze <[email protected]>
2489
2490 * Extensions/wms/test/test_parser.py: Added another test for
2491 checking whether the WMS XML parser (to be implemented) returns
2492 the information we expect. This requires a sample WMS WML file
2493 (sample.xml) which has been extracted from the frida server and
2494 "improved" manually.
2495
2496 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2497 main Thuban directory to the path in order to be able to import
2498 random modules. Adjusted the PyOGCLib detection to reuse the
2499 information gathered. Also added a note about the PYTHONPATH
2500 environment variable.
2501
2502 * Extensions/wms/test/test_ogclib.py: The format specification is
2503 a mime-type, not a graphic format, hence image/jpeg wou ld be the
2504 proper format and not JPEG. We'll also have to take care of the
2505 encoding of / as %2F.
2506
2507 2004-03-16 Martin Schulze <[email protected]>
2508
2509 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2510 comprehensive test for the getMapURL method, built compare URLs
2511 according to the documentation in OGC 01-068r3
2512
2513 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2514 class WMSCapabilities to manage capabilites, will incorporate
2515 parsing the capabilities response and provide details for other
2516 classes.
2517
2518 2004-03-12 Bernhard Herzog <[email protected]>
2519
2520 Support views in addition to normal tables in the postgis
2521 shapestore
2522
2523 * Thuban/Model/postgisdb.py
2524 (PostGISShapeStore._fetch_table_information): Add a fallback for
2525 the case where the table name is not in the geometry_columns
2526 table. This is usually the case for views. Also, set
2527 self.shapestore here.
2528 (PostGISShapeStore.ShapeType): No need to query the database all
2529 the time. The shape type is now determined in
2530 _fetch_table_information
2531
2532 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2533 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2534 New parameter to specify views.
2535 (PostGISDatabase.has_data): Also compare the views. New views
2536 parameter
2537 (PostGISDatabase.initdb): Create the views.
2538 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2539 view
2540
2541 * test/test_postgis_db.py
2542 (TestPostGISShapestorePointFromViews): New. Test a
2543 PostGISShapeStore with a view
2544 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2545 the geometry_column explicitly to test whether that works
2546
2547 2004-03-12 Bernhard Herzog <[email protected]>
2548
2549 Final step for explicit id/geometry columns: Loading and saving
2550
2551 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
2552 with the following changes:
2553 (dbshapesource): Two new attributes id_column and geometry_column
2554
2555 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2556 (SessionSaver.write_session): Use the new namespace
2557 (SessionSaver.write_data_containers): Write the new dbshapesource
2558 parameters
2559
2560 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2561 the new file format version
2562 (SessionLoader.start_dbshapesource): Handle the new db parameters
2563
2564 * test/test_save.py: Update to the new dtd and namespace
2565 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2566 mock object to provide a working IDColumn method.
2567
2568 * test/test_load_1_0.py: New. Copy of the test_load.py before
2569 today's changes but with the round-trip tests removed.
2570
2571 * test/test_load_0_9.py: Update doc-string.
2572
2573 * test/test_load.py: Update all .thuban files to the new dtd and
2574 namespace.
2575 (TestPostGISLayer.file_contents): Add the new dbshapesource
2576 paramters
2577
2578 2004-03-11 Bernhard Herzog <[email protected]>
2579
2580 Next step for explicit id/geometry columns: User interaction
2581
2582 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
2583 the dialog is constructed. Add combo boxes to select id and
2584 geometry column. Rename some instance variables.
2585 (ChooseDBTableDialog.GetTable): Return id and geometry column
2586 names
2587 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
2588 selections in the table list
2589
2590 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
2591 and geometry_column
2592
2593 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
2594 parameters for id_column and geometry column of PostGISShapeStore
2595 here as well.
2596
2597 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
2598 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
2599 (PostGISConnection.GeometryTables): Use a better query to
2600 determine which relations in the database might be usable for
2601 shapestores. Now supports views as well but is more PostgreSQL
2602 specific
2603 (PostGISConnection.table_columns): New. Somewhat experimental
2604 method to let the db dialogs provide lists of columns to users so
2605 that they can select id and geometry columns.
2606 (PostGISTable.__init__): The default value of the id_column
2607 parameter is now None it still means "gid" effectively, though.
2608 (PostGISTable.IDColumn): New introspection method to return a
2609 column object for the id column
2610 (PostGISShapeStore.GeometryColumn): New introspection method to
2611 return a column object for the geometry column
2612
2613 * test/test_postgis_db.py
2614 (TestPostGISConnection.test_gis_tables_non_empty):
2615 Removed. Subsumed by the new:
2616 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
2617 New. Tes the GeometryTables and table_columns methods with actual
2618 tables and views.
2619 (PointTests.test_id_column, PointTests.test_geometry_column):
2620 New. tests for the new methods.
2621 (TestPostGISShapestorePoint.setUp)
2622 (TestPostGISShapestorePointSRID.setUp)
2623 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
2624 instance variables needed by the new tests
2625
2626 2004-03-11 Bernhard Herzog <[email protected]>
2627
2628 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
2629 numbers given to ReadValue are ordinals.
2630
2631 2004-03-11 Bernhard Herzog <[email protected]>
2632
2633 Elimiate the requirement for PostGIS tables to have a column
2634 called "gid".
2635
2636 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
2637 id_column to specify which column to use to identify rows. Also
2638 new instance variables id_column and quoted_id_column
2639 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
2640 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
2641 (PostGISTable.SimpleQuery): Use the id column name provided to the
2642 constructor instead of "gid"
2643 (PostGISShapeStore.__init__): New parameter id_column analogously
2644 to PostGISTable.__init__. This parameter is simply passed through
2645 to the base class constructor
2646 (PostGISShapeStore._create_col_from_description): Fix typo in
2647 doc-string
2648 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
2649 (PostGISShapeStore.ShapesInRegion): Use the id column name
2650 provided to the constructor instead of "gid"
2651
2652 * test/postgissupport.py
2653 (PostgreSQLServer.get_default_static_data_db): New static table
2654 landmarks_point_id with an id column != "gid. Update the comments
2655 a bit.
2656 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
2657 doc-
2658 (upload_shapefile): New parameter gid_column to use a name other
2659 than "gid" for the column to store the shape ids
2660
2661 * test/test_postgis_db.py (TableTests): New. Mixin-class
2662 containing all tests previously in TestPostGISTable. The actual
2663 tests are the same but the code is a bit more configurable to
2664 allow for different id columns etc.
2665 (TestPostGISTable): Derive from TableTests now for the actual
2666 tests.
2667 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2668 except that it the landmarks_point_id table to test the id_column
2669 parameter
2670 (PointTests): Extend the doc-string
2671 (TestPostGISShapestorePointExplicitGIDColumn)
2672 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2673 from PointTests to test the explicit id_column parameter. One
2674 tests with the name of the column holding the shape ids, the other
2675 uses PostgreSQL's OID column. For the latter a number of methods
2676 have to be overwritten to make them independent of the actual id
2677 values.
2678
2679 2004-03-08 Silke Reimer <[email protected]>
2680
2681 Update debian directory:
2682
2683 * debian/changelog: Added new version.
2684 * deiban/rules: Updated management of patches (with cbds)
2685 * debian/control: Added cbds to dependencies
2686 * debian/patches/*: New. Adds better support for patches of thuban in
2687 debian
2688 * debian/menu: Syntax of menu changed slightly
2689 * debian/setup.py.patch: removed because it has been moved to
2690 debian/patechs/setup.py.patch
2691
2692
2693 2004-02-26 Bernhard Herzog <[email protected]>
2694
2695 Create the Doc/technotes directory for text files with information
2696 for developers
2697
2698 * Doc/technotes/README: New. README for the technotes
2699
2700 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2701 Thuban
2702
2703 * Doc/technotes/release_process.txt: New. Used to be
2704 HOWTO-Release. Now slightly adapted to technote formatting style.
2705
2706 * HOWTO-Release: Removed. It's contents are now in
2707 Doc/technotes/release_process.txt
2708
2709 2004-02-25 Bernhard Herzog <[email protected]>
2710
2711 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2712 version of wxWindows the module was compiled with so we can check
2713 that against the wxPython version.
2714
2715 * Thuban/version.py (thuban_branch, thuban_release): New variables
2716 controlling which and how Thuban versions are shown. See the
2717 comments for details.
2718 (verify_versions): Also check that the wx version that wxproj is
2719 compiled against matches that of the wxPython we use at runtime
2720
2721 2004-02-20 Bernhard Herzog <[email protected]>
2722
2723 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2724 get_system_proj_file to read the epsg projections. The old way
2725 depended on the current directory being the top Thuban directory.
2726
2727 2004-02-20 Bernhard Herzog <[email protected]>
2728
2729 * Extensions/svgexport/test/test_svgmapwriter.py
2730 (TestVirtualDC.test_clippath): Remove a debug print
2731
2732 2004-02-20 Bernhard Herzog <[email protected]>
2733
2734 * Extensions/svgexport/__init__.py: New. Turn
2735 Extensions/svgexport into a package.
2736
2737 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2738 doc-string a bit. The doc-string must come first, otherwise it's
2739 not a doc-string. The __future__ import must be the first thing
2740 after the doc-string. Use only double quotes in doc-strings.
2741 Single quotes trip up emacs syntax highlighting if the text
2742 contains apostrophes.
2743
2744 2004-02-20 Bernhard Herzog <[email protected]>
2745
2746 * Extensions/svgexport/test/__init__.py,
2747 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2748 suite for svgexport
2749
2750 * test/runtests.py (find_test_modules): New. Function with the
2751 module finding code from main.
2752 (main): Use find_test_modules to figure out the default test
2753 modules and take modules from Extensions.svgexport.test too.
2754
2755 2004-02-19 Bernhard Herzog <[email protected]>
2756
2757 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2758 the mainwindow has a reference to the map of the initial session.
2759 This fixes a bug introduced with the fix for RT#2245
2760
2761 2004-02-19 Bernhard Herzog <[email protected]>
2762
2763 * Extensions/svgexport/svgsaver.py,
2764 Extensions/svgexport/svgmapwriter.py,
2765 Extensions/svgexport/maplegend.py: Added again. This time in the
2766 correct place.
2767
2768 2004-02-17 Bernhard Herzog <[email protected]>
2769
2770 Fix for RT#2245
2771
2772 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2773 instance variables before trying to create any windows. Creating
2774 windows can start an event loop if e.g. message boxes are popped
2775 up for some reason, and event handlers, especially EVT_UPDATE_UI
2776 may want to access things from the application.
2777 (ThubanApplication.maps_changed): The mainwindow may not have been
2778 created yet, so check whether it has been created before calling
2779 its methods
2780
2781 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2782 have a map
2783
2784 2004-02-17 Bernhard Herzog <[email protected]>
2785
2786 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2787 Extensions/svgmapwriter.py, Extensions/maplegend.py,
2788 extensions/svgexport/svgsaver.py,
2789 extensions/svgexport/svgmapwriter.py,
2790 extensions/svgexport/maplegend.py: Removed. These files were in
2791 the wrong places or didn't work at all.
2792
2793 2004-02-16 Bernhard Herzog <[email protected]>
2794
2795 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2796 line
2797
2798 2004-02-16 Bernhard Herzog <[email protected]>
2799
2800 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2801
2802 2004-02-15 Markus Rechtien <[email protected]>
2803
2804 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2805 to write a session to a file in SVG format.
2806 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2807 to write a SVG map of a session.
2808 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2809 in SVG format for the current session.
2810
2811 2004-02-13 Bernhard Herzog <[email protected]>
2812
2813 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2814 can't be created, return immediately after displaying the error
2815 message.
2816
2817 2004-02-11 Bernhard Herzog <[email protected]>
2818
2819 Handle postgis tables with more than one geometry column.
2820
2821 * Thuban/Model/postgisdb.py
2822 (PostGISTable._fetch_table_information): Delegate the creation of
2823 column objects to a different method so that we can extend that in
2824 derived classes
2825 (PostGISTable._create_col_from_description): New. Column object
2826 creation part of _fetch_table_information
2827 (PostGISShapeStore._create_col_from_description): New. Extend
2828 inherited method to handle geometry columns
2829 (PostGISShapeStore.__init__): New parameter geometry_column to
2830 specify which geometry column to use. Optional but mandatory for
2831 tables with more than one geometry column
2832 (PostGISShapeStore._fetch_table_information): Also use the name of
2833 the geometry column when looking for the srid
2834 (PostGISShapeStore.ShapeType): Also use the name of the geometry
2835 column when looking for the shape type
2836
2837 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2838 NonConnectionStore to changes in the PostGISShapeStore
2839
2840 * test/test_postgis_db.py
2841 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2842 PostGISShapeStore with tables having two geometry columns.
2843
2844 2004-02-10 Bernhard Herzog <[email protected]>
2845
2846 Fix some postgis problems. What remains to be done is real
2847 handling of SRIDs as they affect how reprojection is done
2848
2849 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2850 doc-string
2851 (PostGISShapeStore._fetch_table_information): New. Extend
2852 inherited method to retrieve srid
2853 (PostGISShapeStore.BoundingBox): Handle tables without data.
2854 extent yields NULL for those
2855 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2856
2857 * test/test_postgis_db.py
2858 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2859 for the special case of a table without any data
2860 (TestPostGISShapestorePointSRID): New class with tests for a table
2861 that uses srids
2862 (PolygonTests): Fix a doc-string typo
2863
2864 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2865 reference_systems with a specification of spacial reference
2866 systems to create in the new db.
2867 (PostgreSQLServer.new_postgis_db)
2868 (PostgreSQLServer.get_static_data_db): New parameter
2869 reference_systems to be passed through ultimately to
2870 PostGISDatabase. In new_postgis_db also check whether an existing
2871 db already has the right srids
2872 (PostgreSQLServer.get_default_static_data_db): Add srids and a
2873 table that uses srids
2874 (PostGISDatabase.initdb): Create the entries for the reference
2875 systems
2876 (PostGISDatabase.has_data): Add reference_systems parameter to
2877 check for those too
2878 (upload_shapefile): New parameter srid to create tables with a
2879 specific srid
2880
2881 2004-02-06 Frank Koormann <[email protected]>
2882
2883 * po/pt_BR.po: Fixed charset
2884
2885 2004-02-05 Frank Koormann <[email protected]>
2886
2887 * po/pt_BR.po: Fixed format string for error message, missing %s
2888 added (Thuban/UI/application.py:273)
2889
2890 2004-02-03 Frank Koormann <[email protected]>
2891
2892 First version of Portuguese (Brazilian) translation
2893
2894 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2895 Brazilian Portuguese by Eduardo Patto Kanegae.
2896
2897 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2898 translators.
2899
2900
2901 2004-01-22 Frank Koormann <[email protected]>
2902
2903 * Doc/manual/thuban-manual.xml: Added section on installation of
2904 Thuban under Win32 systems. Fixed image path references in the postgis
2905 section. Some minor source formattings.
2906
2907 2004-01-21 Frank Koormann <[email protected]>
2908
2909 Make Thuban remember path selections (at least for one application run).
2910
2911 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2912 attribute of application object. Path is a dictionary of
2913 strings, currently with the items "data" and "projection".
2914 (Application.SetPath): New, stores path for the specified item.
2915 (Application.Path): New, return path for the specified item.
2916
2917 * Thuban/UI/mainwindow.py
2918 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2919 MainWindow.AddLayer, MainWindow.AddRasterLayer,
2920 MainWindow.TableOpen): Access "data" path information of the
2921 application.
2922
2923 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2924 Access "projection" path information of the application.
2925
2926 2004-01-05 Bernhard Herzog <[email protected]>
2927
2928 * po/ru.po: Updated translations from Alex Shevlakov
2929
2930 2004-01-05 Bernhard Herzog <[email protected]>
2931
2932 * po/Makefile, po/README: Move the description of how to generate
2933 the translation statistics to the README.
2934
2935 2003-12-23 Bernhard Herzog <[email protected]>
2936
2937 * NEWS: Update for 1.0.0
2938
2939 * po/it.po: Another update from Maurizio Napolitano
2940
2941 2003-12-23 Bernhard Herzog <[email protected]>
2942
2943 * po/it.po: Updated translation from Maurizio Napolitano
2944
2945 2003-12-23 Bernhard Herzog <[email protected]>
2946
2947 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2948 for translation
2949
2950 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2951 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2952 strings for translation
2953
2954 * po/de.po: Update with the newly marked strings.
2955
2956 2003-12-22 Bernhard Herzog <[email protected]>
2957
2958 * HOWTO-Release: Fix the places where version numbers have to be
2959 updated
2960
2961 2003-12-22 Bernhard Herzog <[email protected]>
2962
2963 * setup.py (setup call): 1.0.0, yeah!
2964
2965 * Thuban/version.py (longversion): 1.0.0, yeah!
2966
2967 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2968 1.0.0 namespace too
2969
2970 * Thuban/Model/save.py (SessionSaver.write_session): Save with
2971 1.0.0 namespace
2972
2973 * test/test_load.py (LoadSessionTest.dtd)
2974 (TestSingleLayer.file_contents)
2975 (TestNonAsciiColumnName.file_contents)
2976 (TestLayerVisibility.file_contents)
2977 (TestClassification.file_contents, TestLabels.file_contents)
2978 (TestLayerProjection.file_contents)
2979 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2980 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2981 (TestPostGISLayerPassword.file_contents)
2982 (TestLoadError.file_contents, TestLoadError.test): Update for
2983 1.0.0 namespace
2984
2985 * test/test_save.py (SaveSessionTest.dtd)
2986 (SaveSessionTest.testEmptySession)
2987 (SaveSessionTest.testSingleLayer)
2988 (SaveSessionTest.testLayerProjection)
2989 (SaveSessionTest.testRasterLayer)
2990 (SaveSessionTest.testClassifiedLayer)
2991 (SaveSessionTest.test_dbf_table)
2992 (SaveSessionTest.test_joined_table)
2993 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2994
2995 2003-12-22 Bernhard Herzog <[email protected]>
2996
2997 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2998 alignment flags are byte strings not unicode and that they have
2999 valid values
3000
3001 * test/test_load.py (TestLabelLayer): New. Test loading (and
3002 indirectly saving) of maps with labels.
3003
3004 2003-12-22 Bernhard Herzog <[email protected]>
3005
3006 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3007 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3008 unsubscribe all subscribers.
3009 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3010 self.grid since it may already have been destroyed.
3011 Fixes RT #2256
3012
3013 2003-12-19 Bernhard Herzog <[email protected]>
3014
3015 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3016
3017 2003-12-16 Bernhard Herzog <[email protected]>
3018
3019 * debian/bitmappath.patch, debian/setup.py.patch:
3020 added to ensure compliance with FHS for debian
3021 * debian/rules, debian/changelog:
3022 added patches in rules to ensure compliance with FHS for debian
3023
3024 2003-12-16 Bernhard Herzog <[email protected]>
3025
3026 * po/Makefile (mo): Make the output a bit nicer so that it prints
3027 statistics about the translations. Add a comment how produce even
3028 nicer statistics with sed.
3029
3030 2003-12-09 Frank Koormann <[email protected]>
3031
3032 * Resources/Projections/defaults.proj:
3033 French projection sample with correct accents (UNICODE).
3034
3035 2003-12-05 Bernhard Herzog <[email protected]>
3036
3037 * MANIFEST.in: Add the devtools directory
3038
3039 * setup.py (setup call): Use license instead of licence. This
3040 silences a deprecation warning on Python 2.3
3041
3042 2003-12-05 Frank Koormann <[email protected]>
3043
3044 Documentation synced with 1.0rc1
3045
3046 * Doc/manual/thuban-manual.xml:
3047 Minor formatting changes and references to database layers .
3048 Introduction.Internationalization: New section on i18n.
3049 MapManagement.AddingandRemovingLayers: Added item on database layers.
3050 MapManagement.TheLegend: Added section and screenshot on popup menu.
3051 ProjectionManagement: Updated screenshot and sentence on EPSG.
3052 Appendix.SupportedDataSources: Added PostGIS.
3053 Appendix.WorkingwithPostGIS: New section.
3054
3055 * Doc/manual/images/6_projection.png: Updated screenshot including
3056 EPSG checkboxes.
3057
3058 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3059
3060 * Doc/manual/images/app_postgis_add_layer.png,
3061 Doc/manual/images/app_postgis_db_add.png,
3062 Doc/manual/images/app_postgis_db_management.png:
3063 New screenshots focussing on database layers
3064
3065 2003-12-05 Frank Koormann <[email protected]>
3066
3067 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3068 write warning to stderr instead of rising a warning dialog
3069
3070 2003-12-03 Bernhard Herzog <[email protected]>
3071
3072 Fix for RT #2243
3073
3074 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3075 New. Like has_selected_layer but for shape layers only
3076 (_has_selected_shape_layer): New. Like _has_selected_layer but for
3077 shape layers only
3078 (layer_show_table command, layer_jointable command): Use these
3079 commands should only be available for shape layers
3080
3081 2003-12-03 Bernhard Herzog <[email protected]>
3082
3083 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3084 publishers that are wx objects and may have been destroyed by wx
3085 already. Fixes RT #2242.
3086
3087 2003-12-03 Bernhard Herzog <[email protected]>
3088
3089 * po/ru.po: Updates from Alex Shevlakov
3090
3091 2003-12-03 Silke Reimer <silkeintevation.de>
3092
3093 * debian/control, debian/changelog: Added gdal-support to
3094 debian package, updated to new thuban version
3095
3096
3097 2003-12-03 Bernhard Herzog <[email protected]>
3098
3099 * Thuban/Lib/version.py: New. Module for version number
3100 manipulations. The version of make_tuple here also deals better
3101 with more unusual version number strings, such as e.g.
3102 "1.2+cvs20031111"
3103
3104 * Thuban/version.py (make_tuple): Removed. It's now in
3105 Thuban.Lib.version. Use that implementation instead.
3106
3107 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3108
3109 2003-12-02 Bernhard Herzog <[email protected]>
3110
3111 * MANIFEST.in: Add debian files
3112
3113 * setup.py (setup call): Add packages for the Extensions so that
3114 they're installed too
3115 (data_files): Add READMEs and sample data from some Extensions
3116
3117 * NEWS: Add note about the extensions in binary packages
3118
3119 2003-12-02 Bernhard Herzog <[email protected]>
3120
3121 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3122 with the thuban-1.0rc1
3123
3124 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3125 thuban-1.0rc1 namespace too
3126
3127 * test/test_save.py (SaveSessionTest.dtd)
3128 (SaveSessionTest.testEmptySession)
3129 (SaveSessionTest.testSingleLayer)
3130 (SaveSessionTest.testLayerProjection)
3131 (SaveSessionTest.testRasterLayer)
3132 (SaveSessionTest.testClassifiedLayer)
3133 (SaveSessionTest.test_dbf_table)
3134 (SaveSessionTest.test_joined_table)
3135 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3136 namespace
3137
3138 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3139 namespace
3140 (TestSingleLayer.file_contents)
3141 (TestNonAsciiColumnName.file_contents)
3142 (TestLayerVisibility.file_contents)
3143 (TestClassification.file_contents, TestLabels.file_contents)
3144 (TestLayerProjection.file_contents)
3145 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3146 (TestPostGISLayer.file_contents)
3147 (TestPostGISLayerPassword.file_contents)
3148 (TestLoadError.file_contents, TestLoadError.test): Update to
3149 thuban-1.0rc1 namespace
3150
3151 2003-12-01 Bernhard Herzog <[email protected]>
3152
3153 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3154 nt to better match Intevation's current w32 setup
3155
3156 * HOWTO-Release: Add note about updating MANIFEST.in
3157
3158 * MANIFEST.in: Add the Extensions
3159
3160 * NEWS: Update for 1.0rc1
3161
3162 2003-12-01 Bernhard Herzog <[email protected]>
3163
3164 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3165 cards for the dialog so that shapefiles ending in all uppercase
3166 SHP are listed too
3167
3168 2003-11-28 Bernhard Herzog <[email protected]>
3169
3170 * Thuban/version.py (longversion): Update to 1.0rc1
3171
3172 * setup.py (setup call): Update version to 1.0rc1. Use the
3173 [email protected] email address as author email instead of my
3174 personal one.
3175
3176 2003-11-28 Bernhard Herzog <[email protected]>
3177
3178 * po/de.po: Update german translation.
3179
3180 2003-11-28 Bernhard Herzog <[email protected]>
3181
3182 Unify the filenames stored in .thuban files so that the .thuban
3183 files are more platform independend
3184
3185 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3186 that they can be used on both windows and unix
3187 (SessionSaver.prepare_filename): New. Handle all filename
3188 transformations for filenames stored in the thuban file
3189 (SessionSaver.write_data_containers, SessionSaver.write_layer):
3190 Use prepare_filename
3191
3192 * test/test_save.py (SaveSessionTest.testSingleLayer)
3193 (SaveSessionTest.testLayerProjection)
3194 (SaveSessionTest.testRasterLayer)
3195 (SaveSessionTest.testClassifiedLayer)
3196 (SaveSessionTest.test_dbf_table)
3197 (SaveSessionTest.test_joined_table): Filenames are always stored
3198 with slashes on all currently supported platforms so adapt all
3199 tests to this
3200
3201 * test/test_load.py (LoadSessionTest.filenames): With the new
3202 filename scheme the filenames in the tests should be
3203 understandable on all currently supported platforms so we turn
3204 this into an empty list because we don't have to normalize them
3205 anymore
3206
3207 2003-11-28 Bernhard Herzog <[email protected]>
3208
3209 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3210 Add the ellipsoid to the projection since some Proj versions
3211 complain if it's missing.
3212
3213 2003-11-27 Bernhard Herzog <[email protected]>
3214
3215 Corect some bounding box projection problems
3216
3217 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3218 version of ForwardBBox
3219 (Projection._transform_bbox): New. common implementation of
3220 ForwardBBox and InverseBBox
3221 (Projection.ForwardBBox): Use _transform_bbox.
3222
3223 * test/test_proj.py (TestProjection.test): Add test for
3224 InverseBBox
3225
3226 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3227 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3228 new InverseBBox method to determine the unprojected bounding box
3229 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3230 bbox.
3231
3232 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3233 Removed.
3234 (TestLayer.test_arc_layer_with_projection): New. This test is
3235 better able to test whether bounding boxes are projected correctly
3236 than test_point_layer_with_projection
3237
3238 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3239 InverseBBox to unproject bboxes
3240
3241 2003-11-25 Bernhard Herzog <[email protected]>
3242
3243 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3244 source code.
3245
3246 2003-11-25 Bernhard Herzog <[email protected]>
3247
3248 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3249 there for backwards compatibility and all code relying on that
3250 should have been updated by now.
3251
3252 2003-11-25 Bernhard Herzog <[email protected]>
3253
3254 * test/test_load.py (TestClassification.test): Add the missing
3255 round trip test.
3256 (TestClassification.file_contents): Update to the newest file
3257 format
3258
3259 2003-11-25 Bernhard Herzog <[email protected]>
3260
3261 Add very experimental (and possibly dangerous) extension to draw
3262 polygons:
3263
3264 * Extensions/drawshape/README: New. Brief installation
3265 instructions
3266
3267 * Extensions/drawshape/drawshape.py: New. Implementation of the
3268 drawshape extensions
3269
3270 * Extensions/drawshape/patch.diff: Patch to apply before the
3271 extension can be used.
3272
3273 2003-11-24 Bernhard Herzog <[email protected]>
3274
3275 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3276 (ShapefileStore.__init__): Factor opening the shapefile into a
3277 separate method (the new _open_shapefile). This makes the code a
3278 bit more readable but the real reason is that it makes some evil
3279 hacks easier. :-)
3280
3281 2003-11-24 Bernhard Herzog <[email protected]>
3282
3283 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3284 converter is specified for an attribute assume it's a string
3285 containing only Latin1 characters. Update doc-string accordingly.
3286 This change should fix many places where unicode objects might
3287 accidentally enter Thuban.
3288
3289 * test/test_load.py (TestNonAsciiColumnName): New test to check
3290 what happens with column names in DBF files that contain non-ascii
3291 characters
3292
3293 2003-11-21 Bernhard Herzog <[email protected]>
3294
3295 Enable the experimental attribute editing again and introduce a
3296 command line switch to actually activate it
3297
3298 * Thuban/UI/main.py (options): New. Container for options set on
3299 the commmand line
3300 (main): Add the --enable-attribute-editing flag.
3301
3302 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3303 editing is enabled use the grid ctrl which allows editing of the
3304 values
3305
3306 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3307 New. Just delegate this to the underlying table.
3308
3309 2003-11-20 Bernhard Herzog <[email protected]>
3310
3311 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3312 Skip this test if run under non-posix systems since it only works
3313 there
3314
3315 2003-11-19 Bernhard Herzog <[email protected]>
3316
3317 * Thuban/Model/resource.py: Rework the way gdal support is
3318 determined so that we can give a reason in the about why gdal is
3319 not supported.
3320 (gdal_support_status): New. Variable holding a string with the
3321 reason for no gdal support
3322
3323 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3324 not supported to the message
3325
3326 2003-11-19 Bernhard Herzog <[email protected]>
3327
3328 Remove the old table interface and its test cases
3329
3330 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3331 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3332 anymore
3333
3334 * Thuban/Model/transientdb.py (TransientTableBase)
3335 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3336 anymore
3337
3338 * test/test_table.py: Removed since the old interface it tests is
3339 gone.
3340
3341 * test/runtests.py (main): The old table interface is gone and
3342 with it the deprecation warnings so remove the code that turns
3343 these warnings into errors
3344
3345 2003-11-19 Bernhard Herzog <[email protected]>
3346
3347 * test/test_table.py: Revert to revision 1.5 again. Changing the
3348 tests to use the new table interface is completely wrong since the
3349 whole purpose of the tests in this module is to test the old
3350 interface.
3351
3352 2003-11-18 Bernhard Herzog <[email protected]>
3353
3354 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3355 New. Test whether the connection matches a set of connection
3356 parameters
3357
3358 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3359 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3360 for existing connections with the same parameters and break out of
3361 the loop correctly.
3362
3363 * test/test_postgis_db.py (TestBriefDescription)
3364 (TestPostGISSimple.test_brief_description): Rename
3365 TestBriefDescription to TestPostGISSimple and the test method to
3366 test_brief_description so that we can add more test methods.
3367 (TestPostGISSimple.test_matches_parameters): New. Test the new
3368 MatchesParameters method
3369
3370 2003-11-18 Bernhard Herzog <[email protected]>
3371
3372 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3373 _was_destroyed, to indicate whether an publisher instance has
3374 already been destroyed.
3375 (Publisher.Unsubscribe): Only disconnect if the publisher has not
3376 been destroyed yet.
3377 (Publisher.Destroy): Set the _was_destroyed flag to true.
3378
3379 * test/test_connector.py
3380 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3381 calling Unsubscribe after Destroy doesn't raise an exception
3382
3383 2003-11-14 Bernhard Herzog <[email protected]>
3384
3385 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3386 typo in doc-string
3387
3388 2003-11-13 Bernhard Herzog <[email protected]>
3389
3390 Quote table and column names properly for postgis.
3391
3392 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3393 quote an identifier for use in an sql statement
3394 (PostGISColumn.__init__): Add the quoted_name attribute
3395 (PostGISTable.__init__): New instance variable quoted_tablename
3396 (PostGISTable._fetch_table_information): Use the quoted table
3397 name. New isntance variable quoted_geo_col with a quoted version
3398 of geometry_column
3399 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3400 (PostGISTable.RowOrdinalToId): Use the quoted table name
3401 (PostGISTable.ReadValue, PostGISTable.ValueRange)
3402 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3403 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3404 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3405 Use quoted table and column names
3406
3407 * test/test_postgis_db.py (TestPostGISSpecialCases)
3408 (TestPostGISIgnoredColumns): Rename the class to
3409 TestPostGISSpecialCases because that better describes the new
3410 cases
3411 (TestPostGISSpecialCases.test_unsupported_types)
3412 (TestPostGISSpecialCases.test): Rename the method to
3413 test_unsupported_types because we need a more descriptive name now
3414 that there are more methods
3415 (TestPostGISSpecialCases.test_table_name_quoting)
3416 (TestPostGISSpecialCases.test_column_name_quoting)
3417 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3418 cases to test quoting of table and column names in PostGISTable
3419 and PostGISShapeStore
3420
3421 * test/postgissupport.py
3422 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3423 AddGeometryColumn desn't support table or column names with sapces
3424 or double quotes
3425
3426 2003-11-12 Jan-Oliver Wagner <[email protected]>
3427
3428 * Extensions/wms/__init__.py: New: Init to make this
3429 directory a package.
3430
3431 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3432
3433 2003-11-11 Bernhard Herzog <[email protected]>
3434
3435 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3436 Constant for the file woth deprecated epsg projections
3437 (get_system_proj_file): Update doc-string
3438
3439 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3440 above the EPS widgets, introduce a check box for the deprecated
3441 eps projections and a label for the epsg widgets
3442 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3443 too
3444
3445 2003-11-11 Bernhard Herzog <[email protected]>
3446
3447 Avoid warnings when run under Python 2.3
3448
3449 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3450 (BaseRenderer.draw_label_layer): Coordinates must be ints.
3451
3452 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3453 real method so that we can convert to int.
3454 (MapRenderer.label_font): The font size mist be an int.
3455
3456 * Thuban/UI/common.py (Color2wxColour): The color values must be
3457 ints. Also, remove the unnecessary asserts.
3458
3459 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3460 (TestUnicodeStrings.test): Python source code should not contain
3461 non-ascii characters unless an encoding is specified in the file.
3462 Therefore use \x escapes in the string literals for non-ascii
3463 characters.
3464
3465 2003-11-11 Bernhard Herzog <[email protected]>
3466
3467 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3468 parameter so that this function can be used for all proj files in
3469 Resource/Projections
3470 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3471 get_system_proj_file
3472
3473 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3474 ProjFile self.__sysProjFile use a dictionary of system ProjFile
3475 objects self._sys_proj_files
3476 (ProjFrame.build_dialog): Adapt to the new changes in the
3477 ProjectionList constructor. Add a check button to toggle whether
3478 EPSG projections are shown
3479 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3480 events.
3481 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3482 the busy cursor if the files have not yet been loaded by the
3483 dialog.
3484 (ProjFrame.load_system_proj): Add a parameter for the name of the
3485 proj file. Maintain the dictionary of system projections
3486 self._sys_proj_files
3487
3488 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3489 user_projs parameters into one parameter proj_files which is a
3490 list of proj files.
3491 (ProjectionList._subscribe_proj_files)
3492 (ProjectionList._unsubscribe_proj_files): New. Move
3493 subscription/unsubscription of projfile messages to separate
3494 methods
3495 (ProjectionList.Destroy): The unsubscribe is now done in
3496 _unsubscribe_proj_files
3497 (ProjectionList.update_projections): We now have a list of proj
3498 file objects
3499 (ProjectionList.SetProjFiles): New method to set a new list of
3500 proj file objects
3501
3502 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3503 Specify explicitly which system proj file to load.
3504
3505 2003-11-11 Bernhard Herzog <[email protected]>
3506
3507 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3508 instance variables to cut cyclic references. The GC would have
3509 collected the loader eventually but it can happen that it doesn't
3510 run at all until thuban is closed (2.3 but not 2.2 tries a bit
3511 harder and forces a collection when the interpreter terminates)
3512 (load_session): Call the handler's Destroy method to make sure
3513 that it gets garbage collected early. Otherwise it will be
3514 collected very late if at all and it holds some references to e.g.
3515 shapestores and the session which can lead to leaks (of e.g. the
3516 temporary files)
3517
3518 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3519 resource leak in load_session
3520
3521 2003-11-10 Bernhard Herzog <[email protected]>
3522
3523 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3524 extensions are to be rendered.
3525 (_renderer_extensions): New. List with renderer for layers in
3526 extensions
3527 (add_renderer_extension): New. Add a renderer extension
3528 (init_renderer_extensions): New. Init the renderer extensions
3529 (BaseRenderer.render_map_incrementally): Search
3530 _renderer_extensions for how to draw unknown layer types
3531 (BaseRenderer.draw_raster_data): Add format parameter so that
3532 formats other than BMP can be drawn
3533 (BaseRenderer.draw_raster_layer): Pass an explicit format to
3534 draw_raster_data
3535
3536 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3537 strings of the format parameter of draw_raster_data method to wx
3538 constants
3539 (MapRenderer.draw_raster_data): Add the format parameter and use
3540 raster_format_map to map it to the right wxwindows constant for
3541 wxImageFromStream
3542
3543 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3544 the format parameter and record it
3545 (TestBaseRenderer.test_raster_no_projection): check the format
3546 paramter of the draw_raster_data method
3547 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3548 extension facility
3549
3550 2003-11-07 Bernhard Herzog <[email protected]>
3551
3552 Tweak the usage of the sqlite database to make common use cases
3553 more responsive. In most cases copying the data to the sqlite
3554 database takes so long that using sqlite doesn't have enough
3555 advantages.
3556
3557 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3558 comments about performance and query the min and max in separate
3559 statements because only that way will indexes be used.
3560 (TransientTableBase.UniqueValues): Add some comments about
3561 performance.
3562 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3563 Do not copy the data to the transient DB but use the transient
3564 copy if it exists. See the new comments for the performance trade
3565 offs
3566
3567 * test/test_transientdb.py
3568 (TestTransientTable.test_auto_transient_table): Make sure that the
3569 data is copied to the transient database at some point.
3570
3571 2003-11-03 Bernhard Herzog <[email protected]>
3572
3573 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
3574 globals to locals so that it's a bit faster
3575
3576 2003-11-03 Bernhard Herzog <[email protected]>
3577
3578 * Thuban/UI/baserenderer.py
3579 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
3580 method. ReadValue is faster than ReadRowAsDict since it only reads
3581 one cell especially now that the dbf file objects actually
3582 implement it.
3583
3584 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
3585 read_attribute method of the dbf objects
3586
3587 2003-11-03 Bernhard Herzog <[email protected]>
3588
3589 * Extensions/profiling/profiling.py (popup_dialog_box): New config
3590 variable to indicate whether the result should be shown in a
3591 dialog box
3592 (profile_screen_renderer, time_screen_renderer): Only show a
3593 dialog box if popup_dialog_box is true.
3594 (profile_screen_renderer): Flush stdout after the printing the
3595 first part of the "profiling..." message
3596
3597 * Thuban/UI/baserenderer.py
3598 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
3599 brushes for the groups so that they're not created over and over
3600 again
3601
3602 * Thuban/Model/classification.py (Classification.__getattr__)
3603 (Classification._compile_classification)
3604 (Classification._clear_compiled_classification): New. Methods to
3605 manage a 'compiled' representation of the classification groups
3606 which is created on demand
3607 (Classification.InsertGroup, Classification.RemoveGroup)
3608 (Classification.ReplaceGroup): reset the compiled representation
3609 (Classification.FindGroup): Use the compiled representation to
3610 find the matching group
3611 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
3612
3613 2003-10-31 Bernhard Herzog <[email protected]>
3614
3615 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
3616 Send a CLASS_CHANGED message
3617 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
3618 not return the removed group since it wasn't used.
3619
3620 * test/test_classification.py
3621 (TestClassification.test_set_default_group): New. Test the
3622 SetDefaultGroup method
3623 (TestClassification.test_insert_group): New. Test the InsertGroup
3624 method
3625 (TestClassification.test_remove_group): New. Test the RemoveGroup
3626 method
3627 (TestClassification.test_replace_group): New. Test the
3628 ReplaceGroup method
3629
3630 2003-10-31 Bernhard Herzog <[email protected]>
3631
3632 * test/test_classification.py (TestClassification.setUp):
3633 Subscribe to the CLASS_CHANGED messages
3634 (TestClassification.tearDown): New. Destroy the classification
3635 properly
3636 (TestClassification.test_defaults): Add tests for the default line
3637 width and whether no messages were sent yet
3638 (TestClassification.test_set_default_properties): Add tests for
3639 messages and setting the default line width
3640 (TestClassification.test_add_singleton)
3641 (TestClassification.test_add_range)
3642 (TestClassification.test_multiple_groups): Add tests for messages
3643
3644 2003-10-31 Bernhard Herzog <[email protected]>
3645
3646 Some more refactoring in preparation for new tests:
3647
3648 * test/test_classification.py (TestClassification.setUp): New.
3649 Instantiate the classification here. Update the test methods
3650 accordingly.
3651 (TestClassification.test_multiple_groups): Make sure that the two
3652 singletons matching 1 are considered different.
3653
3654 2003-10-31 Bernhard Herzog <[email protected]>
3655
3656 * test/test_classification.py (red, green, blue): New. These
3657 constants were used in several cases. Update the relevant methods.
3658 (TestClassification.test_defaults)
3659 (TestClassification.test_set_default_properties)
3660 (TestClassification.test_add_singleton)
3661 (TestClassification.test_add_range)
3662 (TestClassification.test_multiple_groups)
3663 (TestClassification.test_deepcopy): New. These were formerly all
3664 part of the single method test.
3665 (TestClassification.test_deepcopy): Removed.
3666 (TestClassIterator): Removed. The test case is now a method of
3667 TestClassification since it tests part of the public interface of
3668 Classification
3669 (TestClassification.test_iterator): New. Used to be
3670 TestClassIterator effectively
3671
3672 2003-10-31 Jan-Oliver Wagner <[email protected]>
3673
3674 GUIfied the functions of the profiling extension.
3675
3676 * /Extensions/profiling/__init__.py: New: Init to make this
3677 directory a package.
3678
3679 * Extensions/profiling/profiling.py: Moved menu entries to
3680 the Extensions menu. Applied _() for strings.
3681 (profile_screen_renderer): Catch the detailed printout and present
3682 it in a dialog.
3683 (time_screen_renderer): Raise a dialog to present the result instead
3684 of printing it to stdout.
3685
3686 2003-10-31 Bernhard Herzog <[email protected]>
3687
3688 * test/test_classification.py (TestClassGroupProperties)
3689 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3690 (TestClassGroupSingleton, TestClassIterator, TestClassification):
3691 Split TestClassification into several classes, one for each class
3692 being tested. TestClassification itself now only tests
3693 Classification. This split makes changes to the tests a bit easier
3694
3695 2003-10-31 Bernhard Herzog <[email protected]>
3696
3697 * Extensions/profiling/profiling.py: New. Extension to measure
3698 Thuban performance
3699
3700 2003-10-31 Frank Koormann <[email protected]>
3701
3702 Added two items to legend popup menu: Remove Layer and Show Layer Table
3703
3704 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3705 LegendPanel._OnShowTable): New event handlers, call the corresponding
3706 mainwindow methods.
3707 (LegendTree._OnRightClick): Added items to popup menu.
3708
3709 2003-10-30 Bernhard Herzog <[email protected]>
3710
3711 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3712 EVT_WINDOW_DESTROY
3713 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3714 nothing but is convenient for the derived classes.
3715
3716 * Thuban/UI/tableview.py
3717 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3718 Unsubscribe the messages here not in OnClose because that might
3719 get called multiple times. Fixes RT #2196
3720 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3721 anymore.
3722
3723 * README: Update the minimum requirement for wxPython. Since we
3724 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3725 the version in which that was introduced for all platforms
3726
3727 2003-10-30 Frank Koormann <[email protected]>
3728
3729 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3730 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3731 frame.
3732
3733 2003-10-30 Jan-Oliver Wagner <[email protected]>
3734
3735 Improved APR import extension, added further EPSG definitions
3736 and some cleanup regarding string class.
3737
3738 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3739 Added test for alias 'longlat'.
3740
3741 * Resources/Projections/epsg-deprecated.proj: New. Contains
3742 deprecated EPSG definitions.
3743
3744 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3745 the variable names for objects.
3746
3747 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3748 Copied from importAPR and provided with documentation.
3749
3750 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3751 Moved to apr.py.
3752 (APR_View): Added object ref 'ITheme'.
3753
3754 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3755 split function by corresponding use of the string class method.
3756
3757 * Thuban/Model/xmlwriter.py: Replaced string replace function by
3758 corresponding string method.
3759
3760 2003-10-29 Bernhard Herzog <[email protected]>
3761
3762 * Thuban/UI/baserenderer.py
3763 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3764 special case of a classification that only has the default group
3765
3766 2003-10-27 Bernhard Herzog <[email protected]>
3767
3768 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3769
3770 * po/de.po: Update.
3771
3772 * Thuban/UI/application.py
3773 (ThubanApplication.ShowExceptionDialog): Handle translation of the
3774 dialog message properly
3775
3776 2003-10-27 Bernhard Herzog <[email protected]>
3777
3778 Rework how localization works so that we use wx's translation
3779 functions when running Thuban as a normal application but not when
3780 we don't need any UI, such as in the test suite. See the comment
3781 in Thuban/__init__.py for details
3782
3783 * Thuban/__init__.py (_): Add one level of indirection to make the
3784 translation handling more flexible and to make it possible to use
3785 either wx's translation services or not.
3786 (gettext_identity, translation_function_installed)
3787 (install_translation_function): New function to help with this
3788
3789 * Thuban/UI/__init__.py: Install the wx specific translation
3790 function if it's OK to do that
3791
3792 * test/support.py (initthuban): Install a dummy translation
3793 function so that importing Thuban.UI doesn't install a wx specific
3794 one for which would need to import wxPython
3795
3796 2003-10-27 Bernhard Herzog <[email protected]>
3797
3798 * HOWTO-Release: Source archives should be created first and the
3799 binary packages should be created from the source archives.
3800 There's an official debian package now so there's no need to test
3801 the rpm on debian anymore
3802
3803 2003-10-27 Bernhard Herzog <[email protected]>
3804
3805 Several rendering changes:
3806
3807 - Render the selection into a separate bitmap so that only that
3808 bitmap needs to be redrawn when the selection changes
3809
3810 - Render incrementally showing previews and allowing interaction
3811 before rendering is complete
3812
3813 - Update the renderer interface a bit. Most parameters of
3814 RenderMap are now parameters of the constructor
3815
3816 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3817 and the update region as parameters. Update the doc-string
3818 (BaseRenderer.render_map_incrementally): New. Generator function
3819 to renders the map incrementally
3820 (BaseRenderer.render_map): Remove the map argument (it's now in
3821 the constructor) and simply iterate over the
3822 render_map_incrementally generator to draw the map.
3823 (BaseRenderer.draw_shape_layer_incrementally)
3824 (BaseRenderer.draw_shape_layer): Renamed to
3825 draw_shape_layer_incrementally and changed into a generator that
3826 yields True every 500 shapes. Used by render_map_incrementally to
3827 render shape layers incrementally
3828
3829 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3830 map and region parameters which are now in the constructor
3831 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3832 the inherited render_map_incrementally.
3833 (BaseRenderer.draw_shape_layer): Removed.
3834 (ScreenRenderer.draw_selection_incrementally): New. The selection
3835 drawing part of the removed draw_shape_layer as a generator
3836 (ScreenRenderer.layer_shapes): Update because of the region
3837 parameter change
3838 (ExportRenderer.__init__): New. Extend the inherited constructor
3839 with the destination region for the drawing
3840 (ExportRenderer.RenderMap): Removed the map and region parameters
3841 which are now in the constructor
3842
3843 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3844 bitmap suitable for a preview in a tool
3845 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3846 bitmap
3847 (MapPrintout.draw_on_dc): Adapt to new renderer interface
3848 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3849 exists
3850 (MapCanvas.OnIdle): Update the logic to deal with incremental
3851 rendering and the selection bitmap
3852 (MapCanvas._do_redraw): Handle the instantiation of the render
3853 iterator and the redraws during rendering
3854 (MapCanvas._render_iterator): New. Generator to incrementally
3855 redraw both bitmaps
3856 (MapCanvas.Export): Adapt to new renderer interface.
3857 (MapCanvas.full_redraw): Reset the selection bitmap and the
3858 renderer iterator too
3859 (MapCanvas.redraw_selection): New. Force a redraw of the selection
3860 bitmap
3861 (MapCanvas.shape_selected): Only redraw the selection bitmap
3862
3863 * test/test_baserenderer.py
3864 (TestBaseRenderer.test_polygon_no_projection)
3865 (TestBaseRenderer.test_raster_no_projection)
3866 (TestBaseRenderer.test_point_map_projection)
3867 (TestBaseRenderer.test_point_layer_and_map_projection)
3868 (TestBaseRenderer.test_point_layer_projection)
3869 (TestBaseRenderer.test_point_with_classification): Adapt to new
3870 renderer interface
3871
3872 2003-10-24 Bernhard Herzog <[email protected]>
3873
3874 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3875 (point_in_polygon_shape, shape_centroid): Raise an exception if
3876 the shape can't be read. Previously invalid shape ids would lead
3877 to a segfault.
3878
3879 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3880 New. test whether an exception is raised for invalid shape ids
3881
3882 2003-10-24 Jan-Oliver Wagner <[email protected]>
3883
3884 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3885 as alias for 'latlong'.
3886
3887 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3888 as alias for 'latlong'.
3889
3890 2003-10-24 Jan-Oliver Wagner <[email protected]>
3891
3892 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3893 the projection even for the UnknownPanel.
3894 (UnknownProjPanel.__init__): Define the text and create the textctrl
3895 widget.
3896 (UnknownProjPanel._DoLayout): Replaced static text widget by the
3897 textctrl created in __init__.
3898 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3899 including the parameters of the projection.
3900
3901 2003-10-24 Jan-Oliver Wagner <[email protected]>
3902
3903 * Resources/Projections/epsg.proj: New. This is a list of
3904 EPSG codes with parameters for proj. The list has been
3905 generated using devtools/create_epsg.py based on the
3906 file nad/epsg of the proj 4.4.7 package. Four projection
3907 definitions have been deleted as they are not accepted by proj:
3908 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3909 and "HD72 / EOV".
3910
3911 2003-10-22 Bernhard Herzog <[email protected]>
3912
3913 Some more tweaks to the projection dialog which should fix RT
3914 #1886.
3915
3916 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3917 the ProjFile's messages and call the base class methods correctly
3918 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3919 flag on the newly selected item too. Otherwise some other item is
3920 focused and the first time the focus is moved with the keyboard
3921 the selection moves in unexpected ways.
3922
3923 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3924 focus on the OK button, only on the projection list. That way the
3925 list really has the focus initially
3926 (ProjFrame.OnClose): Call the projection list's Destroy method to
3927 make it unsubscribe all messages
3928
3929 2003-10-21 Bernhard Herzog <[email protected]>
3930
3931 Rework the projection dialog to fix a few bugs, including RT 2166
3932 and most of 2168
3933
3934 * Thuban/UI/projlist.py: New. The class ProjectionList is a
3935 special wxListCtrl to show a list of projections in a more MVC
3936 fashion
3937
3938 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3939 throughout the class. The main change is to use the ProjectionList
3940 class instead of a normal wxListBox. Also, add an explicit
3941 "Unknown" projection to the projection choice control.
3942 (ProjPanel.__init__): Add an "unknown" ellipsoid
3943 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3944 instantiation of the panel's controls to make the tab-order more
3945 natural
3946
3947 2003-10-21 Bernhard Herzog <[email protected]>
3948
3949 * test/test_load.py (TestSingleLayer.file_contents)
3950 (TestSingleLayer.test): Add non-ascii characters to the titles of
3951 session, map and layer. This is effectively a port of the
3952 TestUnicodeStrings test in test_load_0_8.py which for some reason
3953 was only added there.
3954
3955 * test/test_load_0_9.py (TestSingleLayer.file_contents)
3956 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3957 characters to the titles of session, map and layer,.
3958
3959 2003-10-21 Bernhard Herzog <[email protected]>
3960
3961 Add EPSG projection handling to .thuban files
3962
3963 * test/test_save.py (SaveSessionTest.dtd)
3964 (SaveSessionTest.testEmptySession)
3965 (SaveSessionTest.testLayerProjection)
3966 (SaveSessionTest.testRasterLayer)
3967 (SaveSessionTest.testClassifiedLayer)
3968 (SaveSessionTest.test_dbf_table)
3969 (SaveSessionTest.test_joined_table)
3970 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3971 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3972 use a and epsg projection to test saving them
3973
3974 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3975 namespace
3976 (TestLayerVisibility.file_contents, TestLabels.file_contents)
3977 (TestLayerProjection.file_contents)
3978 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3979 (TestPostGISLayer.file_contents)
3980 (TestPostGISLayerPassword.file_contents)
3981 (TestLoadError.file_contents, TestLoadError.test): Update to use
3982 1.0-dev namespace
3983 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3984 use 1.0-dev namespace and use an EPSG projection to test whether
3985 loading it works
3986
3987 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3988 as of Thuban 0.9. These are now tests to determine whether Thuban
3989 can still read files generated by Thuban 0.9
3990
3991 * Thuban/Model/save.py (SessionSaver.write)
3992 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3993 namespace
3994 (SessionSaver.write_projection): Write the projection's epsg
3995 attribute
3996
3997 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3998 thuban-1.0-dev.dtd namespace
3999 (SessionLoader.check_attrs): Allow a callable object as conversion
4000 too
4001 (SessionLoader.start_projection, SessionLoader.end_projection)
4002 (SessionLoader.start_parameter): Handle the epsg attribute and
4003 rename a few instance variables to lower case
4004
4005 * Resources/XML/thuban-1.0.dtd: New. Only difference to
4006 thuban-0.9.dtd is the epsg attribute for projections.
4007
4008 2003-10-21 Bernhard Herzog <[email protected]>
4009
4010 * test/runtests.py (main): Let the user specify which tests to run
4011 on the command line
4012
4013 * test/support.py (ThubanTestResult.getDescription): Override to
4014 give a better short description. The description can be used as a
4015 parameter to run_tests to run that particular test in isolation.
4016
4017 2003-10-21 Frank Koormann <[email protected]>
4018
4019 Popup menu for legend. Scheduled for the 1.2 release this was too
4020 simple to implement: The popup menu is bound to the legend tree, while
4021 the events are hanlded by its anchestor, the legend panel. This
4022 allows reuse of all the event handlers already implemented for the
4023 legend toolbar buttons.
4024
4025 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4026 to add handlers for the events issued by the popup menu.
4027 (LegendPanel._OnToggleVisibility): Handler for toggling layer
4028 visibility event
4029 (LegendPanel._OnProjection): Handler for layer projection event.
4030 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4031 (LegendTree._OnRightClick): Event handler for right click, select item
4032 and pop up menu.
4033 (LegendTree.ToggleVisibility): Toggle layer visibility
4034 (LegendTree.LayerProjection): Raise layer projection dialog for
4035 current layer.
4036
4037 2003-10-21 Bernhard Herzog <[email protected]>
4038
4039 * Resources/Projections/defaults.proj: Use correct DOCTYPE
4040 declaration. The top-level element is projectionlist not projfile
4041
4042 2003-10-20 Bernhard Herzog <[email protected]>
4043
4044 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4045 method to write a projfile and display a busy cursor and error
4046 dialogs.
4047 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4048 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4049 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4050 busy cursor while loading the user and system prj files.
4051
4052 2003-10-16 Bernhard Herzog <[email protected]>
4053
4054 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4055 ProjFile objects
4056 (clear_proj_file_cache): New function to clear the cache. Mainly
4057 useful for use by the test suite
4058 (read_proj_file): Use the cache.
4059
4060 * test/test_proj.py (TestProjFile): Clarify the doc-string
4061 (ProjFileReadTests): Update doc-string
4062 (ProjFileReadTests.test_get_system_proj_file): Check whether the
4063 system proj files is cached.
4064 (ProjFileLoadTestCase): New base class for the proj file tests
4065 derived from support.FileLoadTestCase to provide some common
4066 behavior.
4067 (TestLoadingProjFile)
4068 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4069 (TestProjFileWithInvalidParameters.file_contents): Derive from
4070 ProjFileLoadTestCase
4071 (TestLoadingProjFile.test_caching): New. Test whether the cache
4072 works
4073
4074 2003-10-16 Silke Reimer <[email protected]>
4075
4076 * debian/*: New directory with configuration files for building a thuban
4077 deb-package.
4078
4079 2003-10-14 Bernhard Herzog <[email protected]>
4080
4081 * test/test_proj.py: Execute support.run_tests when run as
4082 __main__ so that missing unsubscribes are detected
4083 (TestProjFile.tearDown): Destroy the proj_file properly
4084
4085 2003-10-14 Bernhard Herzog <[email protected]>
4086
4087 * Thuban/Model/messages.py (PROJECTION_ADDED)
4088 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4089 the ProjFile objects
4090
4091 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4092 easily send messages when the projections change
4093 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4094 when the change was successful
4095
4096 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4097 proj file messages
4098 (TestProjFile.test_add_remove)
4099 (TestProjFile.test_remove_non_existing)
4100 (TestProjFile.test_replace)
4101 (TestProjFile.test_replace_non_existing): Test whether the right
4102 messages are sent
4103
4104 2003-10-14 Bernhard Herzog <[email protected]>
4105
4106 * test/test_proj.py (TestProjFile.test): Refactor into several
4107 tests
4108 (TestProjFile.test_add_remove)
4109 (TestProjFile.test_remove_non_existing)
4110 (TestProjFile.test_replace)
4111 (TestProjFile.test_replace_non_existing): Some of the new
4112 individual test cases
4113 (TestProjFileSimple): New class for the rest of the test cases
4114 that came out of the refactoring
4115 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4116 derived classes don't have to
4117
4118 2003-10-13 Bernhard Herzog <[email protected]>
4119
4120 Add an optional EPSG code to the projection objects and extend the
4121 .proj file format accordingly.
4122
4123 * Resources/XML/projfile.dtd (element projection): Add epsg
4124 attribute
4125
4126 * Thuban/Model/proj.py (Projection.__init__): New parameter and
4127 instance variable epsg. Update doc-string
4128 (Projection.EPSGCode, Projection.Label): New methods to provide
4129 access to EPSG code and a label for use in dialogs
4130
4131 * Thuban/Model/resource.py (ProjFileReader.start_projection)
4132 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4133 Handle the epsg code attribute when reading or writing proj files
4134
4135 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4136 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4137 (ProjFrame.__FillAvailList): Use the projection's Label method to
4138 get the string for the list box
4139
4140 * test/test_proj.py (TestProjection.test_label)
4141 (TestProjection.test_label_epsg)
4142 (TestProjection.test_epsgcode_for_non_epsg_projection)
4143 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4144 for the label and EPSGCode methods
4145 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4146 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4147 objects in the test cases and put the expected contents into the
4148 test case methods too. Update doTestWrite accordingly
4149 (TestLoadingProjFile)
4150 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4151 read tests from TestProjFile.
4152 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4153 tests are now in the new classes.
4154 (sample_projfile, sample_projfile_data)
4155 (sample_projfile2, sample_projfile_data2): Removed. Not used
4156 anymore.
4157 (TestProjFile.test_read_unreadable_file): No need to reset the
4158 permissions at the end anymore since we use a unique filename
4159
4160 2003-10-13 Bernhard Herzog <[email protected]>
4161
4162 * test/test_proj.py: Some more refactoring of the test cases
4163 (ProjFileTest): New base class for the proj file tests.
4164 (TestProjFile): Derive from ProjFileTest
4165 (TestProjFile.test_read_unreadable_file)
4166 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4167 the new filename method to get a unique filename
4168 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4169 (WriteProjFileTests): New class for proj file write tests.
4170 Contains the write test that were in TestProjFile originally.
4171
4172 2003-10-13 Bernhard Herzog <[email protected]>
4173
4174 * test/test_proj.py (TestProjFile.testRead)
4175 (TestProjFile.test_read_non_existing_file)
4176 (TestProjFile.test_read_unreadable_file)
4177 (TestProjFile.test_read_empty_file): Split into several methods.
4178
4179 2003-10-10 Bernhard Herzog <[email protected]>
4180
4181 * Thuban/UI/sizers.py: New file with custom sizers.
4182
4183 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4184 all projection type specific panels and put them into a
4185 NotebookLikeSizer. This way the dialog doesn't change its size
4186 when a different projection is selected
4187 (ProjFrame.__init__): Rename projection_panels
4188 projection_panel_defs and reuse projection_panels for a list of
4189 the instantiated panels.
4190 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4191 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4192 the panels
4193 (UnknownProjPanel._DoLayout): Place the newlines in the message
4194 differently to make the panel narrower.
4195 (TMPanel._DoLayout): Layout the parameters in one column.
4196
4197 2003-10-10 Bernhard Herzog <[email protected]>
4198
4199 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4200 that contains all the setup for the dialog's widgets, layout and
4201 event handling.
4202 (__): Call build_dialog to build the dialog.
4203 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4204 Their functionality is now in build_dialog
4205 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4206 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4207 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4208 different widget names and hierarchy introduced with build_dialog.
4209
4210 2003-10-10 Bernhard Herzog <[email protected]>
4211
4212 * README: Fix typo.
4213
4214 2003-10-09 Bernhard Herzog <[email protected]>
4215
4216 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4217 projection is already in the list. This is *a lot* faster when
4218 loading files with hundreds of projections since it saves a linear
4219 search. OTOH this will allow adding the same projection to the
4220 user.proj file multiple times in the projection dialog but we'll
4221 deal with that later
4222
4223 2003-10-09 Jan-Oliver Wagner <[email protected]>
4224
4225 * devtools: New. Directory for developer tools that are not intended
4226 for the regular user.
4227
4228 * devtools/create_epsg.py: New. Convert the epsg file of proj into
4229 a python .proj file.
4230
4231 2003-10-09 Bernhard Herzog <[email protected]>
4232
4233 * test/test_proj.py
4234 (TestProjection.test_get_parameter_without_equals_sign): New. Test
4235 whether GetParameter handles parameters without "=" sign correctly
4236
4237 * Thuban/Model/proj.py (Projection.GetParameter): Handle
4238 parameters that do not contain a "=". Update the doc-string
4239
4240 2003-10-08 Bernhard Herzog <[email protected]>
4241
4242 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4243 length limit on the projname text control
4244
4245 2003-10-08 Bernhard Herzog <[email protected]>
4246
4247 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4248 (TestProjection.test_get_projection_units_normal): New. Tests for
4249 the Projection.GetProjectedUnits method
4250
4251 2003-10-08 Jan-Oliver Wagner <[email protected]>
4252
4253 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4254 Added missing 'val' parameter.
4255
4256 2003-10-08 Bernhard Herzog <[email protected]>
4257
4258 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4259 projection type of the currently selected projection is not known,
4260 i.e. there's no panel for it, use the UnknownProjPanel
4261 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4262 the actual replacing of the proj panel into the new method
4263 _show_proj_panel.
4264 (UnknownProjPanel): Add doc-string.
4265 (UnknownProjPanel._DoLayout): Insert a newline into the text so
4266 that the panel is not so wide.
4267
4268 2003-10-08 Bernhard Herzog <[email protected]>
4269
4270 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4271 too. Update the doc-string
4272 (get_proj_files): Removed. It wasn't used anywhere
4273 (get_system_proj_files, get_system_proj_file): Rename to
4274 get_system_proj_file and return the ProjFile object and not a list
4275 of ProjFile objects. Update the callers.
4276 (get_user_proj_files, get_user_proj_file): Rename to
4277 get_user_proj_file return the ProjFile object and not a list of
4278 ProjFile objects. Update the callers.
4279 (ProjFileReader.__init__): New instance variable for the warnings.
4280 Rename the __pf ivar to projfile. Update the methods referring to
4281 __pf
4282 (ProjFileReader.end_projection): Catch any errors raised when
4283 instantiating the projection and record that as an error. The
4284 projection will not be in the final ProjFile object.
4285 (ProjFileReader.GetWarnings): New method to return the warnings.
4286
4287 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4288 show the warnings from the projfile reader
4289 (ProjFrame._OnImport): Deal with any warnings returned by
4290 read_proj_file
4291 (ProjFrame.__FillAvailList): Deal with any warnings returned by
4292 get_system_proj_file or get_user_proj_file.
4293
4294 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4295 (TestProjFileWithInvalidParameters.file_contents): New test cases
4296 to test whether read_proj_file handles invalid projection
4297 parameters correctly
4298 (TestProjFile.test_get_system_proj_file): New. Simple test for
4299 resource.get_system_proj_file
4300
4301 2003-10-07 Bernhard Herzog <[email protected]>
4302
4303 * test/test_derivedshapestore.py
4304 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4305 properly so that the temporary directories get deleted correctly
4306
4307 2003-10-06 Bernhard Herzog <[email protected]>
4308
4309 Handle the title changes in a proper MVC way.
4310
4311 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4312 canvas' TITLE_CHANGED messages
4313 (MainWindow.update_title): New. Update the main window's title
4314 (MainWindow.__SetTitle): Removed. Use update_title instead.
4315 (MainWindow.SetMap): Use update_title instead of __SetTitle
4316 (MainWindow.RenameMap): Do change the window title explicitly
4317 here. That's handled in a proper MVC way now.
4318 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4319 messages
4320
4321 * Thuban/Lib/connector.py (Conduit): New class to help classes
4322 that forward messages
4323
4324 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4325 (ViewPort): Derive from Conduit instead of Publisher
4326 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4327 when calling the inherited versions
4328 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4329 methods to subscribe and unsubscribe map messages
4330 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4331 handle the map subscriptions
4332 (ViewPort.Map, ViewPort.map_projection_changed)
4333 (ViewPort.layer_projection_changed): Add or update doc-strings
4334
4335 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4336 typo
4337 (MyConduit): Helper class for the Conduit test.
4338 (TestConduit): Test cases for Conduit
4339
4340 * test/test_connector.py: Use support.run_tests as main.
4341
4342 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4343 the TITLE_CHANGED messages
4344 (ViewPortTest.test_forwarding_title_changed): New test to check
4345 whether the viewport forwards the map's TITLE_CHANGED messages
4346 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4347 after the port's because the latter may require a still functional
4348 map.
4349
4350 2003-10-06 Bernhard Herzog <[email protected]>
4351
4352 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4353 doc-string
4354
4355 2003-10-06 Bernhard Herzog <[email protected]>
4356
4357 * test/test_viewport.py (ViewPortTest.setUp)
4358 (SimpleViewPortTest.test_init_with_size): Move the test for the
4359 initial size as a constructor parameter from ViewPortTest.setUp
4360 method to a new separate test in SimpleViewPortTest.
4361
4362 2003-10-06 Bernhard Herzog <[email protected]>
4363
4364 * test/test_viewport.py (MockView): New class derived from
4365 ViewPort with a mock implementation of GetTextExtent to be used in
4366 the test cases
4367 (ViewPortTest.setUp): Use MockView instead of ViewPort
4368
4369 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4370 into what would be a "pure virtual function" in C++: always raise
4371 NotImplementedError. Mock implementations for test cases don't
4372 belong into the real code
4373
4374 2003-10-02 Bernhard Herzog <[email protected]>
4375
4376 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4377 close the dbf file we create so that it's contents have been
4378 written properly.
4379
4380 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4381 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4382 Update to shapelib 1.2.10
4383
4384 2003-10-01 Jan-Oliver Wagner <[email protected]>
4385
4386 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4387 it annoys lintian which warns about these files not being
4388 executable. The #! isn't necessary here since if you absolutely
4389 must execute them you can always say "python <filename>".
4390
4391 2003-09-26 Bernhard Herzog <[email protected]>
4392
4393 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4394 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4395 is ported to a newer the import will fail, so it should be noticed
4396 immediately that this function is gone.
4397 Fixes RT#1919
4398
4399 2003-09-26 Bernhard Herzog <[email protected]>
4400
4401 Add a DTD for the projection files and make thuban write valid
4402 projection files
4403
4404 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4405 files
4406
4407 * Thuban/Model/resource.py (ProjFileSaver.write): Use
4408 'projectionlist' as the name in the document type declaration so
4409 that it matches the element type of the root element.
4410
4411 * test/test_proj.py (sample_projfile, sample_projfile2): Use
4412 'projectionlist' as the name in the document type declaration just
4413 as it is done now in the files thuban would write
4414 (sample_projfile, sample_projfile_data): Fix spelling of
4415 "Mercator"
4416 (TestProjFile.doTestWrite): Validate the written and the expected
4417 XML data
4418 (TestProjFile): Derive from ValidationTest so that we can run xml
4419 validation tests
4420
4421 2003-09-24 Bernhard Herzog <[email protected]>
4422
4423 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4424 modify the list returned by map.Layers() in place since it is the
4425 actual list of layers used by the map.
4426
4427 2003-09-23 Jan-Oliver Wagner <[email protected]>
4428
4429 * Doc/manual/thuban-manual.xml: Added subsection to chapter
4430 Extensions to describe the extensions coming with the Thuban
4431 standard package (gns2shp and importAPR).
4432
4433 2003-09-23 Bernhard Herzog <[email protected]>
4434
4435 * libraries/thuban/wxproj.cpp (project_point): if there's an
4436 inverse but no forward projection, convert to degrees after
4437 applying the inverse projection. Fixes RT#2096
4438
4439 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4440 implicitly tests for the fix to RT#2096
4441
4442 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4443 Check that the sequences have the same lengths
4444
4445 * Resources/Projections/defaults.proj (Geographic projection): Use
4446 a much more precise value for the to_meter attribute.
4447
4448 2003-09-22 Bernhard Herzog <[email protected]>
4449
4450 * test/support.py (initthuban): Make sure to unset the LANG env.
4451 var. so that tests that compare translated strings work. Solves RT
4452 #2094
4453
4454 2003-09-22 Jan-Oliver Wagner <[email protected]>
4455
4456 Small improvement of APR import.
4457
4458 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4459 Added tests for text-ranges.
4460
4461 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4462 returns a string object if the range is based on text.
4463
4464 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4465 range retrieval.
4466
4467 2003-09-22 Jan-Oliver Wagner <[email protected]>
4468
4469 Initial version of the importAPR extension which is in
4470 experimental state.
4471
4472 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4473 /Extensions/importAPR/test/: New directories.
4474
4475 * /Extensions/importAPR/samples/README: New: Howto load the samples.
4476
4477 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4478 file which refers to the Thuban Iceland demo data.
4479
4480 * /Extensions/importAPR/test/README: New: Howto execute the tests.
4481
4482 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4483
4484 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4485 as in '.apr'-files.
4486
4487 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4488 ODB Objects as in '.apr', '.avl' and other files.
4489
4490 * /Extensions/importAPR/__init__.py: New: Init to make this
4491 directory a package.
4492
4493 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4494 project file (.apr) and convert it to Thuban.
4495
4496 2003-09-22 Jan-Oliver Wagner <[email protected]>
4497
4498 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4499
4500 2003-09-19 Jan-Oliver Wagner <[email protected]>
4501
4502 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4503 with description on RPM installation and RPM binary package
4504 creation.
4505
4506 2003-09-18 Bernhard Herzog <[email protected]>
4507
4508 * setup.py (data_files): Only add the mo files if the Locales
4509 directory actually exists, so that setup.py works with a fresh CVS
4510 checkout
4511
4512 2003-09-12 Jan-Oliver Wagner <[email protected]>
4513
4514 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4515 in viewport, not anymore in view
4516
4517 2003-09-04 Jan-Oliver Wagner <[email protected]>
4518
4519 Introducing first Extension (gns2shp).
4520
4521 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4522
4523 * Extensions/__init__.py: New. init to make this dir a package.
4524
4525 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4526
4527 * Extensions/gns2shp/test/README: New. some info on this test directory.
4528
4529 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4530
4531 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4532 of Shapefile from GNS text file format
4533
4534 2003-09-03 Jan-Oliver Wagner <[email protected]>
4535
4536 Fix/workaround for bug #2019:
4537 https://intevation.de/rt/webrt?serial_num=2019
4538
4539 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4540 (IdentifyView.__init__): Added another button that allows to
4541 stop the identify mode.
4542 (IdentifyView.OnStop): New. Stops the identify mode.
4543
4544 2003-09-03 Jan-Oliver Wagner <[email protected]>
4545
4546 Introducing a new exception dialog that allows to exit the
4547 application immediately.
4548 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4549
4550 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4551
4552 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4553 Made strings available to translations. Exchanged the simple
4554 ScrolledMessageDialog by the new ExceptionDialog.
4555
4556 2003-09-01 Bernhard Herzog <[email protected]>
4557
4558 * NEWS: New. Summary of changes and release notes.
4559
4560 * MANIFEST.in: Add NEWS
4561
4562 2003-09-01 Bernhard Herzog <[email protected]>
4563
4564 * MANIFEST.in: Correct the include statement for the mo-files and
4565 include the documentation too.
4566
4567 * setup.py (data_files): Add the .mo files
4568 (setup call): Up to version 0.9.0
4569
4570 2003-09-01 Bernhard Herzog <[email protected]>
4571
4572 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4573 parameter list to just parent and session
4574 (ChooseDBTableDialog.__set_properties): Removed. Setting the
4575 selection of empty list boxes is not allowed (and produces C++
4576 assertion errors) and the rest of the setup is better done in
4577 __init__ anyway.
4578 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
4579 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
4580 builtins True/False for booleans to avoid warnings from wxPython
4581
4582 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
4583 ChooseDBTableDialog constructor parameters.
4584
4585 2003-09-01 Bernhard Herzog <[email protected]>
4586
4587 * Thuban/Model/postgisdb.py
4588 (PostGISTable): Extend doc-string
4589 (PostGISTable._fetch_table_information): Set the column index
4590 correctly, pretending ignored columns don't exist.
4591
4592 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
4593 for postgis tables with data types not yet supported by thuban.
4594
4595 2003-08-29 Bernhard Herzog <[email protected]>
4596
4597 * HOWTO-Release: Tweak item about running the tests.
4598
4599 2003-08-29 Jan-Oliver Wagner <[email protected]>
4600
4601 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
4602
4603 2003-08-29 Bernhard Herzog <[email protected]>
4604
4605 Add some missing parameters to projections. Proj complains about
4606 them on windows but for some reason not on Linux.
4607
4608 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
4609 missing required projection parameters
4610
4611 * test/test_proj.py (TestProjFile.test): Add missing required
4612 projection parameters
4613
4614 * test/test_load_0_8.py (TestLayerProjection.file_contents)
4615 (TestLayerProjection.test): Add missing required projection
4616 parameters and tests for them
4617
4618 * test/test_load.py (TestLayerProjection.file_contents)
4619 (TestLayerProjection.test): Add missing required projection
4620 parameters and tests for them
4621
4622 * test/test_layer.py (TestLayer.test_base_layer): Add missing
4623 required projection parameters
4624
4625 2003-08-29 Bernhard Herzog <[email protected]>
4626
4627 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
4628 access the pj_errno because directly accessing pj_errno doesn't
4629 work on windows if the proj library is in a DLL
4630
4631 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
4632
4633 2003-08-28 Bernhard Herzog <[email protected]>
4634
4635 * test/test_proj.py: Import things from Thuban after calling
4636 initthuban
4637
4638 * test/test_load.py (LoadSessionTest.filenames): New class
4639 variable with the filename attributes to normalize
4640 (LoadSessionTest.check_format): Pass self.filenames to
4641 sax_eventlist to normalize the filename attributes
4642
4643 * test/xmlsupport.py: Add cvs keywords
4644 (SaxEventLister.__init__): New parameter filenames which indicates
4645 attributes that contain filenames
4646 (SaxEventLister.startElementNS): Normalize the filename attributes
4647 with os.path.normpath
4648 (sax_eventlist): New parameter filenames to pass through to
4649 SaxEventLister
4650
4651 * test/test_derivedshapestore.py: Make this file callable as a
4652 program to execute the tests
4653 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
4654 the session to self.session so that it gets destroyed properly
4655
4656 * test/test_layer.py (TestLayer.tearDown): Call the session's
4657 Destroy method
4658
4659 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
4660 too if it exists
4661 (TestMapAddLayer.test_add_layer): Bind the session to self.session
4662 so that it gets destroyed properly
4663
4664 * test/postgissupport.py (reason_for_not_running_tests): Add a
4665 test for the existence of popen2.Popen4.
4666
4667 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4668 reliable way to destroy the sessions created in the test cases
4669 (SaveSessionTest.test_dbf_table): Bind the session to self.session
4670 so that it gets destroyed properly
4671 (SaveSessionTest.testLayerProjection): Bind the session to
4672 self.session so that it gets destroyed properly
4673
4674 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4675 sure that the session is destroyed properly
4676
4677 * test/test_shapefilestore.py: Make this callable as a program to
4678 execute the tests
4679
4680 * test/test_scalebar.py: Remove unnecessary import of _ from
4681 Thuban
4682
4683 * test/support.py (print_garbage_information): Call initthuban
4684 here because it may be called indirectly from test cases that test
4685 test support modules which do not use anything from thuban itself
4686 (ThubanTestProgram.runTests): Remove unnecessary debug print
4687
4688 2003-08-28 Bernhard Herzog <[email protected]>
4689
4690 * Thuban/version.py (longversion): Update to 0.9
4691
4692 * Thuban/UI/mainwindow.py: Remove some unused imports
4693
4694 * README: Add section about required additional software. Add date
4695 and revision CVS keywords
4696
4697 * HOWTO-Release: Add item about the translations. Add date and
4698 revision CVs keywords and change formatting to match README a bit
4699 better
4700
4701 * po/de.po: Update for 0.9
4702
4703 * test/README: Tweak the wording a little because many tests are
4704 not really unittest.
4705
4706 2003-08-27 Bernhard Herzog <[email protected]>
4707
4708 As preparation for the 0.9 release, switch thuban files to a
4709 non-dev namespace
4710
4711 * Thuban/Model/save.py (SessionSaver.write_session): Write files
4712 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4713 namespace
4714
4715 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4716 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4717
4718 * test/test_save.py (SaveSessionTest.dtd)
4719 (SaveSessionTest.testEmptySession)
4720 (SaveSessionTest.testSingleLayer)
4721 (SaveSessionTest.testLayerProjection)
4722 (SaveSessionTest.testRasterLayer)
4723 (SaveSessionTest.testClassifiedLayer)
4724 (SaveSessionTest.test_dbf_table)
4725 (SaveSessionTest.test_joined_table)
4726 (SaveSessionTest.test_save_postgis): Update for new namespace
4727
4728 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4729 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4730 (TestLayerProjection.file_contents)
4731 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4732 (TestPostGISLayer.file_contents)
4733 (TestPostGISLayerPassword.file_contents)
4734 (TestLoadError.file_contents, TestLoadError.test): Update for new
4735 namespace
4736
4737 2003-08-27 Bernhard Herzog <[email protected]>
4738
4739 Make the table interface distinguish between row ids (an integer
4740 that uniquely identifies a row) and row ordinals (a simple row
4741 count from 0 to NumRows() - 1)
4742
4743 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4744 (PostGISTable.RowOrdinalToId): New methods to conver between row
4745 ids and row ordinals
4746 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4747 parameter row_is_ordinal to indicate whether the row parameter is
4748 the row id or the ordinal
4749
4750 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4751 (TransientTableBase.RowOrdinalToId)
4752 (AutoTransientTable.RowIdToOrdinal)
4753 (AutoTransientTable.RowOrdinalToId): Same new methods as in
4754 PostGISTable.
4755 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4756 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4757 Same new parameter as in PostGISTable.
4758
4759 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4760 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4761 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4762 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4763 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4764 parameter as in PostGISTable.
4765
4766 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4767 (DataTable.RowOrdinalToId): New methods to convert between row ids
4768 and row ordinals.
4769 (TableGrid.SelectRowById): New method to select a row based on its
4770 ID as opposed to its ordinal
4771 (DataTable.GetValue, TableGrid.OnRangeSelect)
4772 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4773 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4774 (LayerTableFrame.__init__): Convert between row ids and row
4775 ordinals as appropriate
4776
4777 * test/postgissupport.py (PostGISDatabase.__init__): Add
4778 doc-string.
4779 (PostGISDatabase.initdb): The optional third item in a tuple in
4780 tables is now a (key, value) list with additional arguments to
4781 pass to upload_shapefile
4782 (upload_shapefile): New parameter gid_offset to allow gids that
4783 are not the same as the shapeids in the shapefile
4784 (PostgreSQLServer.get_default_static_data_db): Use the new
4785 gid_offset to make the gids in landmarks 1000 higher than the
4786 shapeids in the shapefile
4787
4788 * test/test_viewport.py
4789 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4790 new shapeids in the landmarks table
4791
4792 * test/test_transientdb.py
4793 (TestTransientTable.run_iceland_political_tests)
4794 (TestTransientTable.test_transient_joined_table): Add tests for
4795 the new table methods and new keywords arguments.
4796
4797 * test/test_postgis_db.py
4798 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4799 (TestPostGISTable.test_read_value_row_count_mode)
4800 (TestPostGISTable.test_row_id_to_ordinal)
4801 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4802 table methods and the new arguments
4803 (TestPostGISShapestorePoint.test_shapes_in_region)
4804 (TestPostGISShapestorePoint.test_shape_raw_data)
4805 (TestPostGISShapestorePoint.test_shape_points)
4806 (TestPostGISShapestorePoint.test_shape_shapeid)
4807 (TestPostGISShapestorePoint.test_all_shapes)
4808 (TestPostGISTable.test_simple_query)
4809 (TestPostGISTable.test_simple_query)
4810 (TestPostGISTable.test_simple_query)
4811 (TestPostGISTable.test_read_value)
4812 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4813 shapeids in the landmarks table
4814
4815 * test/test_memory_table.py
4816 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4817 (TestMemoryTable.test_read_value_row_count_mode)
4818 (TestMemoryTable.test_row_id_to_ordinal)
4819 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4820 table methods and the new arguments
4821
4822 * test/test_dbf_table.py
4823 (TestDBFTable.test_read_row_as_dict_row_count_mode)
4824 (TestDBFTable.test_read_value_row_count_mode)
4825 (TestDBFTable.test_row_id_to_ordinal)
4826 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4827 methods and the new arguments
4828
4829 2003-08-26 Bernhard Herzog <[email protected]>
4830
4831 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4832 more postgis specific but much faster method to get the bounding
4833 box
4834
4835 2003-08-26 Bernhard Herzog <[email protected]>
4836
4837 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4838 (PostGISShapeStore.AllShapes): Add these missing methods.
4839 (PostGISShapeStore.ShapesInRegion): No need to raise
4840 StopIteration. We can simply return
4841
4842 * test/test_postgis_db.py (TestPostGISTable.test_title)
4843 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4844 new methods
4845
4846 2003-08-25 Bernhard Herzog <[email protected]>
4847
4848 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4849
4850 * test/test_postgis_db.py (PolygonTests): New class containing
4851 those tests from TestPostGISShapestorePolygon that can also be
4852 used to test MUTLIPOLYGON tables
4853 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4854 so derive from that
4855 (TestPostGISShapestoreMultiPolygon): New class with tests for
4856 MUTLIPOLYGON tables
4857
4858 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4859 tables argument to have tuples with three items to override the
4860 WKT type used.
4861 (PostgreSQLServer.get_default_static_data_db): Use the above to
4862 create a polygon table with MUTLIPOLYGONs
4863 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4864 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4865 coords_to*
4866 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4867 (wkt_converter): New. Map WKT types to converters
4868 (upload_shapefile): New parameter force_wkt_type to use a
4869 different WKT type than the default
4870
4871 2003-08-25 Bernhard Herzog <[email protected]>
4872
4873 * Thuban/UI/application.py
4874 (ThubanApplication.run_db_param_dialog): New. Suitable as a
4875 db_connection_callback. Main difference is that the dialog run
4876 from this method doesn't have a parent so it can be used even when
4877 there is no main window
4878 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4879 no db_connection_callback was given. This way the dialog pops up
4880 even when the .thuban file was given as a command line parameter.
4881
4882 2003-08-25 Bernhard Herzog <[email protected]>
4883
4884 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4885 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4886 which leads to an effectively frozen X session because the user
4887 can only interact with the dialog but the mouse is still grabbed
4888 by the canvas.
4889 Also, call the tool's Hide method before MouseLeftUp because
4890 MouseLeftUp may change the tool's coordinates.
4891
4892 2003-08-25 Bernhard Herzog <[email protected]>
4893
4894 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4895 LoadCancelled exceptions and handle them by returning immediately.
4896
4897 2003-08-25 Bernhard Herzog <[email protected]>
4898
4899 GUI part of loading sessions with postgis connections which may
4900 require user interaction to get passwords or updated parameters
4901
4902 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4903 bit nucer and be more generic.
4904 (DBFrame.OnAdd): Adapt to new DBDialog interface
4905
4906 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4907 optional parameter db_connection_callback which is passed to
4908 load_session.
4909
4910 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4911 Suitable as a db_connection_callback
4912 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4913 db_connection_callback of the application's OpenSession method
4914
4915
4916 2003-08-25 Bernhard Herzog <[email protected]>
4917
4918 Basic loading of sessions containing postgis connections:
4919
4920 * Thuban/Model/load.py (LoadError): Add doc-string
4921 (LoadCancelled): New exception class to indicate a cancelled load
4922 (SessionLoader.__init__): Add the db_connection_callback parameter
4923 which will be used by the loader to get updated parameters and a
4924 password for a database connection
4925 (SessionLoader.__init__): Add the new XML elements to the
4926 dispatchers dictionary
4927 (SessionLoader.check_attrs): Two new conversions, ascii to convert
4928 to a byte-string object and idref as a generic id reference
4929 (SessionLoader.start_dbconnection)
4930 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4931 elements
4932 (load_session): Add the db_connection_callback to pass through the
4933 SessionLoader
4934
4935 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4936 New classes to test loading of sessions with postgis database
4937 connections.
4938
4939 2003-08-25 Bernhard Herzog <[email protected]>
4940
4941 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4942 replace it and the comment with __BuildDate__ by the Source: and
4943 Id: cvs keywords as used in the other files.
4944
4945 2003-08-25 Bernhard Herzog <[email protected]>
4946
4947 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4948 LoadError when a required attribute is missing. The code used to
4949 be commented out for some reason, but probably should have been
4950 active.
4951
4952 * test/test_load.py (TestLoadError.test): Test the message in the
4953 LoadError too to make sure it really is about the missing
4954 attribute
4955
4956 2003-08-22 Bernhard Herzog <[email protected]>
4957
4958 * test/test_save.py (SaveSessionTest.test_dbf_table)
4959 (SaveSessionTest.test_joined_table): Add XML validation tests.
4960
4961 2003-08-22 Bernhard Herzog <[email protected]>
4962
4963 Implement saving a session with a postgis connection
4964
4965 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4966 elements for database connections and shapestores using db
4967 connections
4968 (session): Add the dbconnections to the content model
4969
4970 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4971 Write the db connections
4972 (SessionSaver.write_session): Call write_db_connections to write
4973 the connection before the data sources
4974 (SessionSaver.write_data_containers): Handle postgis shapestores
4975
4976 * test/test_save.py (SaveSessionTest.thubanids)
4977 (SaveSessionTest.thubanidrefs): Update for new DTD
4978 (SaveSessionTest.test_save_postgis): New. Test saving a session
4979 with postgis connections
4980
4981 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4982 (PostGISTable.TableName): New accessor methods for the connection
4983 and table name
4984
4985 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4986 (TestPostGISTable.test_dbname): New methods to test the new
4987 PostGISConnection methods
4988
4989 2003-08-22 Bernhard Herzog <[email protected]>
4990
4991 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4992 for exceptions occurring when establishing a Database connection
4993 (PostGISConnection.connect): Catch psycopg.OperationalError during
4994 connects and raise ConnectionError.
4995
4996 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4997 tests for database exceptions
4998
4999 2003-08-22 Bernhard Herzog <[email protected]>
5000
5001 Prepare the test suite for tests with required authentication
5002
5003 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5004 variables with two predefined users/passwords, one for the admin
5005 and one for a non-privileged user.
5006 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5007 the non-privileged user to the database and set the admin password
5008 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5009 Better error reporting
5010 (PostgreSQLServer.connection_params)
5011 (PostgreSQLServer.connection_string): New methods to return
5012 information about how to connect to the server
5013 (PostgreSQLServer.execute_sql): New. Convenience method to execute
5014 SQL statements
5015 (PostgreSQLServer.require_authentication): Toggle whether the
5016 server requires authentication
5017 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5018 Add or alter users
5019 (PostGISDatabase.initdb): Pass the admin name one the
5020 subprocesses' command lines. Grant select rights on
5021 geometry_columns to everybody.
5022 (upload_shapefile): Use the admin name and password when
5023 connecting. Grant select rights on the new table to everybody.
5024
5025 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5026 server's new methods to get the connection parameters.
5027
5028 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5029 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5030 server's new methods to get the connection parameters.
5031
5032 * test/test_postgis_db.py
5033 (TestPostGISConnection.test_gis_tables_empty)
5034 (TestPostGISConnection.test_gis_tables_non_empty)
5035 (PostGISStaticTests.setUp): Use the server's new methods to get
5036 the connection parameters.
5037
5038 2003-08-22 Bernhard Herzog <[email protected]>
5039
5040 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5041
5042 * Thuban/version.py: Add psycopg version
5043
5044 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5045 version of the psycopg module
5046
5047 2003-08-22 Bernhard Herzog <[email protected]>
5048
5049 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5050 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5051 at the moment. The functionality should probably be implemented
5052 some time, though.
5053 (DBFrame.OnRemove): Display a message if the connection can't be
5054 removed because it's still in use.
5055
5056 2003-08-22 Jan-Oliver Wagner <[email protected]>
5057
5058 * Thuban/UI/about.py (About.__init__): split up the huge about
5059 text into elements/lists for easier translation. This fixes bug
5060 https://intevation.de/rt/webrt?serial_num=2058
5061 Also, made some forgotten string available for the i18n.
5062
5063 2003-08-21 Bernhard Herzog <[email protected]>
5064
5065 Make postgis support really optional including insensitive menu
5066 items.
5067
5068 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5069 whether the postgis is supported.
5070
5071 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5072 to make postgis support optional
5073
5074 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5075 version of Thuban.Model.postgisdb.has_postgis_support
5076 (database_management command): Make it only sensitive if postgis
5077 is supported.
5078
5079 2003-08-21 Jan-Oliver Wagner <[email protected]>
5080
5081 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5082 (section Adding and Removing Layers): Added text and described
5083 multi-selection.
5084 (chapter Extensions): New.
5085
5086 2003-08-21 Jan-Oliver Wagner <[email protected]>
5087
5088 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5089 settings to allow multiple files to load into the map.
5090 Also reduced selection to *.shp as a default.
5091
5092 2003-08-20 Bernhard Herzog <[email protected]>
5093
5094 Add dialogs and commands to open database connections and add
5095 database layers.
5096
5097 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5098 method to open the database connection management dialog
5099 (MainWindow.AddDBLayer): New method to add a layer from a database
5100 (_has_dbconnections): New helper function to use for sensitivity
5101 (database_management command, layer_add_db command): New commands
5102 that call the above new methods.
5103 (main_menu): Add the new commands to the menu.
5104
5105 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5106 (PostGISConnection.connect): Establish the actual connection in a
5107 separate method and call it in __init__. This makes it easier to
5108 override the behavior in test cases
5109 (PostGISConnection.BriefDescription): New method to return a brief
5110 description for use in dialogs.
5111
5112 * test/test_postgis_db.py (NonConnection): DB connection that
5113 doesn't actually connect
5114 (TestBriefDescription): New class with tests for the new
5115 BriefDescription method
5116
5117 2003-08-19 Jan-Oliver Wagner <[email protected]>
5118
5119 Moved anything from extensions to libraries.
5120
5121 * libraries: New.
5122
5123 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5124
5125 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5126 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5127 been moved here from thuban/extensions/pyprojection/
5128 See there in the Attic for the older history.
5129
5130 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5131 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5132 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5133 have been moved here from thuban/extensions/pyshapelib/
5134 See there in the Attic for the older history.
5135
5136 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5137 files have been moved here from thuban/extensions/shapelib/
5138 See there in the Attic for the older history.
5139
5140 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5141 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5142 thuban/extensions/thuban/
5143 See there in the Attic for the older history.
5144
5145 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5146
5147 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5148 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5149
5150 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5151 Moved to libraries/shapelib.
5152
5153 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5154 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5155 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5156 Moved to libraries/pyshapelib.
5157
5158 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5159 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5160 Moved to libraries/pyprojection.
5161
5162 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5163
5164 * extensions: Removed.
5165
5166 2003-08-19 Bernhard Herzog <[email protected]>
5167
5168 * test/test_viewport.py (ViewPortTest): We don't use the
5169 facilities of FileTestMixin so don't derive from it.
5170 (TestViewportWithPostGIS): New class with tests for using a
5171 viewport on a map with postgis layers.
5172
5173 2003-08-19 Bernhard Herzog <[email protected]>
5174
5175 Add the db connection management to the session.
5176
5177 * Thuban/Model/session.py (Session.__init__): New instance
5178 variable db_connections
5179 (Session.AddDBConnection, Session.DBConnections)
5180 (Session.HasDBConnections, Session.CanRemoveDBConnection)
5181 (Session.RemoveDBConnection): New methods to manage and query the
5182 db connections managed by the session
5183 (Session.OpenDBShapeStore): New method to open a shapestore from a
5184 db connection
5185
5186 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5187 messages for the db connection handling in the session
5188
5189 * test/test_postgis_session.py: New. test cases for the session's
5190 db connection handling with postgis connections
5191
5192 2003-08-19 Bernhard Herzog <[email protected]>
5193
5194 Add very basic postgis database support and the corresponding test
5195 cases. The test cases require a PostgreSQL + postgis installation
5196 but no existing database. The database will be created
5197 automatically by the test cases
5198
5199 * test/README: Add note about skipped tests and the requirements
5200 of the postgis tests.
5201
5202 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5203
5204 * test/test_postgis_db.py: New. Test cases for the postgis
5205 support.
5206
5207 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5208 format
5209
5210 * test/test_wellknowntext.py: New. Test cases for the
5211 wellknowntext parser
5212
5213 * test/postgissupport.py: New. Support module for tests involving
5214 a postgis database.
5215
5216 * test/support.py (execute_as_testsuite): Shut down the postmaster
5217 if it's still running after the tests
5218
5219 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5220 well known text format
5221
5222 2003-08-19 Jan-Oliver Wagner <[email protected]>
5223
5224 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5225 message dialog.
5226
5227 2003-08-18 Bernhard Herzog <[email protected]>
5228
5229 * test/support.py (ThubanTestResult.printErrors): Indent the
5230 reason for the skips in the output to make it a bit more readable.
5231 (execute_as_testsuite): New helper function to run a test suite
5232 and print some more information.
5233 (run_tests): Use execute_as_testsuite to run the tests
5234
5235 * test/runtests.py (main): Use execute_as_testsuite to run the
5236 tests
5237
5238 2003-08-18 Bernhard Herzog <[email protected]>
5239
5240 Fix some bugs in Thuban and the test suite that were uncovered by
5241 changes introduced in Python 2.3:
5242
5243 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5244 filename is an absolute name
5245
5246 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5247 filename is an absolute name
5248
5249 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5250 unique filename to save to and use the correct relative filename
5251 in the expected output.
5252 (SaveSessionTest.test_dbf_table): Use the correct relative
5253 filename in the expected output.
5254
5255 * test/test_layer.py (TestLayer.test_raster_layer): Update the
5256 test to check whether the filename is absolute.
5257
5258 2003-08-18 Jan-Oliver Wagner <[email protected]>
5259
5260 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5261
5262 2003-08-15 Bernhard Herzog <[email protected]>
5263
5264 Change the way shapes are returned by a shape store. The
5265 ShapesInRegion method returns an iterator over actual shape
5266 objects instead of a list of shape ids.
5267
5268 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5269 id.
5270 (ShapefileStore.ShapesInRegion): Return an iterator over the
5271 shapes which yields shape objects instead of returning a list of
5272 shape ids
5273 (ShapefileStore.AllShapes): New. Return an iterator over all
5274 shapes in the shape store
5275 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5276
5277 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5278 doc-string.
5279
5280 * Thuban/UI/baserenderer.py
5281 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5282 layer_shapes and make it return an iterator containg shapes
5283 instead of a list of ids.
5284 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5285 layer_shapes() change
5286
5287 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5288 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5289
5290 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5291 changes in the ShapesInRegion return value.
5292 (ViewPort._get_hit_tester): Remove commented out code
5293
5294 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5295 new return value.
5296 (SimpleShapeStore.AllShapes): New. Implement this method too.
5297
5298 * test/test_layer.py (TestLayer.test_arc_layer)
5299 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5300 (TestLayer.test_point_layer_with_projection)
5301 (TestLayer.test_derived_store): Adapt to changes in the
5302 ShapesInRegion return value.
5303
5304 * test/test_shapefilestore.py
5305 (TestShapefileStoreArc.test_shapes_in_region)
5306 (TestShapefileStorePolygon.test_shapes_in_region)
5307 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5308 in the ShapesInRegion return value.
5309 (TestShapefileStorePoint.test_all_shapes)
5310 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5311 methods
5312
5313 * test/test_derivedshapestore.py
5314 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5315 the ShapesInRegion return value.
5316 (TestDerivedShapeStore.test_all_shapes)
5317 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5318 methods
5319
5320 2003-08-15 Bernhard Herzog <[email protected]>
5321
5322 Make the renderers deal correctly with raw vs. python level
5323 representation of shape geometries
5324
5325 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5326 Return a flag useraw in addition to the callable and the parameter
5327 to indicate whether the callable can deal with the raw shape data
5328 or uses the higher level python lists of coordinates. The callable
5329 now should accept either the raw data or the return value of the
5330 shape's Points() method.
5331 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5332 change
5333 (BaseRenderer.projected_points): Instead of the shape id use the
5334 points list as parameter.
5335 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5336 (BaseRenderer.draw_point_shape): Adapt to projected_points()
5337 change and accept the points list as parameter instead of the
5338 shape id.
5339
5340 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5341 the useraw flag as required by the BaseRenderer
5342 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5343 changes.
5344
5345 * test/test_baserenderer.py
5346 (TestBaseRenderer.test_point_with_classification): New test for
5347 rendering a map with classifications.
5348
5349 2003-08-15 Bernhard Herzog <[email protected]>
5350
5351 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5352 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5353 (ViewPort._get_hit_tester, ViewPort.projected_points)
5354 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5355 (ViewPort._find_label_at): Split the find_shape_at method into
5356 several new methods and use the functions in the hit-test module.
5357
5358 * Thuban/UI/hittest.py: New module with Python-level hit-testing
5359 functions
5360
5361 * test/test_hittest.py: New. Test for the new hittest module
5362
5363 2003-08-15 Bernhard Herzog <[email protected]>
5364
5365 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5366 projection to all corners of the bounding box to get a better
5367 approximation of the projected bounding box
5368
5369 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5370 New. Test coordinate handling of a layer with a projection.
5371 Catches the bug fixed in Layer.ShapesInRegion
5372
5373 2003-08-15 Bernhard Herzog <[email protected]>
5374
5375 Move some of the mock objects in test_baserenderer into their own
5376 module so they can easily be used from other tests
5377
5378 * test/mockgeo.py: New test helper module with some mock objects
5379 for geometry related things like shapes, shapestores and
5380 projections.
5381
5382 * test/test_mockgeo.py: New. Tests for the new helper module
5383
5384 * test/test_baserenderer.py: Some of the mock-objects are in
5385 mockgeo now.
5386
5387 2003-08-12 Jan-Oliver Wagner <[email protected]>
5388
5389 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5390
5391 2003-08-12 Bernhard Herzog <[email protected]>
5392
5393 * po/de.po: New. German translations by Bjoern Broscheit
5394
5395 2003-08-12 Bernhard Herzog <[email protected]>
5396
5397 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5398 strings have to be one string literal.
5399
5400 2003-08-11 Bernhard Herzog <[email protected]>
5401
5402 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5403 New. This method was used in various derived classes, but it's
5404 better to have it here.
5405
5406 * test/test_shapefilestore.py
5407 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5408 FloatComparisonMixin
5409
5410 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5411 It's now in FloatComparisonMixin
5412
5413 * test/test_derivedshapestore.py
5414 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5415 in FloatComparisonMixin
5416
5417 2003-08-11 Bernhard Herzog <[email protected]>
5418
5419 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5420 error message
5421
5422 2003-08-08 Jan-Oliver Wagner <[email protected]>
5423
5424 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5425 with version number.
5426 Changed title to reflect version number of Thuban.
5427
5428 2003-08-08 Jan-Oliver Wagner <[email protected]>
5429
5430 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5431 the list corresponds to the "About" web page.
5432
5433 2003-08-08 Bernhard Herzog <[email protected]>
5434
5435 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5436 Make sure translated strings are recognized as one string literal.
5437
5438 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5439 Make sure translated strings are recognized as one string literal.
5440
5441 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5442 translated strings are recognized as one string literal.
5443
5444 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5445 sure translated strings are recognized as one string literal.
5446
5447 2003-08-07 Bernhard Herzog <[email protected]>
5448
5449 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5450 Simply delegates to the original shapestore.
5451
5452 * test/test_derivedshapestore.py
5453 (TestDerivedShapeStore.test_raw_format): New. Test case for
5454 DerivedShapeStore.RawShapeFormat
5455
5456 2003-08-07 Bernhard Herzog <[email protected]>
5457
5458 Add raw data interface to shape objects.
5459
5460 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5461 class to ShapefileShape which now holds shapefile specific
5462 information.
5463 (ShapefileShape.compute_bbox): Simplified to not cache any
5464 information. The way this method is used that shouldn't matter
5465 performance wise.
5466 (ShapefileShape.RawData): New. Return the shapeid which is the raw
5467 data format for shapes from shapefiles.
5468 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5469 in the shape objects returned by a shapestore. For a
5470 ShapefileStore this is always RAW_SHAPEFILE.
5471 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5472 method.
5473
5474 * test/test_shapefilestore.py
5475 (TestShapefileStore.test_raw_format): New test to test the raw
5476 format feature of shapes.
5477
5478 * Thuban/Model/layer.py: Remove the unused import of Shape from
5479 data. It was only there for interface compatibility but it's not
5480 used inside of Thuban and the generic Shape class has gone away.
5481
5482 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5483 the raw data format and only use an optimized version of its a
5484 shapefile.
5485
5486 2003-08-07 Bernhard Herzog <[email protected]>
5487
5488 * test/test_baserenderer.py (SimpleShape): Shape class for the
5489 tests.
5490 (SimpleShapeStore.Shape): Use SimpleShape instead of
5491 Thuban.Model.data.Shape to make the tests independed of the coming
5492 changes.
5493
5494 2003-08-07 Bernhard Herzog <[email protected]>
5495
5496 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5497 (ThubanTestProgram): New classes that extend the respective
5498 classes from unittest. These new version support skipping tests
5499 under certain expected conditions. In the Thuban test suite we
5500 uses this for tests that require the optional gdal support.
5501 (run_tests): Use ThubanTestProgram instead of the unittest.main()
5502
5503 * test/runtests.py (main): Use the new ThubanTestRunner instead of
5504 the normal one from unittest
5505
5506 * test/test_layer.py (TestLayer.test_raster_layer): If this test
5507 is not run because gdal support isn't available report this to the
5508 runner.
5509
5510 * test/test_baserenderer.py
5511 (TestBaseRenderer.test_raster_no_projection): Do not run this test
5512 if gdal support isn't available and report this to the runner.
5513
5514 2003-08-06 Bernhard Herzog <[email protected]>
5515
5516 Rearrange the renderers a bit, partly in preparation for changes
5517 required for the postgis merge, partly to make it more testable.
5518 Also make the representation of coordinates in Shapes more
5519 consistent.
5520
5521 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5522 this class is now in BaseRenderer. This class is now practically
5523 only a specialization of BaseRenderer for rendering to an actual
5524 wx DC.
5525 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5526 to get the shapetype specific rendering functions.
5527
5528 * Thuban/UI/baserenderer.py: New file with the basic rendering
5529 logic. The code in this file is completely independend of wx.
5530 (BaseRenderer): Class with the basic rendering logic
5531
5532 * test/test_baserenderer.py: New. Test cases for BaseRenderer
5533
5534 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5535 error_on_redraw to guard agains endless loops and stack overflows
5536 when there's a bug in the rendering code that raises exceptions.
5537 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5538 rendering into a separate method _do_redraw so that error handling
5539 is a bit easier. When an exception occurs, set error_on_redraw to
5540 true. When it's true on entry to OnIdle do nothing and return
5541 immediately.
5542
5543 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5544 Shape object will always have the coordinates as a list of list of
5545 coordinate pairs (tuples).
5546 (Shape.compute_bbox): Adapt to new representation.
5547
5548 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5549 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5550 Shape objects.
5551
5552 * test/test_shapefilestore.py
5553 (ShapefileStoreTests.assertFloatTuplesEqual)
5554 (ShapefileStoreTests.assertPointListEquals): Rename to
5555 assertPointListEquals and change purpose to checking equality of
5556 the lists returned by Shape.Points().
5557 (TestShapefileStoreArc.test_shape)
5558 (TestShapefileStorePolygon.test_shape)
5559 (TestShapefileStorePoint.test_shape): Use the new
5560 assertPointListEquals instead of assertFloatTuplesEqual
5561
5562 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5563 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5564 and change purpose to checking equality of the lists returned by
5565 Shape.Points().
5566 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5567 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5568 (TestLayer.test_derived_store): Use the new assertPointListEquals
5569 instead of assertFloatTuplesEqual
5570
5571 * test/test_derivedshapestore.py
5572 (TestDerivedShapeStore.assertFloatTuplesEqual)
5573 (TestDerivedShapeStore.assertPointListEquals): Rename to
5574 assertPointListEquals and change purpose to checking equality of
5575 the lists returned by Shape.Points().
5576 (TestDerivedShapeStore.test_shape): Use the new
5577 assertPointListEquals instead of assertFloatTuplesEqual
5578
5579 2003-08-06 Jan-Oliver Wagner <[email protected]>
5580
5581 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
5582 a bounding box. A dialog is raised in case, no bounding box
5583 is found. This fixes bug #2043:
5584 https://intevation.de/rt/webrt?serial_num=2043
5585
5586 2003-08-05 Bernhard Herzog <[email protected]>
5587
5588 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
5589 object look like a Color instantiation. Formerly it looked like a
5590 tuple.
5591
5592 * test/test_color.py (TestColor.test_repr)
5593 (TestColor.test_equality, TestColor.test_inequality): New. test
5594 some more apects of the Color class
5595 (TestTransparent.test_repr, TestTransparent.test_hex)
5596 (TestTransparent.test_equality): New. Test cases for the
5597 Transparent object.
5598
5599 2003-08-04 Jan-Oliver Wagner <[email protected]>
5600
5601 * Doc/manual/thuban-manual.xml: a number of small improvements.
5602 The resulting file is the version submitted for GREAT-ER II.
5603
5604 2003-08-01 Bernhard Herzog <[email protected]>
5605
5606 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
5607 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
5608 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
5609
5610 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
5611 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
5612 (ThubanEndBusyCursor): Add doc-strings
5613
5614 2003-08-01 Bernhard Herzog <[email protected]>
5615
5616 First step towards PostGIS integration. More abstraction by movin
5617 more code from the layer to the shapestore. More methods of the
5618 layer are now simply delegated to the equivalent method of the
5619 shapestore. The SHAPETYPE_* constants are now in data not in
5620 layer.
5621
5622 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5623 (SHAPETYPE_POINT, Shape): Move these constants and classes from
5624 layer.py to data.py
5625 (ShapefileStore.__init__): More Initialization for the new methods
5626 and functionality.
5627 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
5628 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
5629 (ShapefileStore.Shape): New methods that were formerly implemented
5630 in the layer.
5631 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
5632 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
5633 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
5634 equivalents of the new shape methods. These versions are simply
5635 delegated to the original shapstore.
5636
5637 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5638 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
5639 (Layer.SetShapeStore): Removed the initializatin of instance
5640 variables that were needed for the stuff that's now in
5641 ShapefileStore
5642 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
5643 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
5644 shapestore.
5645
5646 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
5647 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
5648 instead of layer.
5649
5650 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
5651
5652 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
5653
5654 * test/test_layer.py: Import the SHAPETYPE_* constants from data
5655 instead of layer.
5656 (TestLayer.test_derived_store): Remove the test for the exception
5657 when instantiating the DerivedShapeStore with an incompatible
5658 table which is now in test_derivedshapestore.py. Add some more
5659 tests of the layer methods to determine whether they work for a
5660 DerivedShapeStore as well.
5661
5662 2003-07-31 Jonathan Coles <[email protected]>
5663
5664 * Doc/manual/thuban-manual.xml: Fix the list of required packages
5665 by just listing the name and where they can be found.
5666
5667 2003-07-31 Frank Koormann <[email protected]>
5668
5669 * Doc/manual/thuban-manual.xml:
5670 Changed the screenshot elements to figure.
5671 Changed some variablelist elements to itemizedlist.
5672 Added section on GDAL formats.
5673
5674 2003-07-31 Jonathan Coles <[email protected]>
5675
5676 * Doc/manual/thuban-manual.xml: Added a few sentences about
5677 the Fix Border Color option when generating classes.
5678
5679 2003-07-30 Jonathan Coles <[email protected]>
5680
5681 * Thuban/Model/classgen.py: Add docstrings. Rename specific
5682 Ramp instances to use lower_case_style.
5683
5684 * Thuban/UI/classgen.py: Use renamed Ramp instances.
5685
5686 * Thuban/UI/classifier.py: Add docstrings.
5687
5688 * Thuban/UI/dock.py: Add docstrings.
5689
5690 * test/test_classgen.py: Use renamed Ramp instances.
5691
5692 2003-07-30 Bernhard Herzog <[email protected]>
5693
5694 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5695 was never used in Thuban.
5696
5697 2003-07-30 Bernhard Herzog <[email protected]>
5698
5699 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5700 method directly instead of going through the transient_table
5701 method. This faster because transient_table may force the copy of
5702 a DBF file into the transient database and setting a table's title
5703 doesnm't affect the title of the associated transient table, so
5704 this fixes RT #2042
5705
5706 * Thuban/UI/main.py (__version__): Don't import the already
5707 removed show_exception_dialog.
5708
5709 2003-07-29 Jonathan Coles <[email protected]>
5710
5711 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5712 Put back this method and remove the equivalent function since we
5713 are setting the exception hook from within this class (OnInit).
5714
5715 2003-07-29 Jonathan Coles <[email protected]>
5716
5717 * Doc/manual/images/5_2_custom_ramp.png,
5718 Doc/manual/images/5_2_quantiles.png,
5719 Doc/manual/images/5_2_uniform_dist.png,
5720 Doc/manual/images/5_2_unique_values.png,
5721 Doc/manual/images/8_int_error.png: New screen shots.
5722
5723 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5724 some points, and added more screen shots.
5725
5726 2003-07-29 Bernhard Herzog <[email protected]>
5727
5728 * Thuban/Model/data.py: Remove the now unused import of warnings
5729
5730 2003-07-29 Bernhard Herzog <[email protected]>
5731
5732 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5733 deprecated since before the 0.8 release and isn't used in Thuban
5734 itself anymore.
5735
5736 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5737
5738 2003-07-29 Jonathan Coles <[email protected]>
5739
5740 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5741 python exception hook here so that we are sure to catch any
5742 Thuban exception that happen during initialization.
5743
5744 * Thuban/UI/main.py (main): Don't set the exception hook here,
5745 it will get set in ThubanApplication.OnInit.
5746
5747 2003-07-29 Jonathan Coles <[email protected]>
5748
5749 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5750 Removed and called it show_exception_dialog() so that the exception
5751 handler can be set before the class is created.
5752
5753 * Thuban/UI/main.py (main): Install the exception handler before
5754 a ThubanApplication is created.
5755
5756 2003-07-29 Bernhard Herzog <[email protected]>
5757
5758 * po/it.po: New. Italian translation by Maurizio Napolitano
5759
5760 * po/ru.po: New. Russian translation by Alex Shevlakov
5761
5762 2003-07-29 Frank Koormann <[email protected]>
5763
5764 * Doc/manual/thuban-manual.xml: Extended section on supported
5765 projections.
5766
5767 2003-07-29 Frank Koormann <[email protected]>
5768
5769 * Doc/manual/thuban-manual.xml: gaspell-checked.
5770
5771 2003-07-29 Jonathan Coles <[email protected]>
5772
5773 * Doc/manual/images/3_5_legend.png: Added border to improve look
5774 on white background.
5775
5776 2003-07-29 Jonathan Coles <[email protected]>
5777
5778 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5779 descriptions for the legend toolbar.
5780
5781 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5782 cursor from dialog box.
5783
5784 2003-07-28 Jonathan Coles <[email protected]>
5785
5786 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5787
5788 * Doc/manual/images/2_4_session_tree.png,
5789 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5790 Doc/manual/images/4_2_layer_properties.png,
5791 Doc/manual/images/4_2_raster_layer_properties.png,
5792 Doc/manual/images/5_3_genclass.png,
5793 Doc/manual/images/5_classification.png,
5794 Doc/manual/images/6_projection.png,
5795 Doc/manual/images/7_1_table_view.png,
5796 Doc/manual/images/7_2_5_join.png: New screenshots.
5797
5798 2003-07-24 Jonathan Coles <[email protected]>
5799
5800 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5801
5802 2003-07-24 Jonathan Coles <[email protected]>
5803
5804 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5805 chapter on Layer Management.
5806
5807 * Doc/manual/Makefile: New. Makefile to generate all formats for the
5808 manual and images.
5809
5810 2003-07-24 Bernhard Herzog <[email protected]>
5811
5812 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5813 it annoys lintian which warns about these files not being
5814 executable. The #! isn't necessary here since if you absolutely
5815 must execute them you can always say "python <filename>".
5816
5817 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5818 superfluous code to set brush and pen for point shapes
5819
5820 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5821 belong in viewport anyway
5822
5823 2003-07-24 Frank Koormann <[email protected]>
5824
5825 * Doc/manual/thuban-manual.xml: Added section on table management.
5826
5827 2003-07-24 Bernhard Herzog <[email protected]>
5828
5829 * test/runtests.py (main): Recognize the long "verbose" option
5830 correctly.
5831
5832 2003-07-22 Jonathan Coles <[email protected]>
5833
5834 * Doc/manual/thuban-manual.xml: Continue to write first revision
5835 of the manual.
5836
5837 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5838 with Begin/EndDrawing() calls to ensure we aren't doing to
5839 many updates to the dc during rendering.
5840 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5841 a pen and brush argument so they need to be passed to the function.
5842
5843 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5844 Calculates the minimum and maximum scale values. Factored out
5845 of set_view_transform so that it could be used to zoom all the
5846 way into a single point.
5847 (ViewPort.set_view_transform): Call calc_min_max_scales().
5848 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5849 if only a single point is selected.
5850
5851 * Doc/manual/images/1_2_legend_close.png,
5852 Doc/manual/images/1_2_legend_dock.png,
5853 Doc/manual/images/1_2_mainwindow.png,
5854 Doc/manual/images/1_2_mainwindow.ps,
5855 Doc/manual/images/1_2_mainwindow.sk,
5856 Doc/manual/images/3_2_fullextent.png,
5857 Doc/manual/images/3_2_fulllayerextent.png,
5858 Doc/manual/images/3_2_fullshapeextent.png,
5859 Doc/manual/images/3_2_pan.png,
5860 Doc/manual/images/3_2_zoomin.png,
5861 Doc/manual/images/3_2_zoomout.png,
5862 Doc/manual/images/3_3_identify.png,
5863 Doc/manual/images/3_3_label.png,
5864 Doc/manual/images/3_5_invisible.png,
5865 Doc/manual/images/3_5_movedown.png,
5866 Doc/manual/images/3_5_moveup.png,
5867 Doc/manual/images/3_5_props.png,
5868 Doc/manual/images/3_5_tobottom.png,
5869 Doc/manual/images/3_5_totop.png,
5870 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5871
5872 2003-07-18 Bernhard Herzog <[email protected]>
5873
5874 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5875
5876 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5877 after the new map has been assigned
5878
5879 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5880 Delegate MAP_REPLACED to the canvas too
5881 (MainWindow.prepare_new_session): Removed. Thanks to the new
5882 MAP_REPLACED message it's no longer needed
5883 (MainWindow.OpenSession, MainWindow.NewSession):
5884 prepare_new_session has been removed.
5885
5886 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5887 MAP_REPLACED so that we can close the dialog if a new map is set.
5888 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5889 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5890 dialog
5891
5892 * test/test_viewport.py (SimpleViewPortTest)
5893 (SimpleViewPortTest.test_default_size): Add doc-strings
5894 (ViewPortTest.setUp): Bind map to self.map so we can use it in
5895 tests. Subscribe to MAP_REPLACED messages too.
5896 (ViewPortTest.tearDown): No need to explicitly unsubscribe
5897 (ViewPortTest.test_set_map): New test for the SetMap method.
5898
5899 2003-07-18 Bernhard Herzog <[email protected]>
5900
5901 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5902 Move this test from ViewPortTest.setUp to this new separate test
5903 case. setUp is not the place for the actual tests.
5904 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5905 more of the test from setUp to the new test test_inital_settings.
5906 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5907 (ViewPortTest.test_proj_conv): Split test_proj_conv into
5908 test_win_to_proj and test_proj_to_win and make the tests easier to
5909 understand
5910 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5911 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5912 (ViewPortTest.test_unprojected_rect_around_point)
5913 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5914 Reformat to increase readability.
5915
5916 2003-07-18 Bernhard Herzog <[email protected]>
5917
5918 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5919
5920 2003-07-18 Bernhard Herzog <[email protected]>
5921
5922 * test/runtests.py: The test suite can now be run without an X
5923 connection. To make sure this remains true, remove the DISPLAY
5924 environment variable so that an error occurs if the wxGTK is
5925 imported accidentally
5926
5927 2003-07-18 Bernhard Herzog <[email protected]>
5928
5929 * Thuban/UI/viewport.py: Remove unused imports
5930
5931 * Thuban/UI/view.py: Remove unused imports
5932
5933 2003-07-18 Bernhard Herzog <[email protected]>
5934
5935 * test/test_export.py Remove unused imports. The OutputTransform
5936 function is now in viewport.py and is called output_transform
5937 (TestScalebar.test_output_transform)
5938 (TestScalebar.test_OutputTransform): Renamed to
5939 test_output_transform and updated to use output_transform instead
5940 of OutputTransform
5941
5942 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5943 renamed.
5944 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5945 renamed to output_transform
5946
5947 * Thuban/UI/viewport.py (OutputTransform, output_transform):
5948 Rename to output_transform
5949
5950 2003-07-18 Bernhard Herzog <[email protected]>
5951
5952 * Thuban/Model/layer.py (Layer.__init__): Rename
5953 classificationField to classificatin_column and init it here so
5954 that it can be used in SetClassificationColumn
5955 (Layer.GetClassificationColumn, Layer.GetClassificationField):
5956 Rename to GetClassificationColumn.
5957 (Layer.SetClassificationColumn, Layer.SetClassificationField):
5958 Rename to SetClassificationColumn and issue a LAYER_CHANGED
5959 message if the column changes.
5960 (Layer._classification_changed, Layer.ClassChanged): Rename to
5961 _classification_changed. Update the callers.
5962 (Layer.SetShapeStore): Further field->column renames.
5963
5964 * Thuban/Model/load.py (SessionLoader.start_classification)
5965 (SessionLoader.start_clpoint): Updates because of
5966 field->column method name changes in the Layer class
5967
5968 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5969 because of field->column method name changes in the Layer class
5970
5971 * Thuban/UI/classifier.py (Classifier.__init__)
5972 (Classifier._OnTry, Classifier._OnRevert): Updates because of
5973 field->column method name changes in the Layer class
5974
5975 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5976 because of field->column method name changes in the Layer class
5977
5978 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5979 of field->column method name changes in the Layer class
5980
5981 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5982 (SaveSessionTest.testClassifiedLayer): Update because of
5983 field->column method name changes in the Layer class
5984
5985 * test/test_layer.py (SetShapeStoreTests.setUp)
5986 (SetShapeStoreTests.test_sanity): Update because of field->column
5987 method name changes in the Layer class
5988 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5989 (TestLayerModification.test_sanity)
5990 (TestLayerModification.test_initial_settings): remove unsued code
5991 and rename to test_sanity.
5992 (TestLayerModification.test_set_classification): New test for
5993 SetClassification and SetClassificationField.
5994
5995 2003-07-18 Bernhard Herzog <[email protected]>
5996
5997 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5998 the non-fixed values as well. The old test would have accepted a
5999 fixed ramp that only returnes the fixed properties
6000
6001 2003-07-17 Jonathan Coles <[email protected]>
6002
6003 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6004 shots for the manual. The XCF file is the source image and
6005 has additional layers to support changes.
6006
6007 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6008
6009 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6010 Return both the new class and the field name.
6011
6012 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6013 fit the map to the window as this changes any zoom level that
6014 the user may have set.
6015
6016 2003-07-16 Jonathan Coles <[email protected]>
6017
6018 * Thuban/Model/classgen.py (generate_singletons,
6019 generate_uniform_distribution, generate_quantiles): Remove
6020 fixes parameter, but maintain the same functionality by having
6021 the calling function pass a FixedRamp object for the ramp.
6022 (FixedRamp): New. Adapts a ramp to have fixed property values.
6023
6024 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6025 (Classification): Inherit from Publisher.
6026 (Classification.__init__): Remove the layer parameter.
6027 Classifications no longer need to have a parent layer.
6028 (Classification.GetField, Classification.GetFieldType,
6029 Classification.SetFieldInfo): Removed. The field name is stored
6030 in the layer, and the type can be retreived by calling
6031 Layer.GetFieldType().
6032 (Classification._set_layer, Classification.GetLayer): Removed.
6033 Classifications no longer have a parent layer.
6034
6035 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6036 classification.
6037 (Layer.SetShapeStore): Reset the classification first while
6038 we still have the old shape store to work with.
6039 (Layer.GetClassificationField, Layer.SetClassificationField):
6040 New. Method for getting/setting the field to classify on.
6041 (Layer.SetClassification): Simplified now that the layer
6042 simply has to hold a reference to the classification and not
6043 tell the classification who owns it.
6044 Fixes RTbug #2023.
6045
6046 * Thuban/Model/load.py (SessionLoader.start_classification):
6047 Set the field name on the layer, not the classification.
6048
6049 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6050 classification is modified.
6051
6052 * Thuban/Model/save.py (SessionSaver.write_classification):
6053 Get the field name and type from the layer.
6054
6055 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6056 parameter records to rows and add docstring. Fixes RTbug #1997.
6057
6058 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6059 ramp when we need to fix certain values of a ramp rather than
6060 using the old fixes parameter. Fixes RTbug #2024.
6061
6062 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6063 parameter.
6064 (ClassTable.Reset): Add fieldType parameter and use it, rather
6065 than asking the classification.
6066 (Classifier.__init__): Remember the original class's field
6067 and ask the layer for the field type, rather than the classification.
6068 (Classifier.__SetGridTable): Retrieve the field and field type
6069 for the table because they are not in the classification.
6070 (Classifier._OnTry, Classifier._OnRevert): Set the classification
6071 field on the layer in addition to the classification itself.
6072
6073 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6074 classification field from layer.
6075
6076 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6077 classification field from layer. Split up tests and remove
6078 *-imports. Fixes RTbug #1992.
6079
6080 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6081
6082 * test/test_classification.py
6083 (TestClassification.test_classification): Remove tests for methods
6084 that no longer exist.
6085
6086 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6087 __init__ no longer has a field parameter, use SetClassificationField.
6088 (SetShapeStoreTests.test_sanity): Use layer object to get class
6089 field info.
6090
6091 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6092 SetClassificationField on layer to set class field info.
6093
6094 * test/test_viewport.py: Renamed from test/test_view.py.
6095
6096 2003-07-16 Jan-Oliver Wagner <[email protected]>
6097
6098 * Doc/manual/thuban-manual.xml: Added authors and an initial
6099 coarse structure.
6100
6101 2003-07-15 Bernhard Herzog <[email protected]>
6102
6103 * test/support.py (FloatComparisonMixin): This is a mix-in class
6104 and therefore should not be derived from any other class.
6105
6106 * test/test_range.py (RangeTest): FloatComparisonMixin is a
6107 mix-in, so derive from TestCase as well.
6108
6109 2003-07-15 Bernhard Herzog <[email protected]>
6110
6111 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6112 draw_func handling a bit to remove one layer of indirection. This
6113 makes the renderer about 10% faster in the non-classifying case
6114 and the code a bit cleaner
6115 (MapRenderer.draw_point_shape): Add the pen and brush parameters
6116 and set them in the dc. Now the draw_point_shape method and
6117 wxproj's draw_polygon_shape function have basically the same
6118 signature so that both can be directly used as draw_func
6119
6120 2003-07-15 Bernhard Herzog <[email protected]>
6121
6122 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6123 string values (in addition to the labels) as UTF 8
6124
6125 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6126 values if the field type is string
6127
6128 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6129 saving a session with non-ascii string classification values.
6130
6131 * test/test_load.py (TestClassification.file_contents)
6132 (TestClassification.test): Check for non-ascii values in string
6133 classifications
6134
6135 2003-07-14 Jonathan Coles <[email protected]>
6136
6137 * test/test_view.py: New. Tests for ViewPort.
6138
6139 2003-07-14 Frank Koormann <[email protected]>
6140
6141 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6142 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6143
6144 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6145 unicode strings from session file: session title, map title and
6146 projection name.
6147
6148 2003-07-10 Jonathan Coles <[email protected]>
6149
6150 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6151 drag_stop, not drag_move when the mouse is released.
6152
6153 2003-07-10 Jonathan Coles <[email protected]>
6154
6155 The most important part of this is the seperation of view.py into
6156 two pieces. viewport.py now has a class called ViewPort which
6157 contains all the non-wx parts of view.py and can therefore be
6158 tested. view.py contains only the wx-specific parts and is fairly
6159 simple.
6160
6161 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6162 RTTbug #1992.
6163 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6164 RTTbug #1992.
6165
6166 * Thuban/Model/classgen.py (generate_singletons,
6167 generate_uniform_distribution, generate_quantiles):
6168 Added 'fixes' parameter so that property attributes can
6169 be held constant over the generated classification groups.
6170 (CustomRamp.GetProperties): Remove unused variables.
6171
6172 * Thuban/Model/map.py (Map.SetProjection): Send the old
6173 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6174 event.
6175
6176 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6177 parameter which is a list of records that restricts which
6178 records are saved. Fixes RTbug #1997.
6179
6180 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6181 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6182
6183 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6184 to allow the user to fix line color/width on generated groups.
6185 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6186 functions to optionally fix group properties.
6187
6188 * Thuban/UI/main.py (main): Set exception hook to the
6189 ShowExceptionDialog. Fixes RTbug #1993.
6190
6191 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6192 the table window when it is selectd to be shown.
6193
6194 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6195 Export Selection button and move the export buttons underneath
6196 the table.
6197 (QueryTableFrame.UpdateStatusText): Added event argument so
6198 that it can respond to grid selection events. The status text
6199 is now updated even when the table is not associated with a
6200 layer as was previously assumed.
6201 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6202 UpdateStatusText responds to these events.
6203 (QueryTableFrame.OnSaveAs): Renamed to doExport.
6204 (QueryTableFrame.doExport): Helper function that saves the
6205 entire table, or selected rows, to a file.
6206 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6207 Respond to export button events and call doExport.
6208
6209 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6210 the function doesn't return NULL without first setting a Python
6211 Error.
6212
6213 * test/runtests.py (main): Only print "Unknown option" for
6214 unsupported options.
6215
6216 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6217 optional epsilon argument to specify floating point accuracy.
6218 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6219 for each item test.
6220
6221 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6222 tests for saving selected records.
6223
6224 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6225 tests for saving selected records.
6226
6227 * test/test_map.py (TestMapWithContents.test_set_projection):
6228 MAP_PROJECTION_CHANGED events send the old projection.
6229
6230 * test/test_session.py
6231 (TestSessionWithContent.test_forward_map_projection):
6232 MAP_PROJECTION_CHANGED events send the old projection.
6233
6234 * test/test_table.py (TableTest): Update tests to use non-deprecated
6235 functions.
6236
6237 2003-07-08 Bernhard Herzog <[email protected]>
6238
6239 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6240 constants in the column objects are the standard ones defined in
6241 the table module.
6242
6243 * test/test_transientdb.py
6244 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6245 exporting transient tables as DBF works. This should catch the bug
6246 just fixed in TransientTableBase.Width.
6247
6248 2003-07-08 Bernhard Herzog <[email protected]>
6249
6250 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6251 interpolated colors correctly.
6252
6253 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6254 New. Test case for the fix in classgen.py
6255
6256 2003-07-08 Bernhard Herzog <[email protected]>
6257
6258 * test/runtests.py (main): Make the default output less verbose
6259 and add a verbosity option (-v) to get the old output
6260
6261 2003-07-08 Bernhard Herzog <[email protected]>
6262
6263 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6264 0.9.
6265
6266 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6267 New. Return the join type
6268
6269 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6270 DTD
6271 (SessionSaver.write_data_containers): Save the join type for
6272 joined tables
6273
6274 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6275 namespace
6276 (SessionLoader.start_jointable): Handle the jointype attribute
6277
6278 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6279 as of Thuban 0.8. These are now tests to determine whether Thuban
6280 can still read files generated by Thuban 0.8
6281
6282 * test/test_load.py (LoadSessionTest.dtd)
6283 (TestSingleLayer.file_contents)
6284 (TestLayerVisibility.file_contents, TestLabels.file_contents)
6285 (TestLayerProjection.file_contents)
6286 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6287 (TestJoinedTable.file_contents)
6288 (TestLoadError.file_contents): Update for new DTD
6289 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6290 for new join type attribute
6291
6292 * test/test_save.py (SaveSessionTest.dtd)
6293 (SaveSessionTest.testEmptySession)
6294 (SaveSessionTest.testSingleLayer)
6295 (SaveSessionTest.testLayerProjection)
6296 (SaveSessionTest.testRasterLayer)
6297 (SaveSessionTest.testClassifiedLayer)
6298 (SaveSessionTest.test_dbf_table)
6299 (SaveSessionTest.test_joined_table): Update for new DTD
6300 (SaveSessionTest.test_joined_table): Add test for new join type
6301 attribute
6302
6303 2003-07-04 Bernhard Herzog <[email protected]>
6304
6305 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6306 function for table_to_dbf
6307 (table_to_dbf): Deal with names longer than the 10 character limit
6308
6309 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6310 doc-string
6311 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6312 long column names
6313
6314 2003-07-03 Bernhard Herzog <[email protected]>
6315
6316 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6317
6318 2003-07-03 Bernhard Herzog <[email protected]>
6319
6320 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6321 for the Thuban manual and README with some basic information about
6322 the manual
6323
6324 2003-07-03 Bernhard Herzog <[email protected]>
6325
6326 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6327 Update doc-string
6328 (TransientJoinedTable.create): Do not modify the column objects of
6329 the input tables in place and copy all columns of the input tables
6330 into the joined table after all.
6331
6332 * test/test_transientdb.py
6333 (TestTransientTable.test_transient_joined_table_same_column_name):
6334 Update to reflect the new behavior
6335 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6336 Update to reflect the new behavior
6337 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6338 New test case for a bug which modified the column objects in place
6339
6340 2003-07-02 Jonathan Coles <[email protected]>
6341
6342 * Thuban/Model/classgen.py (generate_singletons,
6343 generate_uniform_distribution, generate_quantiles,
6344 GenQuantiles0): Make sure maxValue isn't less than
6345 one, otherwise we could divide by zero.
6346
6347 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6348 ClassGenTest.doClassSingleTest): Call doBoundsTest to
6349 check the end classification groups against the
6350 proper property values.
6351 (ClassGenTest.doBoundsTest): New. Checks the first and
6352 last classification groups to make sure their properties
6353 are the correct upper and lower bounds for a color ramp.
6354
6355 2003-07-02 Jonathan Coles <[email protected]>
6356
6357 * Thuban/Model/classgen.py (generate_singletons,
6358 generate_uniform_distribution, generate_quantiles,
6359 GenQuantiles0): The denominator was one to high when
6360 calculating the index for the ramp causing the index
6361 to never to reach one.
6362
6363 2003-07-02 Jonathan Coles <[email protected]>
6364
6365 Changed the singature of ClassGroupRange.__init__ and
6366 ClassGroupRange.SetRange() so that the min/max values are
6367 passed as a tuple. This makes a better calling scheme for
6368 when a Range object is passed instead.
6369
6370 * Thuban/Model/classgen.py: Fixed parameters to
6371 ClassGroupRange constructor.
6372
6373 * Thuban/Model/classification.py (ClassGroupRange.__init__):
6374 Consolidate the min/max parameters into a single _range which
6375 can either be a tuple or a Range object.
6376 (ClassGroupRange.SetRange): Consolidate the min/max parameters
6377 into a single _range which can either be a tuple or a Range object.
6378
6379 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6380 call to ClassGroupRange constructor to use a tuple.
6381
6382 * Thuban/Model/layer.py (Layer.SetClassification): Switch
6383 the classification instance variable to the new class
6384 before calling _set_layer otherwise subscribers to a
6385 LAYER_CHANGED event will not see any difference.
6386
6387 * test/test_classification.py: Fix tests of ClassGroupRange
6388 so that they use the new signature.
6389
6390 * test/test_load.py: Fix use of ClassGroupRange so that it
6391 uses the new signature.
6392
6393 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6394 uses the new signature.
6395
6396 * test/test_save.py: Fix use of ClassGroupRange so that it
6397 uses the new signature.
6398
6399
6400 2003-07-01 Jonathan Coles <[email protected]>
6401
6402 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6403 Import used objects/class from color.
6404 (generate_singletons): We don't
6405 need the numGroups parameter anymore because we are using
6406 the new ramps with GetProperties().
6407 (generate_uniform_distribution): Use new ramp method
6408 GetProperties().
6409 (generate_quantiles, GenQuantiles0): Use new ramp method
6410 GetProperties().
6411 (CustomRamp.SetNumGroups): Removed. The ramps now map
6412 a value from 0 to 1 to class properties so the number
6413 of groups is not needed ahead of time.
6414 (CustomRamp.next): Removed. CustomRamp does not support
6415 interation anymore.
6416 (CustomRamp.GetProperties): Returns a ClassGroupProperties
6417 object based on the index value from 0 to 1 that is
6418 passed to it.
6419 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6420 Made into instances of Monochromatic class instread of
6421 deriving from it.
6422 (HotToCold.SetNumGroups): Removed. See CustomRamp.
6423 (HotToCold.next): Removed. See CustomRamp.
6424
6425 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6426 (Classification.SetField, Classification.SetFieldType):
6427 Replaced with SetFieldInfo.
6428 (Classification.SetFieldInfo): New. Does a better job of
6429 what SetField and SetFieldType used to do by combining
6430 their function since they should really always be done
6431 at the same time.
6432 (Classification.SetLayer): Renamed to _set_layer.
6433 (Classification._set_layer): Should only be called from
6434 Layer's SetClassification. This does not cause a recursive
6435 call as SetLayer did because we know that Layer knows about
6436 the classification.
6437
6438 * Thuban/Model/color.py: Fixes RTbug #1971.
6439 (_Transparent): Renamed from Transparent so it doesn't
6440 conflict with the module variable.
6441 (Transparent, Black): Renamed from Color.Transparent,
6442 Color.Black so they are not class variables.
6443
6444 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6445 (Layer.Destroy): We don't need to call SetClassification
6446 anymore to clear out the back reference in the classifcation
6447 to the layer. It's better to set it to None using _set_layer,
6448 and we won't be creating another clas object too.
6449 (Layer.SetClassification): Classification._set_layer is not
6450 recursive so remove all the locking variables. Also clean
6451 up the code so that it remains unchanged if something fails.
6452
6453 * Thuban/Model/load.py: Fixes RTbug #1971.
6454 (SessionLoader.start_classification): Call
6455 Classification.SetFieldInfo().
6456
6457 * Thuban/Model/save.py: Removed import of Color which wasn't
6458 being used.
6459
6460 * Thuban/UI/classgen.py: Fixes RTbug #1972.
6461 (ClassGenDialog.__init__): Color ramps are now instances
6462 already so we don't need to create any new objects.
6463 (ClassGenDialog.OnOK): Check for numGroups is no longer
6464 necessary because we never use it.
6465
6466 * Thuban/UI/classifier.py: Fixes RTbug #1971.
6467 (Classifier.__BuildClassification, Classifier.__SetGridTable):
6468 Call Classification.SetFieldInfo() instead of SetFieldType.
6469
6470 * Thuban/UI/renderer.py: Fixes RTbug #1971.
6471
6472 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6473 (MapCanvas.__init__): Subscribe to the idle time event. Set
6474 background color to white.
6475 (MapCanvas.OnPaint): Set a flag indicating that we should
6476 render the map during idle time. If we already have a bitmap
6477 just draw it now.
6478 (MapCanvas.OnIdle): New. Render the map only during idle time.
6479 This also fixes a problem with the busy cursor under gtk.
6480
6481 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6482 Fix calls to generate_singletons because the signature changed.
6483
6484 * test/test_classification.py: Fix color references and
6485 change calls to Classification.[SetField|SetFieldType] to
6486 SetFieldInfo.
6487
6488 * test/test_load.py: Fix color references.
6489
6490 * test/test_load_0_2.py: Fix color references.
6491
6492 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6493 Change calls to Classification.[SetField|SetFieldType] to
6494 SetFieldInfo.
6495
6496 2003-07-01 Frank Koormann <[email protected]>
6497
6498 MERGE from the greater-ms3 branch.
6499
6500 * test/test_transientdb.py
6501 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6502 New. Test join of two tables with partly equal column names.
6503
6504 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6505 If duplicates in left and right tables column names are found,
6506 append '_' (underscores) to the name until it is unique.
6507 Create always new internal names for the resulting table and reference
6508 columns in the join statement with <table>.<column>
6509
6510 2003-07-01 Bernhard Herzog <[email protected]>
6511
6512 * test/test_transientdb.py
6513 (TestTransientTable.test_transient_joined_table_same_column_name):
6514 New. Test whether joining on columns with the same names in both
6515 tables works.
6516
6517 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6518 sure to use the right internal names even when joining on field
6519 with the same names in both tables. Also, detect duplicate names
6520 in the joined table correctly.
6521
6522 2003-07-01 Frank Koormann <[email protected]>
6523
6524 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6525 Reverse List of layers to render in same order as in desktop legend.
6526
6527 2003-06-30 Jonathan Coles <[email protected]>
6528
6529 * Thuban/version.py (make_tuple): Takes a version string
6530 and splits it into a tuple of at most three integers.
6531 Used make_tuple() to make tuple versions of the version
6532 numbers.
6533
6534 * Thuban/UI/about.py: Add Thuban email addresses.
6535
6536 2003-06-30 Jonathan Coles <[email protected]>
6537
6538 * Thuban/version.py: SQLite/PySQLite version dependencies
6539 were too high.
6540
6541 2003-06-30 Jonathan Coles <[email protected]>
6542
6543 * Thuban/version.py: Update version to 0.8.1
6544
6545 * MANIFEST.in: Added Projections so that default.proj is
6546 included.
6547
6548 2003-06-26 Jonathan Coles <[email protected]>
6549
6550 New About box with lots more information including library
6551 versions and credits. More/better version checking before
6552 Thuban starts.
6553
6554 * Thuban/UI/about.py: New. New About box that displays
6555 library version information and credits.
6556
6557 * Thuban/version.py: Added new 'versions' dictionary which
6558 contains the verions of various libraries which are checked
6559 when the module loads.
6560 (verify_versions): Check all version numbers and returns
6561 a list of errors.
6562
6563 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6564 Reset the status of the buttons as the situation warrants,
6565 but in a better more reliable way by not relying on the
6566 current status to determine what needs to change.
6567
6568 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6569 (verify_versions): Remove most of the code since it is
6570 now in Thuban.version.verify_versions.o
6571
6572 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6573 About box in Thuban.UI.about.
6574
6575 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
6576 Returns the version of gdal library being used as a string.
6577
6578 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6579 Removed.
6580 (get_proj_version): Return the version of PROJ that the file
6581 was compiled with.
6582 (get_gtk_version): Return th version of GTK that the file
6583 was compiled with.
6584
6585 2003-06-25 Jonathan Coles <[email protected]>
6586
6587 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
6588 of the SelectPropertiesDialog should be self so the window
6589 appears on top.
6590 (ClassGroupPropertiesCtrl.DoEdit): The parent
6591 of the SelectPropertiesDialog should be self so the window
6592 appears on top.
6593
6594 * Thuban/UI/resource.py: Cleaned up how we determine file
6595 extensions.
6596 (GetImageResource): Return an wxImage from our Resources.
6597
6598 2003-06-24 Jonathan Coles <[email protected]>
6599
6600 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6601 Check that a layer has a classification before trying
6602 to get it. Raster layers don't have classifications.
6603
6604 2003-06-23 Jonathan Coles <[email protected]>
6605
6606 * setup.py: Add Resources/XML to resource list.
6607
6608 2003-06-23 Jonathan Coles <[email protected]>
6609
6610 * setup.cfg: Fix copyright dates
6611
6612 2003-06-23 Jonathan Coles <[email protected]>
6613
6614 * MANIFEST.in: Update with Resources/XML
6615
6616 * setup.py: Don't include Locale resources yet as we don't
6617 have any and it causes problems building the distribution
6618 for Windows. Update version to 0.8.0.
6619
6620 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
6621
6622 * Thuban/UI/mainwindow.py: Add blank line at the end because
6623 file was not being read correctly building the Windows
6624 distribution.
6625
6626 2003-06-23 Jonathan Coles <[email protected]>
6627
6628 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
6629
6630 * Thuban/version.py: Temporarily update longversion for
6631 the 0.8 release so that it doesn't have the cvs revision.
6632
6633 2003-06-23 Jonathan Coles <[email protected]>
6634
6635 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
6636 to make sure that we don't create reentrant possibilities with
6637 wxYield.
6638
6639 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
6640 directly to avoid the wxSafeYield() call which generates an
6641 OnPaint event causing infinite recursion. Don't try to catch
6642 exception anymore. This was for before there were limits on map
6643 scaling.
6644
6645 2003-06-23 Bernhard Herzog <[email protected]>
6646
6647 Bug fix for RT #1961:
6648
6649 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
6650 Register DerivedShapestores with the session
6651
6652 * Thuban/Model/session.py (Session.Tables): Make sure each table
6653 is only listed once.
6654
6655 * test/test_load.py (TestJoinedTable.test): Add check_format call.
6656 Update file contents to match the one written out.
6657
6658 2003-06-20 Bernhard Herzog <[email protected]>
6659
6660 * test/xmlsupport.py (SaxEventLister.startElementNS)
6661 (SaxEventLister.endElementNS): Do not include the qname. Python
6662 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6663 is (presumably incorrectly) None, whereas it's a string with the
6664 element name in the later versions.
6665
6666 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6667 (TestEventList.test_even_list_namespace): Update tests to reflect
6668 the new behaviour
6669 (TestEventList.test_even_list_id_normalization): Fix doc-string
6670
6671 2003-06-20 Jonathan Coles <[email protected]>
6672
6673 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6674 by deriving classes to determine if that layer supports shapes.
6675 (Layer): Override HasShapes and return true.
6676
6677 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6678 instead of a direct call to wx[Begin|End]CusyCursor().
6679 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6680 table data.
6681
6682 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6683 New. Wrappers around the wxWindows functions that allow us to
6684 make additional calls such as wxYield which gives the native
6685 system a chance to update the cursor correctly.
6686
6687 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6688 instead of a direct call to wx[Begin|End]CusyCursor().
6689
6690 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6691 instead of a direct call to wx[Begin|End]CusyCursor().
6692 (MapCanvas.find_shape_at): Check if the current search layer
6693 support shapes, otherwise go on to the next layer.
6694
6695 * test/test_layer.py: Add tests in each type of layer for
6696 HasClassification() and HasShapes()
6697
6698 2003-06-20 Jonathan Coles <[email protected]>
6699
6700 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6701 turning on the busy cursor to allow the system to change the
6702 cursor before we begin painting. This fixes a problem that
6703 was occuring only under GTK. Fixes RTbug #1840.
6704
6705 2003-06-20 Bernhard Herzog <[email protected]>
6706
6707 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6708 version.
6709
6710 * Thuban/Model/save.py (sort_data_stores): New. Make topological
6711 sort of the data sources so they can be written with sources that
6712 data sources that depend on other data sources come after the
6713 sources they depend on.
6714 (SessionSaver.__init__): Add idmap instance variable to map from
6715 objects to the ids used in the file.
6716 (SessionSaver.get_id, SessionSaver.define_id)
6717 (SessionSaver.has_id): New. Methods to manage the idmap
6718 (SessionSaver.write): Use thuban-0.8.dtd
6719 (SessionSaver.write_session): Add a namespace on the session and
6720 write out the data sources before the maps.
6721 (SessionSaver.write_data_containers): New. Write the data
6722 containers.
6723 (SessionSaver.write_layer): Layer elements now refer to a
6724 shapestore and don't contain filenames anymore.
6725
6726 * Thuban/Model/load.py (LoadError): Exception class to raise when
6727 errors in the files are discovered
6728 (SessionLoader.__init__): Define dispatchers for elements with a
6729 thuban-0.8 namespace too.
6730 (SessionLoader.check_attrs): New helper method to check and
6731 convert attributes
6732 (AttrDesc): New. Helper class for SessionLoader.check_attrs
6733 (SessionLoader.start_fileshapesource)
6734 (SessionLoader.start_derivedshapesource)
6735 (SessionLoader.start_filetable, SessionLoader.start_jointable):
6736 Handlers for the new elements in the new fileformat
6737 (SessionLoader.start_layer): Handle the shapestore attribute in
6738 addition to filename.
6739 (SessionLoader.start_table, SessionLoader.end_table): Removed.
6740 They were never used in the old formats and aren't needed for the
6741 new.
6742
6743 * Thuban/Model/session.py (Session.DataContainers): New method to
6744 return all "data containers", i.e. shapestores and tables
6745
6746 * test/xmlsupport.py (SaxEventLister.__init__)
6747 (SaxEventLister.startElementNS, sax_eventlist): Add support to
6748 normalize IDs.
6749
6750 * test/test_xmlsupport.py
6751 (TestEventList.test_even_list_id_normalization): New test case for
6752 id normalization
6753
6754 * test/test_load.py (LoadSessionTest.check_format): Use ID
6755 normalization
6756 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6757 class atrributes used for ID normalization
6758 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6759 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6760 file format
6761 (TestJoinedTable): New test for loading sessions with joined
6762 tables.
6763 (TestLoadError): New. Test whether missing required attributes
6764 cause a LoadError.
6765
6766 * test/test_save.py (SaveSessionTest.thubanids)
6767 (SaveSessionTest.thubanidrefs): New class attributes for ID
6768 normalization in .thuban files.
6769 (SaveSessionTest.compare_xml): Use id-normalization.
6770 (SaveSessionTest.testEmptySession)
6771 (SaveSessionTest.testLayerProjection)
6772 (SaveSessionTest.testRasterLayer)
6773 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6774 (SaveSessionTest.testLayerProjection): The filename used was the
6775 same as for testSingleLayer. Use a different one.
6776 (SaveSessionTest.test_dbf_table)
6777 (SaveSessionTest.test_joined_table): New test cases for saving the
6778 new data sources structures.
6779 (TestStoreSort, MockDataStore): Classes to test the sorting of the
6780 data stores for writing.
6781
6782 * test/runtests.py: Add CVS keywords
6783
6784 2003-06-20 Jonathan Coles <[email protected]>
6785
6786 * test/test_session.py
6787 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6788 Use the cultural_landmark-point.dbf file for the store so that
6789 the table rows and shape count match.
6790
6791 2003-06-20 Jonathan Coles <[email protected]>
6792
6793 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6794 an exception if the number of shapes is different from the
6795 number of rows in the table. Address RTbug #1933.
6796
6797 * test/test_layer.py (TestLayer.test_derived_store): Add
6798 a test for the new exception in DerivedShapeStore.__init__.
6799
6800 * test/support.py (FloatTestCase): Removed since there is
6801 already FloatComparisonMixin. Fixes RTbug #1954.
6802 (FloatComparisonMixin.assertFloatEqual): Include test for
6803 infinity that was part of FloatTestCase.
6804
6805 * test/test_range.py (RangeTest): Inherit from
6806 support.FloatComparisonMixin now that we don't have
6807 support.FloatTestCase.
6808
6809 2003-06-20 Bernhard Herzog <[email protected]>
6810
6811 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6812 the implementation in xmlsupport instead.
6813 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6814
6815 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6816 of test_save
6817
6818 2003-06-20 Bernhard Herzog <[email protected]>
6819
6820 * test/test_load.py (LoadSessionTest.check_format): New helper
6821 method to make sure the test files we load might have been written
6822 by the current thuban version.
6823 (ClassificationTest.TestLayers, TestSingleLayer.test)
6824 (TestLayerVisibility.test, TestClassification.test)
6825 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6826 Add check_format() calls and fix the thuban data to match the data
6827 that would be written by saving the session loaded from it.
6828
6829 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6830 the same class and function in test_save.
6831
6832 * test/test_xmlsupport.py (TestEventList): New. test cases for
6833 sax_eventlist
6834
6835 2003-06-20 Bernhard Herzog <[email protected]>
6836
6837 * Resources/XML/thuban.dtd: Add comment about which versions of
6838 Thuban are covered by this DTD
6839 (map): Fix content model for layers and raster layers. There can
6840 be any number or layers and raster layers in any order.
6841
6842 2003-06-20 Jonathan Coles <[email protected]>
6843
6844 This is mainly about fixing RTbug #1949.
6845
6846 * Thuban/Model/classification.py: Remove "from __future__"
6847 import statement since python 2.2 is the earliest supported
6848 version.
6849
6850 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6851 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6852 depending on the units this projection *forwards* into.
6853
6854 * Thuban/Model/save.py (SessionSaver.write_classification):
6855 Remove unnecessary use of lambdas and nested functions.
6856
6857 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6858 adjustment here if the map projection uses degrees.
6859
6860 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6861 scale adjust code since it is now done before calling
6862 this method. Don't do anything if the map projection
6863 is None.
6864
6865 2003-06-19 Bernhard Herzog <[email protected]>
6866
6867 Move version specific load tests to their own file.
6868
6869 * test/test_load.py: Expand the doc-string to explain a bit how to
6870 handle file format changes.
6871 (TestClassification.test): Update the docstring as this test is
6872 not about Thuban 0.2 anymore.
6873
6874 * test/test_load_0_2.py: New file with the load tests for thuban
6875 files created with Thuban 0.2 and earlier.
6876
6877 2003-06-19 Bernhard Herzog <[email protected]>
6878
6879 Add XML validation to some of the tests. Validation will only be
6880 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6881 To make the DTD available to the test cases it's moved into
6882 Resources/XML
6883
6884 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6885 for versions up to and including 0.2. Two slight changes: added an
6886 encoding specification and fixed the comment which refered to
6887 GRASS, not Thuban
6888
6889 * test/xmlsupport.py: New support module for tests involving XML.
6890 Currently there's a mix-in class for XML validation.
6891
6892 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6893
6894 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6895 so that we can validate the
6896 (SaveSessionTest.testEmptySession)
6897 (SaveSessionTest.testSingleLayer)
6898 (SaveSessionTest.testSingleLayer)
6899 (SaveSessionTest.testLayerProjection)
6900 (SaveSessionTest.testRasterLayer)
6901 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6902
6903 * test/runtests.py (main): Call print_additional_summary instead
6904 of print_garbage_information
6905
6906 * test/support.py (resource_dir): New function to return the
6907 "Resource" subdirectory
6908 (print_additional_summary): New function to combine several
6909 summary functions
6910 (run_tests): Use print_additional_summary instead of calling
6911 print_garbage_information directly
6912
6913 2003-06-19 Bernhard Herzog <[email protected]>
6914
6915 * Doc/thuban.dtd (classification): Correct the content model of
6916 the classification element.
6917 (projection): Add the "name" attribute
6918
6919 2003-06-19 Frank Koormann <[email protected]>
6920
6921 MERGE from the greater-ms3 branch.
6922
6923 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6924 scale if projection is latlong to get better estimate.
6925
6926 Fix problem of hidden properties dialog under windows after double
6927 click on layer tree:
6928 The tree control always gets an Expanded / Collapsed event after
6929 the ItemActivated on double click, which raises the main window again.
6930 We add a second ItemActivated event to the queue, which simply
6931 raises the already displayed window.
6932
6933 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6934 raiseProperties initialized to prevent endless loops
6935 (LegendTree._OnItemActivated): Depending on self.raiseProperties
6936 simply raise the properties or open the dialog and issue a second
6937 event.
6938
6939 2003-06-18 Jonathan Coles <[email protected]>
6940
6941 * setup.py: Fix a few problems that occured under Windows.
6942
6943 2003-06-18 Jonathan Coles <[email protected]>
6944
6945 When Thuban loaded the map was redrawn twice because the
6946 legend was being opened after the mainwindow was created
6947 and not during its creation. This meant the map was drawn
6948 initially and then had to be redrawn when the legend
6949 caused the display to change. Now the legend is opened
6950 in the mainwindow constructor which resolves this issue.
6951
6952 Also, although we were checking for the existence of
6953 gdal and gdalwarp modules, the gdalwarp extension was
6954 still being compiled (which may fail if the system doesn't
6955 have gdal installed). the build_ext command to setup.py
6956 now accepts the flags --with-gdal and --without-gdal.
6957 If --without-gdal is specified setup.py will try to
6958 use the gdal parameters specified by gdal-config. Under
6959 windows, those parameters have to be set in setup.py
6960 as with proj4 an wxWindows.
6961
6962 * setup.py: Use a list instead of seperate variables for
6963 extension parameters so we can create a generic function
6964 that runs an appropriate *-config script.
6965 (run_cs_script): Renamed from run_wx_script and modified
6966 to accept a second argument which is a list of lists to
6967 be filled in by the values returned from running the command.
6968 (thuban_build_ext): New. Extends the build_ext command and
6969 provides the options --with-gdal/--without-gdal which then
6970 optionally includes the gdalwarp extension.
6971
6972 * Thuban/Model/resource.py: First check if we can import
6973 the gdalwarp Thuban extension before checking for gdal.
6974 Also added some comments.
6975
6976 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6977 the map is None which may be the case if none has been loaded
6978 yet.
6979
6980 * Thuban/UI/main.py (main): Remove call to ShowLegend.
6981
6982 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6983
6984 * Thuban/UI/renderer.py: Check for gdal support before importing
6985 gdalwarp.
6986 (MapRenderer.render_map): Only try to optimize if we have gdal
6987 support otherwise nothing will get drawn.
6988
6989 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6990 during startup before a map has been created. Check if map is None
6991 before using it and do nothing if it is.
6992
6993 2003-06-17 Jonathan Coles <[email protected]>
6994
6995 Fix the problem with raster layers under Windows that caused
6996 Thuban to crash. The view should respond to layer projection
6997 changed events to update the display. Changes to a projection
6998 should not cause the map to be set to full extent.
6999
7000 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7001 current_map_proj to remember the current map projection so that
7002 when the projection changes we know what the previous projection
7003 was.
7004 (MapCanvas.SetMap): Unsubscribe and subscribe to
7005 LAYER_PROJECTION_CHANGED events.
7006 (MapCanvas.projection_changed): Split into two methods that respond
7007 to map and layer projection changes.
7008 (MapCanvas.map_projection_changed): New. Takes the current view and
7009 projects it using the new projection. This does not cause the
7010 map to be redrawn at full extent.
7011 (MapCanvas.layer_projection_changed): New. Cause a redraw which
7012 will draw each layer in its new projection.
7013
7014 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7015 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7016 under Windows.
7017
7018 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7019 to twice sizeof(void*) because there are two digits for each
7020 hex byte.
7021
7022 2003-06-16 Bernhard Herzog <[email protected]>
7023
7024 Update to the layer interface: Direct access to the table,
7025 shapetable, shapefile and filename attributes is now actively
7026 deprecated by issuing deprecation warnings for all places where
7027 this happens.
7028
7029 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7030 to the instance variables table, shapetable, shapefile and
7031 filename via __getattr__ so that we can issue a deprecation
7032 warning.
7033 (Layer.SetShapeStore): Don't set the deprecated instance variables
7034 any more
7035 (Layer.SetShapeStore): Don't use deprecated layer instance
7036 variables
7037 (Layer.Destroy): No need to explicitly remove the instance
7038 variables any more
7039 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7040 instance variables
7041
7042 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7043 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7044 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7045 use deprecated layer instance variables
7046
7047 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7048 deprecated layer instance variables
7049
7050 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7051 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7052 instance variables
7053
7054 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7055 deprecated layer instance variables
7056
7057 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7058 deprecated layer instance variables
7059
7060 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7061 deprecated layer instance variables
7062
7063 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7064 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7065 variables
7066
7067 * test/runtests.py (main): Turn Thuban's deprecation warnings into
7068 errors so that they're cought by the tests
7069
7070 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7071 layer instance variables
7072
7073 2003-06-16 Jonathan Coles <[email protected]>
7074
7075 Fix a problem under Windows whereby if the user double-clicks on a
7076 layer in the legend that tree item will expand or collapse as well
7077 as open the layer properties dialog. The state of the tree item
7078 should not be affected.
7079
7080 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7081 preventExpandCollapse and subscribe to expanding and collapsing
7082 events.
7083 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7084 collapsing events and will veto the event if it has been triggered
7085 by the user double clicking on a layer.
7086 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7087 that an expanding/collapsing event should be vetoed.
7088
7089 2003-06-13 Bernhard Herzog <[email protected]>
7090
7091 * Thuban/UI/classifier.py (Classifier.OnClose)
7092 (Classifier.map_layers_removed)
7093 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7094 in OnClose and not in map_layers_removed or
7095 layer_shapestore_replaced to make sure it always happens when the
7096 dialog is closed
7097
7098 2003-06-13 Jonathan Coles <[email protected]>
7099
7100 This puts back a fix for Windows where a panel is needed so that
7101 the background of the table view appears correctly.
7102
7103 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7104 object that can be used by derived classes to place any
7105 controls (including the grid) onto.
7106 (QueryTableFrame.__init__): Use the panel as the parent window
7107 for all the controls. Reparent the grid so that the panel is
7108 the parent. Call UpdateStatusText() to correctly initialize
7109 the status bar.
7110
7111 2003-06-13 Jonathan Coles <[email protected]>
7112
7113 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7114 from wxFrame (as opposed to wxDialog like the other classes)
7115 but otherwise behaves like the other classes. This is needed
7116 for the TableView which isn't really a dialog and needs to
7117 have a status bar and control buttons.
7118
7119 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7120 instance variable to keep track of how many rows are selected.
7121 Subscribe once to the the events we are interested in.
7122 (ThubanGrid.OnRangeSelect): Only handle event if event handling
7123 hasn't been turned off.
7124 (ThubanGrid.OnSelectCell): Only handle event if event handling
7125 hasn't been turned off.
7126 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7127 as an event listener (which changes the event handler stack)
7128 simply set an instance variable to False. This is checked in
7129 the event handlers.
7130 (ThubanGrid.GetNumberSelected): Return the number of currently
7131 selected rows.
7132 (TableFrame): Inherit from ThubanFrame so we can have a
7133 status bar and control buttons.
7134 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7135 Explicitly set which items are selected in the operator choice and
7136 action choice so there is always a valid selection. Fixes RTbug #1941.
7137 Subscribe to grid cell selection events so we can update the
7138 status bar.
7139 (QueryTableFrame.UpdateStatusText): Update the status bar with
7140 how many rows are in the grid, how many columns, and how many
7141 rows are selected.
7142 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7143 Call UpdateStatusText when cells are (de)selected.
7144 (QueryTableFrame.OnQuery): Use the string value in the value
7145 combo if either the selected item index is 0 or if the string
7146 cannot be found in the predefined list (this happens if the
7147 user changes the text). Fixes RTbug #1940.
7148 Only turn off the grid event listeners if there a query comes
7149 back with a none empty list of ids. in the case that the list
7150 is empty this causes a grid.ClearSelection() call to actually
7151 clear the grid selection which causes the selected items in
7152 the map to be deselected. Fixes RTbug #1939.
7153
7154 * test/test_save.py (XMLWriterTest.Encode): Check return values.
7155 Fixes RTbug #1851.
7156
7157 2003-06-13 Bernhard Herzog <[email protected]>
7158
7159 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7160 self.selected_shape with the current selection to make sure the
7161 contents of the dialog are up to date when it's shown for the
7162 first time.
7163 The dialog used to work without this by luck. The recent fix to
7164 the connector module 'broke' a 'feature' the identify view was
7165 relying on, i.e that subscribing to a message in response to
7166 receiving a message of that type would mean that the new
7167 subscriber would also be called for the same message.
7168
7169 2003-06-12 Jonathan Coles <[email protected]>
7170
7171 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7172 the image is rendered. Fixes RTbug #1937.
7173
7174 2003-06-12 Jonathan Coles <[email protected]>
7175
7176 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7177 user directory if it doesn't exist on a posix system.
7178 Fixes RTbug #1815.
7179
7180 * Thuban/Model/resource.py (get_user_proj_files): Moved the
7181 called to get_application_dir here, so that the directory
7182 will only be called if this method is invoked.
7183
7184 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7185 the projfilepath if no projection is selected.
7186
7187 2003-06-12 Jonathan Coles <[email protected]>
7188
7189 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7190 the scalebar if the current map has no projection set.
7191
7192 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7193 projfilepath label to just the basename of the projection file
7194 rather than include the entire path.
7195
7196 * Thuban/Model/resource.py: Fix missed proj functions that
7197 needed to be renamed.
7198
7199 2003-06-12 Jonathan Coles <[email protected]>
7200
7201 * Thuban/Model/classification.py: Removed assert statements that
7202 tested if the variable was an instance of Color.
7203
7204 * Thuban/Model/color.py (Color): Remove commented code that isn't
7205 used.
7206 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7207 Fixes RTbug #1835.
7208 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7209 Needed now that the class doesn't inherit from Color.
7210
7211 2003-06-12 Jonathan Coles <[email protected]>
7212
7213 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7214 check unicode strings.
7215
7216 * test/test_layer.py: Check for existence of gdal.
7217
7218 2003-06-12 Jonathan Coles <[email protected]>
7219
7220 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7221 that was in load.py
7222
7223 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7224 that was in save.py
7225
7226 2003-06-12 Jonathan Coles <[email protected]>
7227
7228 This is largely a collection of bug fixes. We also handle the
7229 case where gdal is not on the system. The XMLReader and XMLWriter
7230 classes were moved into there own files to resolve some circular
7231 import references and because they shouldn't really be in the
7232 file that is dediciated to reading/writing session files since
7233 they are also used elsewhere.
7234
7235 * Thuban/Model/classgen.py: Renamed functions to follow the
7236 function_names_with_underscores style. Fixes RTbug #1903.
7237 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7238
7239 * Thuban/Model/layer.py: Import gdal only if it available.
7240 (RasterLayer): Handle the case where the gdal library is unavailable.
7241 Addresses RTbug #1877.
7242
7243 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7244 xmlreader.py.
7245
7246 2003-06-12 Jonathan Coles <[email protected]>
7247
7248 This is largely a collection of bug fixes. We also handle the
7249 case where gdal is not on the system. The XMLReader and XMLWriter
7250 classes were moved into there own files to resolve some circular
7251 import references and because they shouldn't really be in the
7252 file that is dediciated to reading/writing session files since
7253 they are also used elsewhere.
7254
7255 * Thuban/Model/classgen.py: Renamed functions to follow the
7256 function_names_with_underscores style. Fixes RTbug #1903.
7257 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7258
7259 * Thuban/Model/layer.py: Import gdal only if it available.
7260 (RasterLayer): Handle the case where the gdal library is unavailable.
7261 Addresses RTbug #1877.
7262
7263 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7264 xmlreader.py.
7265
7266 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7267 file xmlwriter.py.
7268
7269 * Thuban/Model/resource.py: Renamed functions to following the
7270 function_names_with_underscores style.
7271 (has_gdal_support): New function that returns true if the gdal
7272 library is available. Addresses RTbug #1877.
7273
7274 * Thuban/UI/application.py (ThubanApplication.OpenSession):
7275 Display a message box if the gdal library is not available, but
7276 only if there are any layers that would use it. Addresses RTbug #1877.
7277
7278 * Thuban/UI/classgen.py: Use renamed projection resource functions.
7279 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7280 when using integers versus floats.
7281
7282 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7283 determine if the "Add Image Layer" menu option should be
7284 greyed out or not. Addresses RTbug #1877.
7285
7286 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7287
7288 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7289 optimize if a raster layer is visible. Fixes RTbug #1931.
7290 Only draw the raster layer if the gdal library is available.
7291 Addresses RTbug #1877.
7292
7293 * test/test_classgen.py: Add tests for generate_singletons,
7294 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7295 (test_calculate_quantiles): Fix some tests to catch the new
7296 ValueError that is raised.
7297
7298 * test/test_proj.py: Use renamed projection resource functions.
7299
7300 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7301 test for saving classified layers. Fixes RTbug #1902.
7302 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7303
7304 2003-06-12 Jan-Oliver Wagner <[email protected]>
7305
7306 Fix for http://intevation.de/rt/webrt?serial_num=1900.
7307
7308 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7309
7310 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7311 multiplechoicedialog.py rather than from the wxPython library.
7312
7313 2003-06-11 Frank Koormann <[email protected]>
7314
7315 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7316 update.
7317
7318 2003-06-11 Frank Koormann <[email protected]>
7319
7320 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7321 determine the absolute .thuban/thuban directory under
7322 "posix" (os.expanduser) and "nt" (read AppData registry key).
7323
7324 * Thuban/Model/resource.py: Use get_application_dir
7325
7326 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7327 Use get_application_dir.
7328
7329 2003-06-10 Bernhard Herzog <[email protected]>
7330
7331 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7332 the messages MAP_LAYERS_REMOVED messages
7333 (LayerTableFrame.OnClose): Unsubscribe from it.
7334 (LayerTableFrame.map_layers_removed): New. Receiver for
7335 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7336 dialog is showing is removed.
7337
7338 2003-06-10 Bernhard Herzog <[email protected]>
7339
7340 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7341 of the receivers list so that unsubscribing in a receiver doesn't
7342 modify it while iterating over it.
7343
7344 * test/test_connector.py
7345 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7346 unsubscribing in a receiver works correctly. See docstring for
7347 details
7348
7349 2003-06-10 Bernhard Herzog <[email protected]>
7350
7351 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7352 message.
7353
7354 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7355 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7356 LAYER_CHANGED will still be sent if the classification changes.
7357
7358 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7359 parameter so we can subscribe to some of its messages
7360 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7361 and the layer's LAYER_SHAPESTORE_REPLACED
7362 (Classifier.unsubscribe_messages): New. Unsubscribe from message
7363 subscribed to in __init__
7364 (Classifier.map_layers_removed)
7365 (Classifier.layer_shapestore_replaced): receivers for the messages
7366 subscribed to in __init__. Unsubscribe and close the dialog
7367
7368 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7369 the map to the Classifier dialog
7370
7371 * test/test_layer.py (SetShapeStoreTests): Derive from
7372 SubscriberMixin as well so we can test messages
7373 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7374 messages
7375 (SetShapeStoreTests.tearDown): Clear the messages again
7376 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7377 for the modified flag too
7378 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7379 to check whether SetShapeStore sets the modified flag
7380 (SetShapeStoreTests.test_set_shape_store_different_field_name)
7381 (SetShapeStoreTests.test_set_shape_store_same_field)
7382 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7383 Add tests for the messages. This checks both the new
7384 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7385
7386 2003-06-06 Jan-Oliver Wagner <[email protected]>
7387
7388 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7389 the menu items.
7390
7391 2003-06-05 Frank Koormann <[email protected]>
7392
7393 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7394 Layout reimplemented without panel. Make life easier to fit the list
7395 in the dialog.
7396
7397 2003-06-05 Frank Koormann <[email protected]>
7398
7399 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7400 once on initialisation (Former implementation resulted in multiple
7401 entries for each projection).
7402 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7403 if set, select the projection found under the specified name. This
7404 overwrites any other selection estimate.
7405 Removed projchoice filling from this method.
7406 (ProjFrame._OnSave, ProjFrame._OnAddToList):
7407 Updated call of ProjFrame.__FillAvailList
7408 (LCCPanel._DoLayout): Moved parameter controls in more common order.
7409
7410 * Resources/Projections/defaults.proj: Extended defaults representing
7411 various common European projections.
7412
7413 2003-06-05 Frank Koormann <[email protected]>
7414
7415 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7416 Use ListCtrl instead of GridCtrl
7417
7418 * Thuban/Model/resource.py:
7419 Guess location of .thuban directory from tempdir parent directory.
7420
7421 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7422 Guess location of .thuban directory from tempdir parent directory.
7423
7424 2003-06-04 Bernhard Herzog <[email protected]>
7425
7426 Do not cache the values returned by the tree widget's
7427 GetFirstChild and GetNextChild methods because it led to lots of
7428 segfaults. The new way requires more brute force but is more
7429 reliable.
7430
7431 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7432 variable layer2id
7433 (LegendTree.find_layer): New method to do with brute force what
7434 layer2id tried to accomplish
7435 (LegendTree._OnMsgLayerChanged)
7436 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7437 Use find_layer instead of layer2id
7438 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7439 update layer2id anymore
7440 (LegendTree._OnMsgMapLayersRemoved)
7441 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7442
7443 2003-06-03 Thomas Koester <[email protected]>
7444
7445 * Thuban/Model/classgen.py (GenQuantiles0): New function.
7446
7447 2003-06-02 Bernhard Herzog <[email protected]>
7448
7449 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7450 New commands.
7451 (main_menu): Add the new commands.
7452 (MainWindow.TableRename): New. Implementation of the table_rename
7453 command.
7454 (MainWindow.RenameLayer): New. Implementation of the layer_rename
7455 command.
7456
7457 * Thuban/Model/session.py (Session.AddTable): call self.changed to
7458 set the modified flag
7459
7460 * test/test_session.py (TestSessionSimple.test_add_table): Test
7461 whether the modified flag is set properly
7462
7463 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7464 instead of issue so that the modified flags get updated.
7465
7466 * test/test_base.py (SomeTitledObject): Derive from Modifiable
7467 instead of Publisher to reflect reality better and to accomodate
7468 the fact that SetTitle now calls changed instead of issue
7469
7470 2003-06-02 Bernhard Herzog <[email protected]>
7471
7472 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7473 acquisition has to happen before the try in a try-finally.
7474
7475 2003-06-02 Bernhard Herzog <[email protected]>
7476
7477 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7478 possible that a layer is removed that is not currently selected in
7479 the legend so don't check for this.
7480
7481 2003-05-30 Bernhard Herzog <[email protected]>
7482
7483 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7484 variables to None that have direct or indirect references to
7485 shapefiles or dbf files to make sure that they do go away and the
7486 files are closed.
7487
7488 2003-05-30 Bernhard Herzog <[email protected]>
7489
7490 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7491 availImgListIndices when a new image list is created
7492
7493 2003-05-30 Bernhard Herzog <[email protected]>
7494
7495 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7496 changing_selection to indicate whether the LegendTree code itself
7497 is currently changing the selection
7498 (LegendTree.normalize_selection): New method to normalize the
7499 selection by selecting the layer item even if the user clicked on
7500 the classification.
7501 (LegendTree._OnSelChanged): normalize the selection. This works
7502 around a bug in wx which doesn't keep track of the selection
7503 properly when subtrees are deleted.
7504
7505 2003-05-30 Bernhard Herzog <[email protected]>
7506
7507 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7508 maximum and minimum scale factors.
7509
7510 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7511 changes in classgen.py
7512
7513 2003-05-30 Jonathan Coles <[email protected]>
7514
7515 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7516 all the methods functions. Fixes RTBug #1903.
7517
7518 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7519 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7520 RTBug #1907.
7521
7522 * Thuban/UI/classgen.py: Use classgen functions that were part
7523 of the ClassGenerator class. Put try/finally blocks around
7524 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7525 RTBug #1904.
7526
7527 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7528
7529 * Thuban/UI/legend.py: The legend was cleared and repopulated any
7530 time something changed which caused some state to be lost such
7531 as which children were expanded or collapsed. Fixes RTBug #1901.
7532 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7533 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7534 the legend but not in the map.
7535 (LegendTree.__FillTree): Move main functionality out into smaller
7536 methods that can be used by other methods.
7537 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7538 if they are available.
7539 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7540 that we override the wxTreeCtrl method. Iterate over children
7541 and call __RemoveLayer.
7542 (LegendTree.__AddLayer): New. Add a new layer to the legend.
7543 (LegendTree.__RemoveLayer): Remove a layer from the legend.
7544 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7545 Should only be called with the id of a layer branch.
7546 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7547 Returns the root item or creates one if necessary.
7548
7549 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7550 ProjectRasterFile with tuple arguments instead of strings.
7551
7552 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7553 with try/finally. Fixes RTBug #1904.
7554
7555 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7556 with try/finally. Fixes RTBug #1904.
7557 (MapCanvas.FitSelectedToWindow): If a single point is selected
7558 simply center it on the display. Fixes RTBug #1849.
7559
7560 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7561 to be compiled as a standalone app. Now the code can only be
7562 called from Python which simplifies the parameter passing.
7563 (ProjectRasterFile): Handle Python arguments. Remove code that
7564 checks for a destination dataset. Add more clean up code.
7565
7566 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7567 TestMapWithContents.test_lower_layer_bottom):
7568 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7569 Fixes RTBug #1907.
7570
7571 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7572 extent to the map when the legend is toggled. Fixes RTBug #1881.
7573
7574 2003-05-29 Jan-Oliver Wagner <[email protected]>
7575
7576 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
7577 unsubscribes all that is subcribed in __init__.
7578
7579 2003-05-28 Bernhard Herzog <[email protected]>
7580
7581 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
7582 (MainWindow.CanDuplicateLayer): New methods to implement the
7583 Layer/Duplicate command.
7584 (layer_duplicate command): New.
7585 (main_menu): Add layer_duplicate to the Layer menu.
7586
7587 2003-05-28 Bernhard Herzog <[email protected]>
7588
7589 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
7590 renderer so that NULL/None values get displayed differently (by a
7591 gray rectangle).
7592 (TableGrid.__init__): Override the default renderers
7593
7594 2003-05-28 Bernhard Herzog <[email protected]>
7595
7596 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
7597 classification to "None" if the type of the field has changed.
7598
7599 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
7600 test for the Layer.SetShapeStore method
7601
7602 2003-05-28 Jan-Oliver Wagner <[email protected]>
7603
7604 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
7605 does not necessarily have a filename).
7606
7607 2003-05-28 Jan-Oliver Wagner <[email protected]>
7608
7609 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
7610 sort the selection list for the dialog.
7611
7612 2003-05-28 Frank Koormann <[email protected]>
7613
7614 * extensions/thuban/wxproj.cpp
7615 (project_point): Removed cast to int for projected point coordinates.
7616 (shape_centroid): Return last point if all polygon vertices fall
7617 to one point.
7618
7619 2003-05-28 Bernhard Herzog <[email protected]>
7620
7621 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
7622 with layers that don't have shapestores, i.e. raster layers.
7623
7624 2003-05-28 Bernhard Herzog <[email protected]>
7625
7626 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
7627 when determining the title from the filename.
7628
7629 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
7630 reflect changes in the way the title is derived from the filename
7631
7632 2003-05-28 Frank Koormann <[email protected]>
7633
7634 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
7635 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
7636
7637 2003-05-27 Bernhard Herzog <[email protected]>
7638
7639 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
7640 delegate SelectedLayer.
7641 (MainWindow.LayerUnjoinTable): Implement.
7642 (_can_unjoin): New. Helper function for the sensitivity of the
7643 layer/unjoin command.
7644
7645 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
7646 (DerivedShapeStore.OrigShapeStore): New. Return the original
7647 shapestore. Used to figure out how to unjoin.
7648 (DerivedShapeStore.Shapefile): Fix a typo.
7649
7650 2003-05-27 Bernhard Herzog <[email protected]>
7651
7652 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
7653 well
7654 (JoinDialog.__init__): Use the layer parameter and only build the
7655 left choice when a layer is given
7656 (JoinDialog.OnJoin): Handle layer joins as well
7657 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
7658 that the user selects the "Select..." item. The sensitivitly
7659 updating is now in update_sensitivity
7660 (JoinDialog.y): New method to refactor the sensitivity update of
7661 the join button into its own method.
7662
7663 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7664
7665 2003-05-27 Bernhard Herzog <[email protected]>
7666
7667 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7668 iff there are unreferenced tables in the session
7669
7670 2003-05-27 Bernhard Herzog <[email protected]>
7671
7672 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7673
7674 * Thuban/Model/session.py (Session.UnreferencedTables): New method
7675 to return tables that are not referenced by other tables or shape
7676 stores and can be removed.
7677 (Session.RemoveTable): Issue a TABLE_REMOVED message after
7678 removing the table
7679
7680 * Thuban/UI/mainwindow.py: Remove unused imports
7681 (MainWindow.TableClose): Implement.
7682
7683 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7684 messages so that the frame will be automatically closed when a new
7685 session is opened or the table is removed.
7686 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7687 __init__
7688 (TableFrame.close_on_session_replaced)
7689 (TableFrame.close_on_table_removed): New. Subscribers that close
7690 the window
7691
7692 * test/test_session.py (TestSessionMessages.test_remove_table)
7693 (TestSessionSimple.test_remove_table): Move the test to
7694 TestSessionSimple and add test for the TABLE_REMOVED message
7695 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7696 (TestSessionSimple.test_unreferenced_tables) New. Test for the
7697 UnreferencedTables method.
7698 (UnreferencedTablesTests): New. Class with some more sophisticated
7699 tests for UnreferencedTables.
7700
7701 2003-05-27 Frank Koormann <[email protected]>
7702
7703 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7704 display has some unwanted side effects. Removed again.
7705
7706 2003-05-27 Frank Koormann <[email protected]>
7707
7708 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7709
7710 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7711
7712 2003-05-27 Jan-Oliver Wagner <[email protected]>
7713
7714 * test/test_menu.py (MenuTest.test): Added test for
7715 Menu.RemoveItem().
7716
7717 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7718 the menu.
7719
7720 2003-05-27 Frank Koormann <[email protected]>
7721
7722 Nonmodal dialogs without parent (i.e. they can fall behind the main
7723 window)
7724
7725 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7726 all dialogs in the dialogs dictionary and the canvas.
7727
7728 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7729 parent, i.e. can fall behind other windows.
7730 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7731 dictionary before removing it.
7732
7733 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7734
7735 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7736 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7737 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7738
7739 2003-05-27 Bernhard Herzog <[email protected]>
7740
7741 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7742 tableview dialog
7743 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7744 Also, don't use the table's titles as the dialog names. The titles
7745 aren't guaranteed to be unique.
7746 (MainWindow.TableOpen): Open a table view dialog after opening the
7747 table
7748
7749 2003-05-27 Bernhard Herzog <[email protected]>
7750
7751 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7752 effect can be achieved by simply closing the window showing the
7753 table.
7754 (MainWindow.TableHide): Removed.
7755 (main_menu): Removed "table_hide"
7756
7757 2003-05-27 Frank Koormann <[email protected]>
7758
7759 Fix legend tree display problems under Win32
7760
7761 * Thuban/UI/legend.py: BMP_SIZE_W = 15
7762 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7763 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7764
7765 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7766
7767 2003-05-27 Jan-Oliver Wagner <[email protected]>
7768
7769 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7770 'after' now allows to insert separators almost anywhere in the menu.
7771
7772 2003-05-27 Frank Koormann <[email protected]>
7773
7774 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7775 "S" of selection box label to hint on hot key (Alt-S). Works under
7776 Win32 but is ignored under GTK.
7777
7778 2003-05-26 Frank Koormann <[email protected]>
7779
7780 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7781 Center Choices.
7782
7783 2003-05-26 Bernhard Herzog <[email protected]>
7784
7785 Remove the Precision methods again. They're too DBF specific to be
7786 part of the table interface and they're only used in table_to_dbf
7787 anyway.
7788
7789 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7790 fixed precision of 12 for doubles.
7791 (TransientTableBase.Precision): Removed
7792 (AutoTransientTable.Width): Delegate to self.table.
7793
7794 * Thuban/Model/table.py (DBFTable.Precision)
7795 (MemoryTable.Precision): Removed.
7796 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7797 (table_to_dbf): Use a fixed precision of 12 for floats unless the
7798 column object specifies something else.
7799
7800 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7801 test for table_to_dbf
7802
7803 2003-05-26 Bernhard Herzog <[email protected]>
7804
7805 * test/test_transientdb.py
7806 (TestTransientTable.run_iceland_political_tests): Fix a comment.
7807
7808 2003-05-26 Bernhard Herzog <[email protected]>
7809
7810 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7811 implementation. Mark parts of the file format strings for
7812 localization.
7813
7814 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7815 file and add the table to the tables managed by the session
7816
7817 * test/test_session.py (TestSessionSimple.test_open_table_file):
7818 New. test case for OpenTableFile
7819
7820 2003-05-26 Jan-Oliver Wagner <[email protected]>
7821
7822 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7823 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7824 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7825 Replace the true/false of wxWindows by True/False of Python 2.2.1.
7826
7827 2003-05-26 Jan-Oliver Wagner <[email protected]>
7828
7829 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7830 already a selection present, update the grid accordingly.
7831
7832 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7833 resizeable and increase its initial size.
7834
7835 2003-05-26 Frank Koormann <[email protected]>
7836
7837 Table export functionality
7838
7839 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7840 Return width (in characters) for a column.
7841 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7842 (table_to_dbf): Write table to dbf file.
7843 (table_to_csv): Write table to csv file.
7844
7845 * Thuban/Model/transientdb.py (TransientTableBase.Width,
7846 TransientTableBase.Precision): Return column width and precision.
7847
7848 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7849 or table_to_csv depending on file selection.
7850
7851 * test/test_dbf_table.py:
7852 Test table_to_dbf (extension of former part of test).
7853
7854 * test/test_csv_table.py:
7855 Test table_to_csv.
7856
7857 2003-05-23 Jan-Oliver Wagner <[email protected]>
7858
7859 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7860 Use QueryTableFrame instead of TableFrame.
7861
7862 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7863 table window with 'Layer Table:' instead of 'Table:'.
7864
7865 2003-05-23 Jan-Oliver Wagner <[email protected]>
7866
7867 Give all tables a title via mix-in TitledObject.LayerShowTable
7868
7869 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7870 only if it exists.
7871
7872 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7873 and call its init-method with a default title. Remove Title() method.
7874
7875 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7876 AutoTransientTable): mix-in TitledObject and call its init-method with
7877 a default title. Remove Title() method.
7878
7879 2003-05-23 Bernhard Herzog <[email protected]>
7880
7881 * Thuban/Model/session.py (Session.AddShapeStore): Define
7882 AddShapeStore analogously to AddTable.
7883
7884 * test/test_session.py (TestSessionSimple.test_add_shapestore):
7885 New. Test for AddShapeStore
7886
7887 2003-05-23 Jan-Oliver Wagner <[email protected]>
7888
7889 Introducing QueryTableFrame and a very coarse ShowTable implementation.
7890
7891 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7892 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7893 The latter implements the selection GUI without dependency on a layer.
7894 LayerTableFrame now is derived from QueryTableFrame and connects
7895 to a layer.
7896
7897 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7898 implementation that still needs work.
7899
7900 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7901
7902 2003-05-22 Frank Koormann <[email protected]>
7903
7904 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7905 Added "outer_join = False" as optional parameter.
7906 (TransientJoinedTable.create): If outer join is true, perform a
7907 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7908 the left table. Records not matching are filled with 0 / None.
7909
7910 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7911 (JoinDialog.OnJoin): Consider outer join check box.
7912
7913 2003-05-22 Bernhard Herzog <[email protected]>
7914
7915 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7916 somewhat safer way. Storing the traceback in a local variable can
7917 lead to memory leaks
7918
7919 2003-05-22 Bernhard Herzog <[email protected]>
7920
7921 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7922 the wxMessageDialog's Destroy() method.
7923
7924 2003-05-22 Frank Koormann <[email protected]>
7925
7926 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7927 TransientTable.Title()
7928
7929 2003-05-22 Frank Koormann <[email protected]>
7930
7931 Join Dialog, initial version.
7932
7933 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7934
7935 * Thuban/UI/join.py (JoinDialog): Functional implementation of
7936 former framework. Renamed Table1/Table2 to LeftTable/RightTable
7937 in all occurences.
7938
7939 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7940 Typo fixed.
7941
7942 2003-05-22 Bernhard Herzog <[email protected]>
7943
7944 Give the tables titles so that the GUI can display more meaningful
7945 names. For now the titles are fixed but depend on e.g. filenames
7946 or the titles of the joined tables.
7947
7948 * Thuban/Model/transientdb.py (TransientTable.Title)
7949 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7950
7951 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7952
7953 * test/test_transientdb.py
7954 (TestTransientTable.test_auto_transient_table_title): New. Test
7955 for the Title method
7956 (TestTransientTable.test_transient_joined_table)
7957 (TestTransientTable.test_transient_table): Add test for the Title
7958 methods
7959
7960 * test/test_memory_table.py (TestMemoryTable.test_title): New.
7961 Test for the Title method
7962
7963 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7964 the Title method
7965
7966 2003-05-22 Bernhard Herzog <[email protected]>
7967
7968 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7969 Provide a better way to destroy the layers
7970 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7971 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7972 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7973 the new way to destroy the layers.
7974 (TestLayer.test_derived_store): New. Test for using a layer with a
7975 DerivedShapeStore
7976
7977 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7978 filename if the shape store actually has one.
7979
7980 2003-05-22 Bernhard Herzog <[email protected]>
7981
7982 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7983 for the filename
7984
7985 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7986 for the FileName method
7987 (TestDBFTableWriting.test_write): Fix spelling of filename
7988
7989 2003-05-22 Thomas Koester <[email protected]>
7990
7991 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7992 from SciParam that now really is immutable.
7993
7994 2003-05-22 Frank Koormann <[email protected]>
7995
7996 Layer Top/Bottom placement added to legend.
7997
7998 * Thuban/UI/legend.py
7999 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8000 bound to tool events.
8001 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8002 New, methods binding the event methods with the map methods.
8003
8004 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8005 layer at top/bottom of layer stack.
8006
8007 * Resources/Bitmaps/top_layer.xpm: New button icon.
8008
8009 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8010
8011 2003-05-22 Bernhard Herzog <[email protected]>
8012
8013 * Thuban/Model/session.py (Session.RemoveTable): New method to
8014 remove tables
8015
8016 * test/test_session.py (TestSessionSimple.test_remove_table): New.
8017 Test for RemoveTable
8018
8019 2003-05-22 Thomas Koester <[email protected]>
8020
8021 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8022 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8023
8024 2003-05-22 Bernhard Herzog <[email protected]>
8025
8026 Implement a way to discover dependencies between tables and
8027 shapestores.
8028
8029 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8030 (TransientJoinedTable.Dependencies)
8031 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8032 interface
8033 (TransientJoinedTable.__init__): Keep tack of the original table
8034 objects in addition to the corresponding transient tables.
8035
8036 * Thuban/Model/table.py (DBFTable.Dependencies)
8037 (MemoryTable.Dependencies): New. Implement the dependencies
8038 interface
8039
8040 * Thuban/Model/data.py (ShapeTable): New. Helper class for
8041 ShapefileStore
8042 (ShapefileStore.__init__): Use ShapeTable instead of
8043 AutoTransientTable
8044 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8045 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8046 methods for filename and type
8047 (ShapefileStore.Dependencies): New. Implement the dependencies
8048 interface
8049 (DerivedShapeStore): New class to replace SimpleStore. The main
8050 difference to SimpleStore is that it depends not on a shapefile
8051 but another shapestore which expresses the dependencies a bit
8052 better
8053 (SimpleStore.__init__): Add deprecation warning.
8054
8055 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8056 Test for the Dependencies method.
8057
8058 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8059 New. Test for the Dependencies method.
8060
8061 * test/test_transientdb.py
8062 (TestTransientTable.test_auto_transient_table_dependencies): New.
8063 Test for the Dependencies method.
8064 (TestTransientTable.test_transient_joined_table): Add test for the
8065 Dependencies method.
8066
8067 * test/test_session.py (TestSessionSimple.setUp)
8068 (TestSessionSimple.tearDown): New. Implement a better way to
8069 destroy the sessions.
8070 (TestSessionSimple.test_initial_state)
8071 (TestSessionSimple.test_add_table): Bind session to self.session
8072 so that it's destroyed by tearDown
8073 (TestSessionSimple.test_open_shapefile): New. Test for
8074 OpenShapefile and the object it returns
8075
8076 2003-05-22 Bernhard Herzog <[email protected]>
8077
8078 * Thuban/Model/session.py (Session.AddTable): New method to
8079 register tables with the session.
8080 (Session.Tables): Return the tables registered with AddTable too.
8081
8082 * test/test_session.py (TestSessionSimple.test_add_table): New.
8083 Test case for the AddTable method
8084
8085 2003-05-22 Frank Koormann <[email protected]>
8086
8087 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8088 lower right corner, center labels for selections, initialize controls
8089 in reasonable order for keyboard navigation.
8090
8091 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8092 (ProjFrame.__DoOnProjAvail): Determine position of current projection
8093 using the wxListBox.FindString() method. Still a problem (#1886)
8094
8095 * Thuban/UI/classifier.py
8096 (Classifier.__init__, SelectPropertiesDialog.__init__)
8097
8098 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8099 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8100 different classification types from here to __init__.
8101 (GenUniquePanel.__init__): Set the column width of the first field
8102 in the Field ListCtrl to the full width.
8103
8104 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8105 Button to 'Export'. Center Buttons in Selection Box, set Focus to
8106 Grid.
8107 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8108 changes focus to the Selection when pressing "Alt-S".
8109
8110 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8111 the text if not visible. The italic font sometimes exceeds the
8112 rendering area.
8113
8114 2003-05-21 Jonathan Coles <[email protected]>
8115
8116 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8117 to OnClose so that Thuban closes correctly.
8118
8119 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8120 DockFrame.OnClose, not DockFrame._OnClose.
8121
8122 2003-05-21 Jonathan Coles <[email protected]>
8123
8124 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8125 references to 'inf' and use new Range __init__ to pass floats
8126 directly rather than converting them to strings first.
8127 Fixes RTBug #1876.
8128
8129 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8130 Use new Range ___init__ to pass floats.
8131
8132 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8133 filename is a valid image file. Throw IOError otherwise.
8134
8135 * Thuban/Model/range.py: Brought over new Range from SciParam that
8136 is immutable and has an __init__ which can accept floats.
8137
8138 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8139 into try block. AddLayer doesn't throw any exceptions anymore.
8140 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8141 try block.
8142
8143 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8144 the first item in choices. Fixes RTBug #1882.
8145
8146 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8147 has gone to 0 which is a serious problem. abort.
8148 (MapRenderer.draw_raster_layer): Catch IOError seperately and
8149 print the error from GDAL.
8150
8151 * Thuban/UI/tableview.py (TableGrid.__init__): Call
8152 ToggleEventListeners to turn on listening.
8153 (TableGrid.ToggleEventListeners): New. Turns event listening on
8154 and off so as to prevent excessive messages.
8155 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8156 to suppress excessive messages when selecting many rows.
8157 Fixes RTBug #1880.
8158
8159 * Thuban/UI/view.py: Added checks against if scale == 0. This
8160 is a serious problem that can occur when an image without
8161 geo data is loading and causes the map projection bounds to
8162 go to infinity. Right now, the solution is to simply try
8163 to recover.
8164
8165 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8166 to set the MFILEReceiver attributes even if the data is NULL.
8167
8168 * extensions/thuban/gdalwarp.cpp: Improved the error handling
8169 and passed GDAL messages back up to the Python layer. Also
8170 tried to fix some memory leaks that were present in the original
8171 utility but didn't matter because the program aborted.
8172
8173 * test/test_range.py: Copied over tests from SciParam. Removed
8174 tests against importing. Fixes RTBug #1867.
8175
8176 2003-05-21 Bernhard Herzog <[email protected]>
8177
8178 * test/test_load.py: Remove unused imports and restructure the
8179 test code
8180 (LoadSessionTest): Split into one class for each test and turn
8181 LoadSessionTest itself into the base class for all such session
8182 tests.
8183 (ClassificationTest): New base class for load tests that test
8184 classifications
8185 (TestSingleLayer, TestLayerVisibility, TestClassification)
8186 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8187 for the individual tests
8188
8189 * test/support.py (FileLoadTestCase.filename): New base class for
8190 file loading tests
8191
8192 2003-05-21 Jan-Oliver Wagner <[email protected]>
8193
8194 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8195 Mercator' to 'UTM Zone 32' as a more convenient example.
8196 Added 'Gauss Krueger Zone 6'.
8197
8198 * Data/iceland_sample_raster.thuban: political polygon now
8199 filled transparent to have the raster image visible at once.
8200
8201 2003-05-21 Frank Koormann <[email protected]>
8202
8203 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8204 OnClose() to keep in sync with extensions. Internally Thuban
8205 still uses "underscored" names.
8206
8207 2003-05-20 Jonathan Coles <[email protected]>
8208
8209 This puts back Raster layer support. These layers support projections
8210 through the GDAL library. Currently, the CVS version is being used.
8211 There are no Debian packages available although this may change soon.
8212 A GDAL driver was extended to support writing to memory rather to
8213 files.
8214
8215 There is still some work that needs to be done, such as some error
8216 handling when loading invalid images or when there is a problem
8217 projecting the image. This putback simply checks in the majority
8218 of the work.
8219
8220 * setup.py: Add gdalwarp library extension.
8221
8222 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8223 Defaults to False, but can be overridden by subclasses if they
8224 support classification.
8225 (RasterLayer): New. Defines a new layer that represents an
8226 image.
8227
8228 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8229 tag handler.
8230 (SessionLoader.start_layer): Encode the filename.
8231 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8232 New. Supports reading a rasterlayer tag.
8233
8234 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8235
8236 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8237 get a string in Latin1. If we get such as string convert it to
8238 unicode first, otherwise leave if alone before encoding.
8239 (SessionSaver.write_layer): Add support for writing both Layers
8240 and RasterLayers.
8241
8242 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8243 The right argument may not be a string, it could also be a Column.
8244
8245 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8246 Make initial window size 600x400. Fixes RTBug #1872.
8247
8248 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8249 the dialog is constructed so that we can support layers that
8250 do not have classifications.
8251 (Classifier._OnTry): Only build a classification if the layer
8252 supports one.
8253
8254 * Thuban/UI/legend.py: Change all checks that a layer is an
8255 instance of Layer into checks against BaseLayer.
8256 (LegendTree.__FillTreeLayer): Only add children to a branch if
8257 the layer supports classification.
8258
8259 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8260 MainWindow.OpenSession): Don't proceed with an action if the
8261 user chooses Cancel when they are asked to save changes.
8262 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8263 user to select an image file. Create a new RasterLayer and add
8264 it to the map.
8265
8266 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8267 for rendering RasterLayer layers.
8268 (MapRenderer.draw_raster_layer): Actually method that calls
8269 the GDALWarp python wrapper and constructs an image from the
8270 data returned.
8271
8272 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8273 Choices symbols to match those used in the table query method.
8274 Replace deprecated method calls on table with new method names.
8275
8276 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8277 how small the scale can get. This still needs more testing.
8278
8279 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8280 Provides a driver to output in .bmp format.
8281
8282 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8283 New. Provides IO routines which write to memory, rather than a file.
8284
8285 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8286 of the gdalwarp utility provided in GDAL. Added function calls
8287 that can be accessed from python.
8288
8289 * Data/iceland_sample_raster.thuban: New. Sample file that uses
8290 a raster layer.
8291
8292 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8293 layer image data.
8294
8295 * Doc/thuban.dtd: Added rasterlayer attribute definition.
8296
8297 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8298 tests associated with the raster layer code.
8299
8300 * test/test_transientdb.py
8301 (TestTransientTable.test_auto_transient_table_query): Added a test
8302 for using a Column object as the "right" parameter to a query.
8303
8304 2003-05-19 Frank Koormann <[email protected]>
8305
8306 * Thuban/version.py (get_changelog_date):
8307 Catch exceptions if ChangeLog does not exist.
8308
8309 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8310
8311 2003-05-19 Frank Koormann <[email protected]>
8312
8313 Extended version information for Thuban
8314
8315 * Thuban/version.py: New, version information for Thuban: Last
8316 modification date and last ChangeLog entry date.
8317
8318 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8319 information: Display Thuban, wxPython and Python version.
8320
8321 2003-05-16 Bernhard Herzog <[email protected]>
8322
8323 * Thuban/Model/save.py: Remove some unused imports including the
8324 __future__ import for nested_scopes as Thuban relies on Python 2.2
8325 now.
8326 (XMLWriter.encode): Remove the special case for a None argument.
8327 In the saver encode is always called with a string argument.
8328
8329 2003-05-16 Bernhard Herzog <[email protected]>
8330
8331 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8332 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8333 of the bug was that e.g. float("1.2") would fail. Thuban now
8334 requires 2.4.x.
8335
8336 2003-05-16 Frank Koormann <[email protected]>
8337
8338 Printing enhancement and WMF export (under Win32)
8339
8340 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8341 ScreenRenderer. Renders Map, Legend and Scalebar for export.
8342 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8343 PrintRender.
8344
8345 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8346 to fullfil information needed for PrinterRenderer.
8347 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8348 (MapCanvas.Print): Adapted to new MapPrintout.
8349 (OutputTransform): General calculations to transform from canvas
8350 coordinates to export/printing devices.
8351
8352 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8353 new method_command to call ExportMap, with platform dependency (only
8354 __WXMSW__)
8355
8356 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8357 of scalebar drawing area as new parameters.
8358
8359 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8360
8361 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8362 Update to extended scalebar.DrawScalebar header.
8363
8364 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8365
8366 * test/test_scalebar.py: Made test executable as standalone.
8367
8368 2003-05-16 Bernhard Herzog <[email protected]>
8369
8370 * Thuban/Model/table.py (Table): Remove this compatibility alias
8371 for DBFTable.
8372
8373 * test/test_table.py: Import DBFTable as Table because that alias
8374 doesn't exist anymore.
8375
8376 * Thuban/UI/classgen.py: Remove some unused imports
8377
8378 2003-05-14 Jonathan Coles <[email protected]>
8379
8380 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8381 Fix docstring.
8382 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8383 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8384 values of the supplied range to determine the beginning and end
8385 bounds of the generated classes.
8386
8387 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8388 do not have a leading 0 (.5 is now accepted as well as 0.5).
8389
8390 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8391 call to ClassGenerator.GenUniformDistribution.
8392
8393 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8394 layout bug with the 'Projection' label.
8395
8396 * test/support.py (FloatTestCase): New. Needed for the Range tests.
8397
8398 * test/test_range.py: New. Imported from SciParam.
8399
8400 2003-05-12 Jonathan Coles <[email protected]>
8401
8402 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8403 to table.UniqueValues() with calls that retrieve all the values
8404 from the table. This will need to be replaced by a method on table
8405 which can simply return the list (perhaps more efficiently).
8406
8407 2003-05-12 Jonathan Coles <[email protected]>
8408
8409 The return value of ClassGenerator.CalculateQuantiles has changed.
8410 Refer to the documentation for details.
8411
8412 * test/test_classgen.py: Modified Quantile tests to use the
8413 new return values.
8414
8415 * Thuban/Model/classgen.py
8416 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8417 use new return values from CalculateQuantiles to produce the correct
8418 range bounds in the Classification.
8419 (ClassGenerator.CalculateQuantiles): Add more comments describing
8420 the return values and parameters. Make minor adjustments to improve
8421 the legibility of the code. Fix problem with adjusted not being set
8422 in most cases.
8423
8424 2003-05-12 Frank Koormann <[email protected]>
8425
8426 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8427 and latin1. Fixes #1851 finally.
8428
8429 2003-05-09 Jonathan Coles <[email protected]>
8430
8431 * test/test_classgen.py: New. Tests the Quantile algorithm.
8432
8433 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8434 Clean up debugging statement, add comments, fix a small bug in the
8435 returned adjusted percentiles.
8436
8437 2003-05-09 Jonathan Coles <[email protected]>
8438
8439 Introduces Range class from SciParam into the ClassGroupRange class,
8440 and such ranges can now be saved and loaded from disk.
8441
8442 Quantiles are now available in the Classification Generator.
8443
8444 Initial support for building Queries on a table. Doesn't do anything
8445 but run some tests.
8446
8447 * Thuban/Model/classification.py: Explicit imports.
8448 (ClassGroupRange): Use the Range class to store the underlying
8449 range information. The interface remains the same, except for
8450 GetRange(), and you can also supply a Range object as the min
8451 parameter to SetRange or __init__.
8452
8453 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8454 string appropriately for use in Thuban. Fixes RTbug #1851.
8455 (SessionLoader.end_projection): Handle the context of the
8456 projection tag a bit better by looking at what objects are not
8457 None. There was an assumption that a projection tag for a map
8458 could occur before any layers.
8459 (SessionLoader.start_clrange): Provide backward compatibility for
8460 reading min/max values as well as the new range parameter.
8461
8462 * Thuban/Model/map.py: Explicit imports.
8463
8464 * Thuban/Model/resource.py: Import _.
8465 (ProjFileSaver.write): write header using projfile.dtd.
8466
8467 * Thuban/Model/save.py: Explicit imports.
8468 (XMLWriter.encode): New. Encode the given string from a format
8469 used by Thuban into UTF-8. Fixes RTbug #1851.
8470
8471 * Thuban/UI/classgen.py: Explicit imports.
8472 (ClassGenDialog.__init__): Clean up the code and add support
8473 for Quantiles.
8474 (ClassGenDialog.OnOK): Add support for Quantiles.
8475 (GenQuantilesPanel): New. Input panel for Quantiles.
8476 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8477 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8478
8479 * Thuban/Model/classgen.py: New. Contains all the classes named above.
8480
8481 * Thuban/UI/classifier.py: Explicit imports.
8482 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8483 ClassTable.SetValueAsCustom): Reworked to use new Range class.
8484
8485 * Thuban/UI/legend.py: Explicit imports.
8486
8487 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8488 a Table menu and associated method calls.
8489 (MainWindow.choose_color): Removed. No longer needed.
8490
8491 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8492 should be disabled if no projection is selected in the available
8493 list.
8494
8495 * Thuban/UI/renderer.py: Explicit imports.
8496
8497 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8498 with correctly selecting the rows and issuing the right events.
8499 Be sure to call Skip() to allow the grid to do some of its own
8500 handling which allows the rows to actually be selected.
8501 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8502 selecting multiple shapes.
8503 (LayerTableFrame): Support for building Queries.
8504 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8505
8506 * Thuban/UI/tree.py: Explicit imports.
8507
8508 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8509 table view can call it.
8510
8511 * test/test_classification.py: Explicit imports.
8512 (TestClassification.test_ClassGroupRange): Fix test for new
8513 Range class.
8514
8515 * Doc/thuban.dtd: Add range parameter for clrange.
8516
8517 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8518 object in ClassGroupRange, and also uesd for inputting ranges in
8519 the classifer table and elsewhere.
8520
8521 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8522 yet.
8523
8524 2003-05-09 Frank Koormann <[email protected]>
8525
8526 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8527
8528 2003-05-08 Frank Koormann <[email protected]>
8529
8530 Coding style updates
8531
8532 * test/test_scalebar.py: Replaced tab indentation by spaces.
8533
8534 * Thuban/UI/scalebar.py: Explicit imports.
8535
8536 2003-05-08 Frank Koormann <[email protected]>
8537
8538 * Thuban/UI/scalebar.py
8539 (ScaleBar.DrawScalebar): Format string bug fixed.
8540
8541 2003-05-08 Frank Koormann <[email protected]>
8542
8543 Reorganization of scalebar component (no wx in Thuban/Model)
8544
8545 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8546 (deriveInterval):
8547 Calculate scalebar interval and unit which fits in width for scale.
8548 (roundInterval): Round float.
8549
8550 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8551
8552 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8553
8554 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8555
8556 2003-05-08 Frank Koormann <[email protected]>
8557
8558 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8559 Initialize ScaleBar with canvas.map
8560
8561 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8562 round intervals to display smarter lengths
8563 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8564 layer. If the maps has no projection applied grey the scalebar.
8565
8566 2003-05-07 Frank Koormann <[email protected]>
8567
8568 Basic Scalebar features added.
8569
8570 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8571
8572 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8573 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
8574 and the renderer.
8575
8576 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
8577
8578 * Thuban/UI/messages.py: SCALE_CHANGED added.
8579
8580 2003-05-07 Bernhard Herzog <[email protected]>
8581
8582 * Thuban/Model/session.py (Session.__init__): New instance
8583 variable shapestores to hold a list of all open shapestore objects
8584 (Session.ShapeStores): New. Accessor method for the shapestores
8585 list.
8586 (Session._add_shapestore, Session._clean_weak_store_refs): New.
8587 Internal methods to maintain the shapestores list.
8588 (Session.Tables): New. Return all tables open in the session.
8589 (Session.OpenShapefile): Insert the new ShapeStore into the
8590 shapestores list.
8591
8592 * test/test_session.py (TestSessionSimple.test_initial_state): Add
8593 tests for ShapeStores and Tables
8594 (TestSessionWithContent.test_shape_stores)
8595 (TestSessionWithContent.test_tables): New. Test cases for
8596 ShapeStores and Tables
8597
8598 2003-05-07 Bernhard Herzog <[email protected]>
8599
8600 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
8601 Add comments about the optimizations used.
8602 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
8603 Implement the ReadValue table interface method.
8604
8605 * test/test_transientdb.py
8606 (TestTransientTable.run_iceland_political_tests)
8607 (TestTransientTable.test_transient_joined_table): Add tests for
8608 ReadValue
8609
8610 2003-05-07 Frank Koormann <[email protected]>
8611
8612 * Resources/Bitmaps/fulllayerextent.xpm,
8613 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
8614 new icons.
8615
8616 2003-05-06 Bernhard Herzog <[email protected]>
8617
8618 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8619 New. Simply delegate to the transient table's version.
8620
8621 * test/test_transientdb.py
8622 (TestTransientTable.test_auto_transient_table_query): New. Test
8623 case for AutoTransientTable's SimpleQuery
8624
8625 2003-05-06 Bernhard Herzog <[email protected]>
8626
8627 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
8628 Implement a simple query method for the query dialog
8629 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
8630 the row index or shapeid.
8631 (TransientTable.create): Insert the right value of the row index
8632 (TransientJoinedTable.create): Copy the row index of the left
8633 table to the joined result table
8634
8635 * test/test_transientdb.py
8636 (TestTransientTable.test_transient_table_read_twice): Fix
8637 doc-string
8638 (TestTransientTable.test_transient_table_query): New. Test for the
8639 SimpleQuery method
8640
8641 2003-05-06 Bernhard Herzog <[email protected]>
8642
8643 Convert all table users to use the new table interface. This only
8644 covers Thuban itself, not GREAT-ER or other applications built on
8645 Thuban yet, so the compatibility interface stays in place for the
8646 time being but it now issues DeprecationWarnings.
8647
8648 Finally, the new Table interface has a new method, HasColumn.
8649
8650 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
8651 issue deprecation warnings when they're. The warnings refer to the
8652 caller of the method.
8653 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
8654 for the deprecation warnings
8655
8656 * test/test_table.py: Ignore the deprecation warnings for the old
8657 table in the tests in this module. The purpose of the tests is to
8658 test the old interface, after all.
8659
8660 * test/test_transientdb.py
8661 (TestTransientTable.run_iceland_political_tests): Use the
8662 constants for the types. Add a test for HasColumn
8663 (TestTransientTable.test_transient_joined_table): Adapt to new
8664 table interface. Add a test for HasColumn
8665 (TestTransientTable.test_transient_table_read_twice): Adapt to new
8666 table interface
8667
8668 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8669 Adapt to new table interface
8670
8671 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8672 new table interface
8673
8674 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8675 (RecordTable.SetTable): Adapt to new table interface
8676
8677 * Thuban/UI/classifier.py (Classifier.__init__)
8678 (Classifier.__init__): Adapt to new table interface
8679
8680 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8681 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8682 to new table interface
8683
8684 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8685 (AutoTransientTable.HasColumn): Implement the new table interface
8686 method
8687 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8688 (AutoTransientTable.UniqueValues): Adapt to new table interface
8689
8690 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8691 Adapt to new table interface
8692
8693 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8694 simplify opening shapefiles a bit easier.
8695 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8696 (TestLayer.test_point_layer): Use the new helper method
8697 (TestLayer.test_get_field_type): New. Test for the GetFieldType
8698 method
8699
8700 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8701 the new table method
8702
8703 * test/test_memory_table.py (TestMemoryTable.test_has_column):
8704 Test for the new table method HasColumn
8705
8706 2003-05-06 Jonathan Coles <[email protected]>
8707
8708 Addresses the "Selection Extent" wish of RTbug #1787.
8709
8710 * Resources/Bitmaps/fulllayerextent.xpm,
8711 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8712 extent. These are just place holders for the real bitmaps.
8713
8714 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8715 calculate the bounding box once (the first time compute_bbox() is
8716 called).
8717 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8718 the bounding box for the shapes in lat/long coordinates.
8719
8720 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8721 option.
8722 (MainWindow.has_selected_shapes): New. Returns true if there are
8723 any selected shapes.
8724 (MainWindow.FullSelectionExtent): New. Calls
8725 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8726 (_has_selected_shapes): New. Returns true if there are any
8727 selected shapes.
8728
8729 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8730 true if there are any selected shapes.
8731
8732 * Thuban/UI/view.py (MapCanvas): Added delegated method
8733 HasSelectedShapes.
8734 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8735 shapes on the canvas using the map projection (if any).
8736
8737 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8738 for Layer.ShapesBoundingBox().
8739
8740 2003-05-06 Bernhard Herzog <[email protected]>
8741
8742 * Resources/Projections/defaults.proj: Fix spelling of Mercator
8743
8744 2003-05-05 Jonathan Coles <[email protected]>
8745
8746 Addresses the "Full Layer Extent" wish of RTbug #1787.
8747
8748 * Resources/Projections/defaults.proj: Added UK National Grid.
8749
8750 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8751 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8752 when the user selects the menu option.
8753
8754 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8755 scales the given layer on the canvas using the map projection.
8756
8757 2003-05-05 Bernhard Herzog <[email protected]>
8758
8759 Convert the table implementations to a new table interface. All
8760 tables use a common mixin class to provide backwards compatibility
8761 until all table users have been updated.
8762
8763 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8764 provide backwards compatibility for table classes implementing the
8765 new interface
8766 (DBFTable, MemoryTable): Implement the new table interface. Use
8767 OldTableInterfaceMixin as base for compatibility
8768 (DBFColumn, MemoryColumn): New. Column description for DBFTable
8769 and MemoryTable resp.
8770
8771 * test/test_dbf_table.py: New. Test cases for the DBFTable with
8772 the new table interface.
8773
8774 * test/test_memory_table.py: New. Test cases for the MemoryTable
8775 with the new table interface.
8776
8777 * test/test_table.py: Document the all tests in this file as only
8778 for backwards compatibility. The equivalent tests for the new
8779 interface are in test_memory_table.py and test_dbf_table.py
8780 (MemoryTableTest.test_read): field_info should be returning tuples
8781 with four items
8782 (MemoryTableTest.test_write): Make doc-string a more precise.
8783
8784 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8785 table interface. Derive from from OldTableInterfaceMixin for
8786 compatibility.
8787 (TransientTableBase.create): New intance variable column_map to
8788 map from names and indices to column objects
8789 (TransientTable.create): Use the new table interface of the input
8790 table
8791 (AutoTransientTable): Convert to new table interface. Derive from
8792 from OldTableInterfaceMixin for compatibility.
8793 (AutoTransientTable.write_record): Removed. It's not implemented
8794 yet and we still have to decide how to handle writing with the new
8795 table and data framework.
8796
8797 * test/test_transientdb.py
8798 (TestTransientTable.run_iceland_political_tests)
8799 (TestTransientTable.test_transient_joined_table): Use the new
8800 table interface
8801
8802 2003-05-05 Jonathan Coles <[email protected]>
8803
8804 This is namely a collection of UI updates to improve user interactivity.
8805 Tabbing between controls now exists and you can use ESC to close dialog
8806 boxes; ENTER will active the default button.
8807
8808 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8809 order that the controls are created so that tabbing works correctly.
8810 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8811 wxDialog can handle the default button correctly.
8812 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8813 same reasons as for OnOK.
8814 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8815 when we ask the table for the maximum/minimum values of a field
8816 which could take a very long time.
8817
8818 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8819 order that the controls are created so that tabbing works correctly.
8820 (SelectPropertiesDialog.__init__): Rearrange the order that the
8821 controls are created so that tabbing works correctly.
8822
8823 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8824 to derive from a wxDialog but behave like the original implementation
8825 which was derived from a wxFrame. wxDialog provides useful key
8826 handling functionality like ESC calling OnCancel and ENTER calling
8827 OnOK which is lost with wxFrame.
8828
8829 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8830 new dialogs.
8831
8832 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8833 order that the controls are created so that tabbing works correctly.
8834 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8835 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8836 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8837 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8838 can provide the "UK National Grid" as a default projection.
8839 (UTMPanel.__init__): Rearrange the order that the controls are
8840 created so that tabbing works correctly.
8841
8842 2003-05-05 Bernhard Herzog <[email protected]>
8843
8844 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8845 (project_point): If a map projection but no layer projection is
8846 given, convert degrees to radians before applying the map
8847 projection.
8848
8849 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8850 (TableGrid.allow_messages): New methods to make it possible to
8851 inhibit message sending.
8852 (TableGrid.issue): Only send the message if not inhibited.
8853 (LayerTableGrid.select_shape): Use the new methods to make sure
8854 that no ROW_SELECTED message is sent while we're updating the
8855 selected rows to match the selected shapes.
8856
8857 2003-05-02 Jan-Oliver Wagner <[email protected]>
8858
8859 Implementation of MemoryTable.
8860
8861 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8862 implementation that operates on a list of tuples. All of the data
8863 are kept in the memory.
8864
8865 * test/test_table.py (MemoryTableTest): New.
8866
8867 * test/test_transientdb.py (SimpleTable): Removed.
8868 (TestTransientTable.test_transient_joined_table,
8869 (TestTransientTable.test_transient_table_read_twice): Replaced
8870 SimpleTable by MemoryTable.
8871
8872 2003-04-30 Jonathan Coles <[email protected]>
8873
8874 * Data/iceland_sample.thuban: Now contains correct projections
8875 for each of the layers.
8876
8877 * Resources/Projections/defaults.proj: Geographic projection
8878 contains unit conversion parameter.
8879
8880 2003-04-30 Jonathan Coles <[email protected]>
8881
8882 The most important part of this putback is the projection changes.
8883 It should now be possible to specify the projection that a layer
8884 is in and then specify a different projection for the map. The
8885 projection dialog has an extra parameter for a geographic projection
8886 which lets the user select if the input is in degrees or radians.
8887
8888 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8889 to say that the parameter is a tuple of unprojected
8890 points (which is what the callers to this method were assuming).
8891 Also, since the points are unprojected we need to projected them.
8892
8893 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8894 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8895 groups are selected, move the layer up/down. Fixes RTbug #1833.
8896
8897 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8898
8899 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8900 parameter in call to SetClientData.
8901 (GeoPanel): Add support for selecting the units that the
8902 source data is in (Radians or Degrees).
8903
8904 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8905 the rendering loop by reducing the number of if's, removing the
8906 unnecessary try/except block, and checking if the old group
8907 is the same as the new one (which happens a lot if there is
8908 no classification, or lots of shapes are in the same group).
8909
8910 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8911 around the redraw routine to try to catch problems that the user
8912 may create by selecting invalid projections for the data set and
8913 map. Clears the display if there are any problems and prints the
8914 error.
8915 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8916 rectangle.
8917
8918 * extensions/thuban/wxproj.cpp (project_point): First invert the
8919 supplied point (which should be in projected coordinates) using
8920 the layer's projection and then project the point using the
8921 map's projection.
8922 (project_points): Use project_point() to project each point.
8923
8924 2003-04-30 Jan-Oliver Wagner <[email protected]>
8925
8926 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8927 don't set the Classification to None if the classfication field
8928 is None (ie only a DEFAULT).
8929
8930 2003-04-30 Bernhard Herzog <[email protected]>
8931
8932 * Thuban/UI/view.py: Fix some typos.
8933
8934 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8935 not pop up the dialog if the selection becomes empty (this could
8936 happen if e.g. a new selection is opened while the identify tool
8937 is active and dialog had been closed)
8938
8939 2003-04-30 Bernhard Herzog <[email protected]>
8940
8941 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8942 instance variable read_record_last_result
8943 (TransientTableBase.read_record): Make sure reading the same
8944 record twice works. The implementation uses the new instance
8945 variable read_record_last_result
8946
8947 * test/test_transientdb.py
8948 (TestTransientTable.test_transient_table_read_twice): New test
8949 case for the above bug-fix.
8950
8951 2003-04-29 Jonathan Coles <[email protected]>
8952
8953 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8954
8955 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8956
8957 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8958 (ClassTable.SetValueAsCustom): Rename keyword argument in
8959 ClassGroup* constructors to match argument name.
8960
8961 2003-04-29 Bernhard Herzog <[email protected]>
8962
8963 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8964 transient DB if it exists to make sure it doesn't leave a journal
8965 file in the temp directory.
8966
8967 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8968 self.conn to None after closing the connection to make sure it's
8969 not closed twice
8970
8971 2003-04-29 Jonathan Coles <[email protected]>
8972
8973 Add a visible parameter in the layer XML tag. The default value is
8974 "true". If anything other than "false" is specified we also assume
8975 "true". Addresses RTbug #1025.
8976
8977 * Doc/thuban.dtd: Add visible parameter to a layer.
8978
8979 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8980 of visible from 1 to True.
8981 (Layer.__init__): Change default value of visible from 1 to True.
8982
8983 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8984 parameter.
8985
8986 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8987 parameter.
8988
8989 * test/test_load.py: Add new test data contents_test_visible.
8990 (LoadSessionTest.setUp): save test data.
8991 (LoadSessionTest.testLayerVisibility): Test if the visible flag
8992 is loaded correctly.
8993
8994 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8995 for saving an invisible layer.
8996
8997 2003-04-29 Jonathan Coles <[email protected]>
8998
8999 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9000 legend dialog box and tell it to change its map to the one
9001 supplied to SetMap(). Fixes RTbug #1770.
9002
9003 2003-04-29 Bernhard Herzog <[email protected]>
9004
9005 Next step of table implementation. Introduce a transient database
9006 using SQLite that some of the data is copied to on demand. This
9007 allows us to do joins and other operations that require an index
9008 for good performance with reasonable efficiency. Thuban now needs
9009 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9010 haven't tested that.
9011
9012 * Thuban/Model/transientdb.py: New. Transient database
9013 implementation.
9014
9015 * test/test_transientdb.py: New. Tests for the transient DB
9016 classes.
9017
9018 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9019 classes to help automatically remove temporary files and
9020 directories.
9021 (Session.__init__): New instance variables temp_dir for the
9022 temporary directory and transient_db for the SQLite database
9023 (Session.temp_directory): New. Create a temporary directory if not
9024 yet done and return its name. Use AutoRemoveDir to have it
9025 automatically deleted
9026 (Session.TransientDB): Instantiate the transient database if not
9027 done yet and return it.
9028
9029 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9030 AutoTransientTable so that data is copied to the transient DB on
9031 demand.
9032 (SimpleStore): New class that simply combines a table and a
9033 shapefile
9034
9035 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9036 DBFTable and update its doc-string to reflect the fact that this
9037 is only the table interface to a DBF file. Table is now an alias
9038 for DBFTable for temporary backwards compatibility.
9039
9040 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9041 the last reference to the session goes away so that the temporary
9042 files are removed properly.
9043
9044 * test/test_load.py (LoadSessionTest.tearDown): Remove the
9045 reference to the session to make sure the temporary files are
9046 removed.
9047
9048 2003-04-29 Bernhard Herzog <[email protected]>
9049
9050 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9051 the __parser instance variable into a normal local variable in
9052 read. It's only used there and read will never be called more than
9053 once. Plus it introduces a reference cycle that keeps can keep the
9054 session object alive for a long time.
9055
9056 2003-04-29 Jonathan Coles <[email protected]>
9057
9058 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9059 Projection an immutable item. Fixes RTbug #1825.
9060 (Projection.__init__): Initialize instance variables here.
9061 (ProjFile.Replace): New. Replace the given projection object with
9062 the new projection object. This solves the problem of needing the
9063 mutator Projection.SetProjection() in the ProjFrame class and
9064 allows a projection to change parameters without changing its
9065 location in the file.
9066
9067 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9068 be of type wxSAVE and should verify overwriting a file.
9069
9070 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9071 ProjFile.Replace() method instead of the mutator
9072 Projection.SetProjection(). Also requires that we reassign the
9073 client data to the new projection.
9074
9075 * test/test_proj.py (TestProjection.test): Test GetName() and
9076 GetAllParameters()
9077 (TestProjFile.test): Remove tests for Set*() methods. Add tests
9078 for Replace().
9079
9080 2003-04-25 Jonathan Coles <[email protected]>
9081
9082 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9083 to save the name of the projection.
9084
9085 * test/test_save.py (SaveSessionTest.testLayerProjection): New
9086 test to verify layer projections are saved correctly.
9087
9088 2003-04-25 Jonathan Coles <[email protected]>
9089
9090 * Thuban/Model/proj.py (Projection.SetName): Set the name
9091 to "Unknown" if name is None.
9092 (Projection.SetAllParameters): New. Set the projection's
9093 parameter list to the one supplied.
9094 (Projection.SetProjection): New. Set the projection's
9095 properties to those of the supplied Projection.
9096
9097 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9098 the dialog title to include the map's title.
9099 (MainWindow.LayerProjection): Set the dialog title to include
9100 the layer's title.
9101
9102 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9103 error dialogs into a single method call.
9104 (ProjFrame.__VerifyButtons): Add more states to check.
9105 (ProjFrame.__GetProjection): Return the current state of an
9106 edited projection or None.
9107 (ProjFrame.__FillAvailList): Remove checks for states that
9108 shouldn't exist.
9109 (ProjFrame._OnNew): Clear all selected items and supply
9110 a projection panel if necessary.
9111
9112 * test/test_proj.py (TestProjFile.test): Add tests for
9113 ProjFile.SetAllParameters, ProjFile.SetProjection,
9114 ProjFile.SetName.
9115
9116 2003-04-25 Jonathan Coles <[email protected]>
9117
9118 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9119 takes an optional argument to select the current projection.
9120 This does not guarantee that the item is visible due to
9121 limited wxWindows functionality. Fixes RTBug #1821.
9122
9123 2003-04-25 Jonathan Coles <[email protected]>
9124
9125 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9126 the projection name and use it when constructing the Projection
9127 object.
9128
9129 * Thuban/Model/proj.py (Projection.__init__): Change the default
9130 value for 'name' to None and then test if name is equal to None
9131 in the body of the constructor. This way the caller doesn't have to
9132 know what the default value should be. Namely, useful in load.py
9133 where we have to pick a default value if the 'name' parameter
9134 doesn't exist in the XML file.
9135
9136 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9137 Tests a file where a layer has a projection.
9138
9139 2003-04-25 Jonathan Coles <[email protected]>
9140
9141 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9142 tree for projection information.
9143
9144 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9145 XMLReader.GetFileName.
9146 (SessionLoader): Added support for loading projection tags that
9147 appear inside a layer.
9148
9149 * Thuban/Model/proj.py (ProjFile): Document the class. Move
9150 back to using a list because the order of the projections in
9151 the file is important to maintain. Fixes RTbug #1817.
9152
9153 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9154 to ProjFile.GetFilename.
9155
9156 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9157 information.
9158
9159 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9160 ProjFrame._OnSaveAs. Removed old dead code from previous
9161 implementation.
9162 (ProjFrame._OnExport): Add support for exporting more than one
9163 projection to a single file.
9164 (ProjFrame.__FillAvailList): use string formatting (% operator)
9165 to build strings that are (partly) translated. Fixes RTbug #1818.
9166
9167 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9168 class.
9169
9170 2003-04-24 Bernhard Herzog <[email protected]>
9171
9172 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9173
9174 * po/fr.po: New. French translation by Daniel Calvelo Aros
9175
9176 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9177 empty strings.
9178
9179 2003-04-24 Jonathan Coles <[email protected]>
9180
9181 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9182 implement the interface that the ProjFrame dialog expects.
9183
9184 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9185 name of the projection to be changed.
9186 (ProjFile): Use a dictionary instead of a list so that removing
9187 projections is easier and we are sure about uniqueness.
9188 (ProjFile.Remove): Remove the given projection object.
9189
9190 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9191 Return a list with only one projection file instead of searching for
9192 any projection file. This simplifies many things if the user can
9193 only have one system file and one user file.
9194
9195 * Thuban/UI/classgen.py: Change all references to
9196 genCombo to genChoice.
9197
9198 * Thuban/UI/mainwindow.py: Add a Projection option under the
9199 layer menu.
9200 (MainWindow.LayerProjection): New. Open up a projection window
9201 for a layer.
9202
9203 * Thuban/UI/projdialog.py: Large changes to how the dialog is
9204 laid out. Use three panels instead of one. One for the list of
9205 projections, one for the edit controls, and one for the buttons.
9206 Fixed resizing problems so that the dialog resizes correctly
9207 when the projection panel changes. Added import/export, save, and
9208 new buttons/functionality.
9209
9210 2003-04-24 Bernhard Herzog <[email protected]>
9211
9212 First step towards table management. Introduce a simple data
9213 abstraction so that we replace the data a layer uses more easily
9214 in the next step.
9215
9216 * Thuban/Model/data.py: New file with a simple data abstraction
9217 that bundles shapefile and dbffile into one object.
9218
9219 * Thuban/Model/session.py (Session.OpenShapefile): New method to
9220 open shapefiles and return a shape store object
9221
9222 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9223 object instead of a shapefile filename. This introduces a new
9224 instance variable store holding the datastore. For intermediate
9225 backwards compatibility keep the old instance variables.
9226 (open_shapefile): Removed. No longer needed with the shape store.
9227 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9228 get the shape store used by a layer.
9229 (Layer.Destroy): No need to explicitly destroy the shapefile or
9230 table anymore.
9231
9232 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9233 (MainWindow.AddLayer): Use the session's OpenShapefile method to
9234 open shapefiles
9235
9236 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9237 session's OpenShapefile method to open shapefiles
9238
9239 * test/test_classification.py
9240 (TestClassification.test_classification): Use the session's
9241 OpenShapefile method to open shapefiles and build the filename in
9242 a more platform independed way
9243
9244 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9245 Implement to have a session to use in the tests
9246 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9247 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9248 session's OpenShapefile method to open shapefiles
9249 (TestLayerLegend.setUp): Instantiate a session so that we can use
9250 it to open shapefiles.
9251 (TestLayerLegend.tearDown): Make sure that all references to
9252 layers and session are removed otherwise we may get a resource
9253 leak
9254
9255 * test/test_map.py (TestMapAddLayer.test_add_layer)
9256 (TestMapWithContents.setUp): Instantiate a session so that we can
9257 use it to open shapefiles.
9258 (TestMapWithContents.tearDown): Make sure that all references to
9259 layers, maps and sessions are removed otherwise we may get a
9260 resource leak
9261 ("__main__"): use support.run_tests() so that more info about
9262 uncollected garbage is printed
9263
9264 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9265 session's OpenShapefile method to open shapefiles
9266 ("__main__"): use support.run_tests() so that more info about
9267 uncollected garbage is printed
9268
9269 * test/test_selection.py (TestSelection.tearDown): Make sure that
9270 all references to the session and the selection are removed
9271 otherwise we may get a resource leak
9272 (TestSelection.get_layer): Instantiate a session so that we can
9273 use it to open shapefiles.
9274 ("__main__"): use support.run_tests() so that more info about
9275 uncollected garbage is printed
9276
9277 * test/test_session.py (TestSessionBase.tearDown)
9278 (TestSessionWithContent.tearDown): Make sure that all references
9279 to the session and layers are removed otherwise we may get a
9280 resource leak
9281 (TestSessionWithContent.setUp): Use the session's OpenShapefile
9282 method to open shapefiles
9283
9284 2003-04-24 Jonathan Coles <[email protected]>
9285
9286 * Thuban/Model/load.py (XMLReader.read): Should have been checking
9287 if the file_or_filename object had the 'read' attribute.
9288
9289 2003-04-23 Jonathan Coles <[email protected]>
9290
9291 * Thuban/Model/resource.py: Fixes RTbug #1813.
9292 (ReadProjFile): Add documentation about which exceptions are raised.
9293 Always pass the exceptions up to the caller.
9294 (GetProjFiles): If the directory can't be read return an empty list.
9295 If any of the proj files can't be read skip that file and go
9296 on to the next one.
9297
9298 * test/test_proj.py: Added test cases to handle nonexistent files,
9299 unreadable files, and files that don't parse correctly.
9300
9301 2003-04-23 Jonathan Coles <[email protected]>
9302
9303 Projection dialog. Allows the user to select from a list
9304 of projection templates and optionally edit them and save new ones.
9305
9306 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9307 (ProjPanel): Base class for projection specific panels.
9308 (TMPanel): Projection panel for Transverse Mercartor.
9309 (UTMPanel): Projection panel for Universal Transverse Mercartor.
9310 (LCCPanel): Projection panel for Lambert Conic Conformal.
9311 (GeoPanel): Projetion panel for Geographic Projection.
9312
9313 2003-04-23 Jonathan Coles <[email protected]>
9314
9315 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9316 promote symmetry. There now exists XMLReader and XMLWriter.
9317 (XMLReader.read): New. Call to read the given file descriptor or
9318 filename.
9319 (XMLReader.close): New. Make sure the file is closed.
9320 (XMLReader.GetFileName): New. Return just the file name that is being
9321 read from.
9322 (XMLReader.GetDirectory): New. Return just the directory of the file
9323 that is being read.
9324 (XMLReader.AddDispatchers): New. Take a dictionary which contains
9325 the names of functions to call as the XML tree is parsed.
9326 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9327 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9328 (SessionLoader): Removed class variables start_dispatcher and
9329 end_dispatcher since this functionality is now part of a class
9330 instance. Fixes RTbug #1808.
9331 (SessionLoader.__init__): Add dispatcher functions.
9332 (load_xmlfile): Code was moved into the XMLReader.read().
9333 (load_session): Use modified SessionLoader.
9334
9335 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9336 map's projection.
9337
9338 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9339 GetAllParameters.
9340 (Projection.GetParameter): Returns the value for the given parameter.
9341
9342 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9343 (GetProjFiles): Renamed from GetProjections. Now returns a list
9344 of ProjFile objects.
9345 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9346 a list of ProjFile objects whose files are not user defined.
9347 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9348 list of ProjFile objects whose files are user defined.
9349 (ProjFileReader): Extend new XMLReader.
9350
9351 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9352 promote symmetry.
9353
9354 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9355 control instead of a wxComboBox. wxChoice controls do not generate
9356 events as the uses highlights possible choices which fixes problems
9357 with resizing the dialog when the use selects an option.
9358
9359 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9360 control instead of a wxComboBox.
9361
9362 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9363 dialog.
9364
9365 * test/test_proj.py (TestProjection.test): New tests for GetParameter
9366 method.
9367
9368 2003-04-22 Bernhard Herzog <[email protected]>
9369
9370 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9371 constants
9372
9373 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9374 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9375
9376 2003-04-17 Bernhard Herzog <[email protected]>
9377
9378 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9379 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9380 anymore.
9381 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9382 (Layer.ShapeType, Layer.Shape): No need to call
9383 self.open_shapefile since it's always called in __init__
9384
9385 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9386 In wxPython 2.4 there's no need to extend MainLoop anymore since
9387 wxPython itself makes sure OnExit is called.
9388
9389 2003-04-16 Jonathan Coles <[email protected]>
9390
9391 Initial putback of projection management code. Includes new
9392 classes to read and write projection files. The current load
9393 and save classes were abstracted a bit so they could be reused.
9394 The Projection class was extended to provide new methods and
9395 have a name.
9396
9397 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9398 general XML reading methods that were part of ProcessSession.
9399
9400 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9401 name.
9402 (ProjFile): New. Represents a file that contains projection
9403 information.
9404
9405 * Thuban/Model/resource.py: New. Contains general utilities
9406 for read and writing projection files.
9407
9408 * Thuban/Model/save.py (XMLSaver): New. Contains all the
9409 general XML writing methods that were part of SessionSaver.
9410 (SessionSaver): Renamed from Saver.
9411
9412 * test/test_proj.py: New test cases for the projection
9413 file read and write functions.
9414
9415 2003-04-16 Jonathan Coles <[email protected]>
9416
9417 * Thuban/Model/classification.py: Use repr() around values
9418 in the ClassGroup*.__repr__() methods so it is clearer when
9419 a value is a string and when it is a number.
9420
9421 * test/test_load.py: Rework the classification test to test
9422 that we can load old files.
9423 (testLabels): Test a file where the groups have labels.
9424
9425 2003-04-16 Bernhard Herzog <[email protected]>
9426
9427 Safer implementation of the performance enhancements of the
9428 low-level renderer:
9429
9430 * extensions/thuban/wxproj.cpp (extract_projection)
9431 (extract_pointer): Rename extract_projection to extract_pointer
9432 and redefine its purpose to return the pointer stored in a CObject
9433 returned by the object's cobject method. Update all callers.
9434 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9435 handling of these low-level parameters so that each s_draw_info
9436 instance is handled as a CObject at python level that also
9437 contains real references to the actual python objects which
9438 contain the values in the struct. Add free_draw_info as the
9439 destructor.
9440 (draw_polygon_shape): Add the py_draw_info parameter which must a
9441 cobject containing an s_draw_info pointer.
9442
9443 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9444 method to instantiat the low-level render parameter
9445 (MapRenderer.draw_shape_layer): Use the new method. Remove some
9446 commented out code.
9447 (MapRenderer.draw_polygon_shape): Make the first parameter not the
9448 layer but the low-level render parameter
9449 (ScreenRenderer.draw_shape_layer): Use the low-level render
9450 parameter.
9451
9452 2003-04-15 Jonathan Coles <[email protected]>
9453
9454 * Thuban/Model/classification.py: Implemented __repr__ for
9455 the ClassGroup* classes to make debugging a bit easier.
9456 (ClassGroup.SetLabel): Check that the string is an instance
9457 of StringTypes not StringType. Accounts for Unicode strings.
9458
9459 * Thuban/Model/color.py: Implemented __repr__ to make
9460 debugging a bit easier.
9461
9462 * Thuban/Model/save.py (Saver.write_classification): Need to
9463 save the group label.
9464
9465 * test/test_load.py (testClassification): New. Loads the
9466 iceland_sample_test.thuban file and checks if it was loaded
9467 correctly.
9468
9469 2003-04-15 Jonathan Coles <[email protected]>
9470
9471 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9472 to improve rendering performance by initializing the variables
9473 that are not change each time draw_polygon_shape() is called.
9474 The values are stored in a global struct draw_info.
9475 (draw_polygon_shape): Removed initialization code that is
9476 now in draw_polygon_init().
9477
9478 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9479 drawing initialization call to draw_polygon_init()
9480 (MapRenderer.draw_polygon_shape): Use new signature of
9481 draw_polygon_shape.
9482
9483 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9484 weirdness by setting the range to (1, maxint).
9485
9486 * Thuban/Model/classification.py (ClassGroupProperties): Make
9487 instance variables private and optimize comparison operator
9488 by first checking if the color references are the same.
9489 (ClassGroupSingleton): Make instance variables private.
9490 (ClassGroupRange): Make instance variables private.
9491
9492 * HOWTO-Release: Filled in missing steps for releasing packages.
9493
9494 2003-04-15 Bernhard Herzog <[email protected]>
9495
9496 First stab at internationalized messages:
9497
9498 * Thuban/__init__.py (_): Implement the translation function for
9499 real using the python gettext module.
9500
9501 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9502 translate empty strings.
9503
9504 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9505 Add a missing space to a warning message
9506
9507 * po/README: New. Notes about the management of the translation
9508 files.
9509
9510 * po/Makefile: New. Makefile to help manage the translation files.
9511
9512 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9513
9514 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9515 translations and support files in po/
9516
9517 * setup.py (data_files): Add the *.mo files to the data_files too
9518
9519 * README: Add note about the translations when building from CVS
9520
9521 2003-04-14 Jonathan Coles <[email protected]>
9522
9523 * Thuban/UI/dock.py: Fixes some window resizing problems most
9524 noticable under windows. Always assume the button bitmaps will
9525 be there. Code clean up.
9526 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9527 images for the dock/undock button to the same images.
9528 Work around for RTbug #1801.
9529
9530 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9531 be allowed to grow within the sizer. Fixes a bug under Windows
9532 where the toolbar wasn't being drawn.
9533
9534 2003-04-14 Frank Koormann <[email protected]>
9535
9536 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9537 Updated design to try to make the button functionality more
9538 transparent.
9539
9540 2003-04-14 Jonathan Coles <[email protected]>
9541
9542 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9543 finalize the intialization of the panel.
9544
9545 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9546 creation of the panel. Should be the last thing called in the
9547 initializer of a subclass.
9548
9549 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9550 set the current selections in the combo boxes. This is needed
9551 under Windows.
9552
9553 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9554 level panel to the dialog so that the background colors are
9555 consistent under Windows.
9556
9557 2003-04-11 Jonathan Coles <[email protected]>
9558
9559 * Thuban/UI/classgen.py: Change color ramps to start at white
9560 not black.
9561
9562 * Thuban/UI/legend.py: Enable/disable the legend buttons when
9563 the legend changes. Fixes RTbug #1793.
9564
9565 * test/test_classification.py: Added test for copying of
9566 classifications.
9567
9568 2003-04-11 Jonathan Coles <[email protected]>
9569
9570 * Thuban/UI/resource.py: New. Centralize the loading of resources
9571 such as bitmaps.
9572
9573 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
9574 added images to the move buttons, added 'reverse' button.
9575 (CustomRampPanel.__init__): Added images to the move buttons.
9576 (GreyRamp): New. Generates a ramp from white to black.
9577 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
9578
9579 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
9580 ID_PROPERTY_*.
9581 (Classifier.__init__): Minor changes to the layout.
9582 (Classifier._OnTitleChanged): Listen for when the user edits the
9583 title and update the dialog's title and the layer's title.
9584
9585 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
9586
9587 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
9588 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
9589 if the layer's title changes.
9590
9591 * Thuban/UI/mainwindow.py: Added new menu item and associated code
9592 to open a dialog to rename the map.
9593 (MainWindow): Use new resource class to import bitmaps.
9594
9595 2003-04-11 Jonathan Coles <[email protected]>
9596
9597 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
9598 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
9599 Resources/Bitmaps/group_use_none.xpm,
9600 Resources/Bitmaps/group_use_not.xpm,
9601 Resources/Bitmaps/hide_layer.xpm,
9602 Resources/Bitmaps/layer_properties.xpm,
9603 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
9604 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
9605 New.
9606
9607 2003-04-10 Jonathan Coles <[email protected]>
9608
9609 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
9610 Should pass group to ClassGroup constructor.
9611
9612 2003-04-10 Jonathan Coles <[email protected]>
9613
9614 * Thuban/Model/classification.py: (ClassGroup): Move all the common
9615 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
9616 here. Implement SetVisible(), IsVisible().
9617 (ClassGroup.__init__): Add group parameter which acts as a copy
9618 constructor.
9619
9620 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
9621 "Visible" check boxes.
9622 (Classifier): Rename the buttons and refactor the code to match
9623 the new labels.
9624
9625 * Thuban/UI/legend.py: Classify button is now called "Properties".
9626 Refactored the code to change variable names.
9627 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
9628
9629 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
9630 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
9631 renamed to MainWindow.LayerEditProperties.
9632 (MainWindow.ToggleLegend): Don't include map name in legend title.
9633 (MainWindow.SetMap): Added the map name to the window title.
9634 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
9635 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
9636 Functionality is found in the layer properties dialog.
9637
9638 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9639 draw visible groups.
9640
9641 2003-04-09 Jonathan Coles <[email protected]>
9642
9643 * Thuban/UI/classgen.py: Modifications to allow simple
9644 addition and selection of new color schemes.
9645 (MonochromaticRamp): New. Generates a ramp between two colors.
9646 (RedRamp): New. Generates a ramp of all red.
9647 (GreenRamp): New. Generates a ramp of all green.
9648 (BlueRamp): New. Generates a ramp of all blue.
9649
9650 2003-04-09 Jonathan Coles <[email protected]>
9651
9652 * Thuban/Model/classification.py (Classification.__deepcopy__):
9653 Need to copy over field and fieldType attributes.
9654
9655 * Thuban/Model/table.py (Table.field_range): New. Retrive the
9656 maximum and minimum values over the entire table for a given
9657 field.
9658 (Table.GetUniqueValues): New. Retrieve all the unique values
9659 in the table for a given field.
9660
9661 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9662 (GenUniquePanel): New. Controls to allow the user to select
9663 which unique field values they would like in the classification.
9664 (CustomRampPanel): Code that was in ClassGenDialog that allows
9665 the user to select the properties for a custom ramp.
9666 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9667
9668 * Thuban/UI/classifier.py: Removed a lot of debugging code.
9669 (Classifier._SetClassification): Callback method so that the
9670 class generator can set the classification in the grid.
9671 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9672 editing of a group properties class into a wxWindows control.
9673
9674 * Thuban/UI/dock.py: It was decided that if the user closes
9675 a dockable window the window should simply hide itself. That
9676 way if the user wants to show the dock again it appears in the
9677 same place as it was when it was closed.
9678 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9679 (DockableWindow._OnButtonClose): Hide the window instead of
9680 destroying it.
9681 (DockableWindow._OnClose): Hide the window instead of
9682 destroying it.
9683
9684 * Thuban/UI/legend.py (LegendTree): Use a private method to
9685 consistently set the font and style of the text. Fixes RTbug #1786.
9686
9687 * Thuban/UI/mainwindow.py: Import just the Classifier class.
9688
9689 2003-04-07 Bernhard Herzog <[email protected]>
9690
9691 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9692 to the map module
9693
9694 2003-04-07 Bernhard Herzog <[email protected]>
9695
9696 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9697 favor of ToggleSessionTree
9698 (MainWindow.ToggleSessionTree): New method to toggle visibility of
9699 the session tree.
9700 (MainWindow.SessionTreeShown): New method to return whether the
9701 session tree is currently shown.
9702 (MainWindow.ToggleLegend): New method to toggle visibility of the
9703 legend
9704 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9705 LegendShown
9706 (MainWindow.LegendShown): New method to return whether the legend
9707 is currently shown.
9708 (_method_command): Add checked parameter so we can define check
9709 menu items
9710 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9711 mainwindow methods.
9712 (show_session_tree, show_legend commands): Removed.
9713 (toggle_session_tree, toggle_legend commands): New commands to
9714 toggle the visibility of the dialogs
9715
9716 2003-04-07 Jonathan Coles <[email protected]>
9717
9718 * Thuban/UI/classgen.py: Fix Windows problem.
9719
9720 * Thuban/UI/dock.py: Fix Windows problem.
9721
9722 * Thuban/UI/mainwindow.py: Use False instead of false.
9723 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9724
9725 2003-04-07 Jonathan Coles <[email protected]>
9726
9727 Since we now say that the order of the groups in a classification
9728 matters, it makes sense to be able to manipulate that order. Most
9729 of the changes to Thuban/Model/classification.py are to that end.
9730
9731 * Thuban/Model/classification.py (Classification.AppendGroup,
9732 Classification.InsertGroup, Classification.ReplaceGroup,
9733 Classification.RemoveGroup, Classification.GetGroup): Do as the
9734 names imply.
9735 (Classification.FindGroup): This was called GetGroup, but GetGroup
9736 takes an index, while FindGroup takes a value.
9737 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9738 REFERENCE. Currently there is a cyclic reference between the layer
9739 and its classification. If the classification doesn't need to know
9740 its owning layer we can change this, since it may make sense to be
9741 able to use the same classification with different layers.
9742
9743 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9744
9745 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9746 not AddGroup()
9747
9748 * Thuban/UI/classifier.py: Now that we can depend on the order in
9749 a Classification and have methods to manipulate that order we don't
9750 need to use our own data structures in the grid. We can simply make
9751 the grid/table access the information they need from a copy of
9752 the classification object.
9753 (Classifier._OnCloseBtn): Event handler for when the user clicks
9754 'Close'. This is needed so if the user applies changes and then
9755 continues to change the table the user has the option of discarding
9756 the most recent changes and keeping what they applied.
9757
9758 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9759 into the same group.
9760
9761 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9762 with a really old version of proj, PJ_VERSION won't even be defined.
9763 If it isn't defined then just compile so that the function always
9764 returns Py_False.
9765
9766 * test/test_classification.py: Fix tests to use the renamed methods.
9767 Still need to write tests for the new methods.
9768
9769 2003-04-04 Jonathan Coles <[email protected]>
9770
9771 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9772 call to SetSelection out of the method and before the call
9773 to __SelectField in __init__. This prevents a recursion of events
9774 when _OnFieldSelect is triggered by the user.
9775
9776 2003-04-04 Jonathan Coles <[email protected]>
9777
9778 * Thuban/Model/classification.py: Rename Color.None to
9779 Color.Transparent.
9780 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9781 Don't bother copying the color, since Colors are immutable.
9782
9783 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9784 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9785 Thuban/UI/renderer.py, Thuban/UI/view.py:
9786 Rename Color.None to Color.Transparent.
9787
9788 * test/test_classification.py, test/test_load.py: Rename Color.None
9789 to Color.Transparent.
9790
9791 2003-04-04 Jonathan Coles <[email protected]>
9792
9793 * Thuban/Model/classification.py: Fix assert calls.
9794 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9795 Copy the color parameter rather than hold onto a reference.
9796
9797 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9798 the color object.
9799 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9800 are sure there exists only one refernce to Color.None in the system.
9801 This allows us to use 'is' rather than the comparision functions.
9802
9803 * Thuban/Model/save.py: Fix assert calls.
9804
9805 * Thuban/UI/classifier.py: Fix assert calls.
9806 (ClassGrid._OnCellDClick): Call up to the classifier to open the
9807 dialog to edit the groups properties.
9808 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9809 correctly if a cell is resized.
9810 (ClassTable.SetClassification): New. Changes the classification
9811 that is in the table.
9812 (ClassTable.__SetRow): Allow groups to be prepended.
9813 (Classifier): New code for opening the EditProperties and
9814 GenerateRanges dialogs.
9815 (SelectPropertiesDialog.__GetColor): Only set the color in the
9816 color dialog if the current color is not None.
9817
9818 * Thuban/UI/dock.py: Fix assert calls.
9819
9820 * Thuban/UI/legend.py: Fix assert calls.
9821
9822 * Thuban/UI/renderer.py: Fix assert calls.
9823
9824 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9825 classifications.
9826 (GenRangePanel): Panel specific to range generation.
9827 (GenSingletonPanel): Panel specific to singleton generation.
9828 (ClassGenerator): Class responsible for actually generating
9829 the classification from the data gathered in the dialog box.
9830 (PropertyRamp): Generates properties whose values range from
9831 a starting property to an ending property.
9832
9833 2003-04-03 Bernhard Herzog <[email protected]>
9834
9835 * test/support.py (print_garbage_information): New function that
9836 prints information about still connected messages and memory
9837 leaks.
9838 (run_suite): Removed.
9839 (run_tests): New function for use as a replacement of
9840 unittest.main in the test_* files. This one calls
9841 print_garbage_information at the end.
9842
9843 * test/runtests.py (main): Use support.print_garbage_information
9844
9845 * test/test_layer.py: Use support.run_tests instead of
9846 unittest.main so we get memory leak information
9847 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9848 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9849 (TestLayerLegend.test_visibility): Call the layer's Destroy method
9850 to fix a memory leak.
9851
9852 * test/test_classification.py: Use support.run_tests instead of
9853 unittest.main so we get memory leak information
9854 (TestClassification.test_classification): Call the layer's Destroy
9855 method to fix a memory leak.
9856
9857 2003-04-02 Bernhard Herzog <[email protected]>
9858
9859 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9860 Handle the reference counts of the return value and errors in
9861 PyArg_ParseTuple correctly.
9862
9863 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9864 sure the filename is absolute to avoid problems when saving the
9865 session again
9866
9867 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9868
9869 2003-04-01 Jonathan Coles <[email protected]>
9870
9871 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9872 that there actually are points in the returned list of points
9873 before trying to index into the list. The list may be empty if
9874 the shape is a Null Shape.
9875
9876 2003-04-01 Bernhard Herzog <[email protected]>
9877
9878 * test/test_map.py: Don't use from <module> import *
9879
9880 2003-04-01 Jonathan Coles <[email protected]>
9881
9882 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9883 LAYER_LEGEND_CHANGED
9884
9885 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9886 self.Destroy() to close the window after yesterday's changes.
9887
9888 * test/test_map.py, test/test_session.py: Fix messages that
9889 are sent from maps and layers.
9890
9891 2003-03-31 Jonathan Coles <[email protected]>
9892
9893 * Thuban/UI/classifier.py: Commented out some debugging statements.
9894 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9895 RTbug #1769.
9896
9897 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9898 position (although position doesn't work yet under GTK).
9899 (DockableWindow.Destroy): New. Called when the window must be
9900 closed. Namely needed when the DockFrame closes and must close
9901 its children.
9902 (DockFrame): Listen for EVT_CLOSE and destroy all children.
9903
9904 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9905 when then window is told to close.
9906 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9907 comment in source for more info.
9908
9909 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9910
9911 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9912 symmetry with other such methods.
9913 (MainWindow.ShowLegend): Show the legend docked by default.
9914
9915 2003-03-28 Jonathan Coles <[email protected]>
9916
9917 * Thuban/UI/classifier.py: Support for highlighting a specific
9918 group within the grid when the classification dialog is opened.
9919 Also contains a lot of debugging printouts which will later
9920 be removed.
9921
9922 * Thuban/UI/dock.py: Complete rework on the dock code so that
9923 that it is fairly removed from the rest of the Thuban application.
9924 It is easy to add new docks which the rest of the program having
9925 to be aware of them.
9926
9927 * Thuban/UI/legend.py: Modifications to support selecting a
9928 specific group in the classification dialog. Changed how layers
9929 are drawn when the layer is visible/invisible.
9930
9931 * Thuban/UI/mainwindow.py: Removed legend specific code and
9932 replaced it with calls to the new dock code.
9933
9934 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9935 to check if scale > 0. Trying to track down a divide by zero.
9936
9937 2003-03-26 Jonathan Coles <[email protected]>
9938
9939 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9940 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9941 now part of DockableWindow.
9942 (LegendPanel.DoOnSelChanged): Select the current layer in the
9943 map.
9944 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9945 with the selected layer and/or group.
9946
9947 2003-03-26 Jonathan Coles <[email protected]>
9948
9949 This putback contains the code for dockable windows. There is
9950 no support in wxWindows as of this date for windows that can
9951 attach themselves to other windows.
9952
9953 The current model contains a DockableWindow which has a parent
9954 window for when it is detached and a dock window that it puts
9955 its contents in when it is docked. The contents of a DockableWindow
9956 must be a DockPanel. DockPanel itself derives from wxPanel.
9957
9958 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9959 message, not a LAYER_LEGEND_CHANGED message.
9960
9961 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9962
9963 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9964 as one of the style properties for the fieldTypeText item to
9965 be sure that its size is correct when the text changes.
9966
9967 * Thuban/UI/dock.py: New. Classes for the DockPanel and
9968 DockableWindow.
9969
9970 * Thuban/UI/legend.py: Added some more buttons and made the
9971 LegendPanel a DockPanel.
9972
9973 * Thuban/UI/mainwindow.py: Added sash windows to the main window
9974 and supporting functions for manipulating the sashes.
9975 (MainWindow.ShowLegend): Create a DockableWindow with the
9976 LegendPanel as the contents.
9977
9978 * Thuban/UI/messages.py: Added DOCKABLE_* messages
9979
9980 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9981 not LAYER_LEGEND_CHANGED, messages.
9982
9983 2003-03-25 Jonathan Coles <[email protected]>
9984
9985 * setup.py: Added custom script bdist_rpm_build_script so that
9986 when the rpm is built the path to wx-config is correct.
9987
9988 * setup.cfg: Added line saying to use the custom build script
9989
9990 2003-03-20 Jonathan Coles <[email protected]>
9991
9992 Initial implementation of the Legend.
9993
9994 * Thuban/UI/legend.py: New. Creates a window that shows the map's
9995 Legend information and allows the user to add/modify classifications
9996 and how the layers are drawn on the map.
9997
9998 * setup.py: New command 'build_docs' which currently uses
9999 happydoc to generate html documentation for Thuban.
10000
10001 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10002 Returns a string which is appropriately describes the group.
10003
10004 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10005 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10006
10007 * Thuban/Model/map.py (Map): Rename messages and use new, more
10008 specific, messages.
10009
10010 * Thuban/Model/messages.py: New message to indicate that a layer's
10011 data has changed (LAYER_CHANGED). New map messages to indicate
10012 when layers have been added/removed/changed or if the stacking order
10013 of the layers has changed.
10014
10015 * Thuban/Model/session.py: Rename and use new messages.
10016
10017 * Thuban/UI/classifier.py: Remember if any changes have actually
10018 been applied so that if the dialog is cancelled without an application
10019 of changes we don't have to set a new classification.
10020 (ClassDataPreviewer): Pulled out the window specific code and put it
10021 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10022 symbols on any DC.
10023
10024 * Thuban/UI/mainwindow.py: New code to open the legend.
10025
10026 * Thuban/UI/view.py: Use new message names.
10027
10028 2003-03-19 Jonathan Coles <[email protected]>
10029
10030 * Thuban/UI/main.py (verify_versions): New. Checks the versions
10031 of Python, wxPython, and some other libraries.
10032
10033 * extensions/thuban/wxproj.cpp (check_version): Checks the given
10034 version against what wxproj was compiled with.
10035 (check_version_gtk): If wxproj was compiled with gtk then check
10036 the given version against the version of the gtk library
10037 currently being used.
10038
10039 2003-03-14 Bernhard Herzog <[email protected]>
10040
10041 * test/test_command.py: Run the tests when the module is run as a
10042 script
10043
10044 2003-03-14 Bernhard Herzog <[email protected]>
10045
10046 Implement selection of multiple selected shapes in the same layer:
10047
10048 - Introduce a new class to hold the selection. This basically
10049 replaces the interactor which was nothing more than the
10050 selection anyway. A major difference is of course that the new
10051 selection class supports multiple selected shapes in one layer
10052
10053 - Move the object that represents the selection from the
10054 application to the canvas. The canvas is a better place than the
10055 application because the selection represents which shapes and
10056 layer of the map displayed by the canvas are selected and
10057 affects how the map is drawn.
10058
10059 - Make the selection and its messages publicly available through
10060 the mainwindow.
10061
10062 - The non-modal dialogs do not get a reference to the interactor
10063 anymore as they can simply refer to their parent, the
10064 mainwindow, for the what the interactor had to offer.
10065
10066 * Thuban/UI/selection.py: New module with a class to represent the
10067 selection.
10068
10069 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10070 these unused messages
10071
10072 * Thuban/UI/application.py (ThubanApplication.OnInit)
10073 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10074 interactor is gone now.
10075 (ThubanApplication.CreateMainWindow): There is no interactor
10076 anymore so we pass None as the interactor argument for now for
10077 compatibility.
10078
10079 * Thuban/UI/view.py (MapCanvas.delegated_messages)
10080 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10081 Unsubscribe, delegate messages according to the delegated_messages
10082 class variable.
10083 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10084 attributes from instance variables as described with the
10085 delegated_methods class variable.
10086 (MapCanvas.__init__): New instance variable selection holding the
10087 current selection
10088 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10089 pass them on to the renderer
10090 (MapCanvas.SetMap): Clear the selection when a different map is
10091 selected.
10092 (MapCanvas.shape_selected): Simple force a complete redraw. The
10093 selection class now takes care of only issueing SHAPES_SELECTED
10094 messages when the set of selected shapes actually does change.
10095 (MapCanvas.SelectShapeAt): The selection is now managed in
10096 self.selection
10097
10098 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10099 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10100 Unsubscribe, delegate messages according to the delegated_messages
10101 class variable.
10102 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10103 attributes from instance variables as described with the
10104 delegated_methods class variable.
10105 (MainWindow.__init__): The interactor as ivar is gone. The
10106 parameter is still there for compatibility. The selection messages
10107 now come from the canvas.
10108 (MainWindow.current_layer, MainWindow.has_selected_layer):
10109 Delegate to the the canvas.
10110 (MainWindow.LayerShowTable, MainWindow.Classify)
10111 (MainWindow.identify_view_on_demand): The dialogs don't need the
10112 interactor parameter anymore.
10113
10114 * Thuban/UI/tableview.py (TableFrame.__init__)
10115 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10116 (LayerTableFrame.row_selected): The interactor is gone. It's job
10117 from the dialog's point of view is now done by the mainwindow,
10118 i.e. the parent. Subscribe to SHAPES_SELECTED instead
10119 of SELECTED_SHAPE
10120
10121 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10122 is gone. It's job from the dialog's point of view is now done by
10123 the mainwindow, i.e. the parent.
10124
10125 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10126 gone. It's job from the dialog's point of view is now done by the
10127 mainwindow, i.e. the parent.
10128
10129 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10130 gone. It's job from the dialog's point of view is now done by the
10131 mainwindow, i.e. the parent.
10132 (SessionTreeCtrl.__init__): New parameter mainwindow which is
10133 stored as self.mainwindow. The mainwindow is need so that the tree
10134 can still subscribe to the selection messages.
10135 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10136 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10137 selection is now accessible through the mainwindow. Subscribe to
10138 SHAPES_SELECTED instead of SELECTED_SHAPE
10139
10140 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10141 SHAPES_SELECTED message now.
10142 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10143 so deal with multiple shapes
10144 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10145 gone. It's job from the dialog's point of view is now done by the
10146 mainwindow, i.e. the parent.
10147
10148 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10149 parameter is now a list of shape ids.
10150 (RecordTable.SetTable): The second parameter is now a list of
10151 indices.
10152
10153 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10154 selected_shape parameter and ivar to selected_shapes. It's now a
10155 list of shape ids.
10156 (MapRenderer.draw_label_layer): Deal with multiple selected
10157 shapes. Rearrange the code a bit so that the setup and shape type
10158 distinctions are only executed once.
10159
10160 * test/test_selection.py: Test cases for the selection class
10161
10162 2003-03-11 Jonathan Coles <[email protected]>
10163
10164 * Thuban/Model/load.py: Temporary fix so that the xml reader
10165 doesn't cause Thuban to crash.
10166
10167 * Thuban/Model/layer.py: Handle the cyclic references between
10168 a layer and its classification better, and be sure to disconnect
10169 the classification from the layer when the layer is destroyed
10170 so that we don't maintain a cyclic reference that may not be
10171 garbage collected.
10172
10173 * Thuban/Model/classification.py: See comment for layer.py.
10174
10175 2003-03-12 Jan-Oliver Wagner <[email protected]>
10176
10177 * HOWTO-Release: New. Information on the steps for releasing
10178 a new version of Thuban.
10179
10180 2003-03-11 Jonathan Coles <[email protected]>
10181
10182 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10183 Use True instead of true.
10184 (Classifier): Should have a single panel in which all the controls lie.
10185
10186 * Thuban/UI/proj4dialog.py: Add normal border.
10187
10188 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10189
10190 * Thuban/UI/mainwindow.py: Use True instead of true.
10191
10192 * setup.py: Update some definitions to use wxWindows2.4 files
10193
10194 * Data/iceland_sample_class.thuban: Fixed file so that the
10195 field_type information is present.
10196
10197 2003-03-10 Jonathan Coles <[email protected]>
10198
10199 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10200 field type label grow so that when the text changes the
10201 size is updated correctly. This may be a wxWindows bug.
10202
10203 2003-03-10 Jonathan Coles <[email protected]>
10204
10205 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10206 SESSION_REPLACED.
10207
10208 * Thuban/UI/classifier.py: Wrap text with _().
10209 (ClassGrid.CreateTable): Set dimensions and size hints here,
10210 instead of in Reset, so we only set the size once.
10211
10212 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10213
10214 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10215 Call Close() instead of Shutdown().
10216
10217 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10218
10219 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10220 Go back to using OnClose() instead of Shutdown().
10221
10222 2003-03-10 Jonathan Coles <[email protected]>
10223
10224 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10225 to know the old field index as well as the new one.
10226
10227 2003-03-10 Jonathan Coles <[email protected]>
10228
10229 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10230 to correctly set the table information and call this from
10231 __init__ and from _OnFieldSelect so that all the information
10232 is up to date when the dialog opens and when a field is changed.
10233
10234 2003-03-10 Jonathan Coles <[email protected]>
10235
10236 * Thuban/Model/classification.py (Classification): Don't use
10237 layer's message function directly, use the ClassChanged() method
10238 when then classification changes. SetField/SetFieldType/SetLayer
10239 must keep the information about field name and field type in
10240 sync when an owning layer is set or removed.
10241
10242 * Thuban/Model/layer.py: Added ClassChanged() so that the
10243 classification can tell the layer when its data has changed.
10244 (Layer.SetClassification): Accepts None as an arguement to
10245 remove the current classification and correctly handles
10246 adding a new classification.
10247
10248 * Thuban/Model/load.py: Comment out print statement
10249
10250 * test/test_classification.py, test/test_save.py: New and
10251 improved tests.
10252
10253 2003-03-07 Jonathan Coles <[email protected]>
10254
10255 * Thuban/Model/classification.py: Implemented __copy__ and
10256 __deepcopy__ for ClassGroup* and ClassGroupProperites so
10257 they can easily be copied by the classifier dialog.
10258 (ClassGroupProperites.__init__): The default line color should
10259 have been Color.Black.
10260
10261 * Thuban/UI/classifier.py: Setting and Getting table values now
10262 uses a consistent set of functions.
10263 (Classifier): Now non-modal. Has field type label which changes
10264 as the field changes. Keep track of buttons in a list so that
10265 we can enable/disable the buttons when the None field is selected.
10266 (SelectPropertiesDialog): Add buttons to make the colors transparent.
10267
10268 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10269 does what OnClose did, but can be called by the application to
10270 close a window. Needed when a session changes, and we have to
10271 close the classifier windows.
10272
10273 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10274 Shuts down open dialogs. Used when a new session is created
10275 or a session is opened.
10276 (MainWindow.SaveSession): Should only call application.SaveSession()
10277 if we don't call SaveSessionAs first.
10278 (MainWindow.Classify): Allow different classifier dialogs for
10279 different layers.
10280
10281 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10282 the parent class handle it. Add Shutdown() to unsubscibe from
10283 event notification and call the parent Shutdown(). This was
10284 necessary so the application can close the tree window.
10285
10286 2003-03-06 Jonathan Coles <[email protected]>
10287
10288 * Thuban/Model/classification.py: Minor documentation changes,
10289 Addition of __eq__ and __ne__ methods.
10290 (Classification.SetLayer): prevent recursion between this method
10291 and Layer.SetClassification().
10292
10293 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10294
10295 * Thuban/Model/layer.py (SetClassification): prevent recursion
10296 between this method and Classification.SetLayer().
10297
10298 * test/test_classification.py, test/test_load.py,
10299 test/test_session.py: Fixed and added tests for the classification
10300 classes.
10301
10302 2003-03-06 Bernhard Herzog <[email protected]>
10303
10304 * Thuban/UI/classifier.py (ClassGrid.__init__)
10305 (ClassGrid.CreateTable): Move the SetSelectionMode call to
10306 CreateTable because otherwise it triggers an assertion in
10307 wxPython/wxGTK 2.4.
10308
10309 2003-03-05 Jonathan Coles <[email protected]>
10310
10311 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10312
10313 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10314
10315 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10316
10317 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10318
10319 2003-03-05 Jonathan Coles <[email protected]>
10320
10321 * Thuban/UI/classifier.py: Added class documentation.
10322 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10323 Store just the groups in the table and generate the other
10324 column information when it is requested. Add "None" field
10325 to pull-down to select no classification.
10326
10327 * Thuban/common.py: Moved FIELDTYPE constants from table.py
10328 (Str2Num): Only catch ValueError exceptions.
10329
10330 * Thuban/Model/classification.py: Class documentation. Renaming
10331 of methods with Stroke to Line. Groups are stored in a single
10332 list with the default as the first element. Groups are searched
10333 in the order they appear in the list.
10334
10335 * Thuban/Model/color.py: Documentation.
10336
10337 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10338 the kind of data represented by a field.
10339
10340 * Thuban/Model/load.py (ProcessSession): Use proper string
10341 conversion function; fixes RTbug #1713.
10342
10343 * Thuban/Model/save.py (Saver): Store field type information.
10344
10345 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10346 (Table): Add field_info_by_name() to retrieve field information
10347 by specifying the field name, not the number.
10348
10349 * Thuban/UI/mainwindow.py: Function name changes.
10350
10351 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10352 get the layer classification once. Don't try to classify
10353 values when the field is None: just use the default properties.
10354
10355 * Thuban/UI/view.py: Function name changes.
10356
10357 * Doc/thuban.dtd: Add field_type attribute to a classification.
10358
10359 2003-03-04 Bernhard Herzog <[email protected]>
10360
10361 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10362 the fill and stroke layer attributes optional with suitable
10363 default values. Add the stroke_width layer attribute. Use correct
10364 syntax for empty elements. Make the attribute list for labels
10365 refer to the label element.
10366
10367 2003-03-04 Bernhard Herzog <[email protected]>
10368
10369 * setup.py (thuban_build_py.build): Add a comment about distutils in
10370 Python 2.3 containing some of the functionality we implement in
10371 setup.py ourselves.
10372
10373 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10374 before the selection mode. Doing it the other way round triggers
10375 an assertion in wxWindows.
10376
10377 * Thuban/Model/save.py (escape): Fix typo in doc-string
10378
10379 * Thuban/Model/classification.py: Remove unnecessary wxPython
10380 import
10381
10382 2003-03-04 Jonathan Coles <[email protected]>
10383
10384 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10385 Parameter 'value' should default to None.
10386
10387 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10388 the class attribute __classification is now private.
10389
10390 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10391 Classifier to ClassGrid. Added support for removing selected rows,
10392 which including code for keeping track of when cells are selected,
10393 and deselected.
10394 (ClassTable): Support for added/removing rows. Fixed a problem
10395 with __ParseInput whereby it would not allow strings (only numbers)
10396 to be entered.
10397 (Classifier): Added button and supporting code for removing
10398 selected rows.
10399
10400 2003-02-27 Jonathan Coles <[email protected]>
10401
10402 * Thuban/common.py: Moved color conversion functions into
10403 Thuban/UI/common.py.
10404 (Str2Num): Now converts the float (not the string) to a long/int
10405 so that an exception isn't thrown.
10406
10407 * Thuban/UI/common.py: Common functions used in several UI modules
10408
10409 * Thuban/Model/classification.py: Changed the class hierarchy
10410 so that a Classification consists of Groups which return
10411 Properties when a value matches a Group.
10412
10413 * Thuban/Model/layer.py: Fixed name resolution problem.
10414
10415 * Thuban/Model/load.py: Use new Classification and Group functions.
10416
10417 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10418 failure.
10419 (Saver.write_classification): Use new Classification and Group
10420 functions.
10421
10422 * Thuban/UI/classifier.py: Changes to use new Classification and Group
10423 functions. Fix to create a tuple with a single value instead of
10424 simply returning the value.
10425
10426 * Thuban/UI/renderer.py: Use new Classification and Group functions.
10427 Use common.py functions.
10428
10429 * Thuban/UI/tree.py: Use common.py functions.
10430
10431 * test/test_classification.py: Use new Classification and Group
10432 classes.
10433
10434 2003-02-24 Jonathan Coles <[email protected]>
10435
10436 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10437 functions from Thuban color objects to wxWindow colour objects.
10438
10439 * Thuban/Model/classification.py (Classification): Renamed
10440 GetProperties() to GetClassData(). Used the new iterator
10441 in TreeInfo().
10442 (ClassIterator): Iterator implementation to iterate over the
10443 ClassData objects in a classification object.
10444
10445 * Thuban/Model/save.py (Saver.write_classificaton): Uses
10446 the new iterator to save the classification information.
10447
10448 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10449 for changing the stroke and fill colors and previewing the
10450 changes.
10451
10452 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10453 MainWindow.SaveSessionAs): Text string changes so the dialogs
10454 have more meaningful titles.
10455
10456 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10457 Classification method name from GetProperties to GetClassData.
10458
10459 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10460 instead of accessing now non-existent class variables.
10461
10462 2003-02-24 Bernhard Herzog <[email protected]>
10463
10464 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10465 unneeded Shape() call. Rendering is substantially faster without
10466 it and it avoids some problems with broken shape files.
10467
10468 2003-02-20 Frank Koormann <[email protected]>
10469
10470 Force minimal size of identify and label dialogs. The autosizing
10471 looked too ugly.
10472
10473 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10474 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10475 Set size of listctrl.
10476 * Thuban/UI/identifyview.py (IdentifyView.__init__):
10477 Set size of dialog.
10478
10479 2003-02-19 Jonathan Coles <[email protected]>
10480
10481 * test/test_classification.py, test/test_layer.py,
10482 test/test_load.py, test/test_map.py, test/test_session.py:
10483 Updated the tests to use the new functions that are in the
10484 respective classes.
10485
10486 * Thuban/Model/classification.py (Classification):
10487 Uses the new ClassData* classes. Modification messages are
10488 passed up to the parent layer (if it exists).
10489 (ClassData): New class to encapsulate the common data in each
10490 classification property.
10491 (ClassDataDefault): Represents the Default class. data.
10492 (ClassDataPoint): Represents a single class. data point
10493 (ClassDataRange): Represents a class. range
10494 (ClassDataMap): Represents a class. map (unused).
10495
10496 * Thuban/Model/color.py: Added Color.None to represent something
10497 with no color. Color.Black represents the color black.
10498 (NoColor): Helper class derived from Color to represent something
10499 with no color.
10500
10501 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10502 stroke_width attributes. Made the 'classification' attribute private.
10503 New methods for setting/getting the classification.
10504
10505 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10506 to get the classifcation and use the new ClassData* classes to
10507 hold the classification data. Use Str2Num to convert numbers
10508 properly.
10509
10510 * Thuban/Model/save.py (Saver): Use new Color and Classification
10511 methods
10512
10513 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10514 custom grid.
10515 (ClassTable): Support for editing Values and Labels and for
10516 changing what type (point or range) of data is stored in each
10517 property based on how the user enters the data.
10518 (Classifier): Support for saving the new classifications and
10519 launching the dialog to edit a property.
10520 (SelectPropertiesDialog): New class for editing the visual
10521 properties of a classification (stroke color, width, and fill color)
10522 (ClassPreviewer): Took the Draw method from ClassRenderer and
10523 made most of it into this new class. Intend to use this class in
10524 the SelectPropertiesDialog for previewing changes.
10525
10526 * Thuban/UI/renderer.py: Use new Color and Classification methods.
10527
10528 * Thuban/UI/tree.py: Formatting changes.
10529
10530 * Doc/thuban.dtd: Add 'label' element
10531
10532 * Thuban/common.py: New. Contains common routines used throughout
10533 the code.
10534 (Str2Num): Takes a string and converts it to the "best" type of
10535 number.
10536
10537 2003-02-14 Bernhard Herzog <[email protected]>
10538
10539 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10540 dragging flag is always set to 0 even when the tool implementation
10541 raises an exception
10542
10543 2003-02-11 Bernhard Herzog <[email protected]>
10544
10545 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10546 method to create a splash screen.
10547 (ThubanApplication.ShowMainWindow): New. Show the main window.
10548 Needed so the splash screen can display the mainwindow
10549 (ThubanApplication.OnInit): Call the
10550 new splash_screen method to determine whether the application
10551 should display a splash screen. If it displays a splash screen do
10552 not immediately show the main window.
10553
10554 2003-02-11 Jonathan Coles <[email protected]>
10555
10556 * Thuban/Model/classification.py: Added import line to fix
10557 feature conflicts between running on python2.2 and python2.1.
10558
10559 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10560 onto the clinfo parameter, so removed the deepcopy().
10561
10562 2003-02-10 Jonathan Coles <[email protected]>
10563
10564 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10565 Added element_open variable to track opening and closing of tags
10566 so that tags that don't span more than one line are closed with
10567 /> instead of </tag_name>. Use the GetDefault*() methods of
10568 the Classification class.
10569
10570 * Thuban/Model/classification.py (Classificaton): Added set and
10571 get methods for the default data. The class also takes a layer
10572 reference so that modification messages can be sent. Fixed the
10573 methods to use the new ClassData class.
10574 (ClassData): New class to encapsulate the classification data
10575
10576 * Thuban/Model/layer.py (Layer): Remove the
10577 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
10578 SetDefault*() methods on the layer's classification object.
10579 (Layer.__init__): Use the new SetDefault*() methods in the
10580 Classification class.
10581
10582 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
10583 object instead of a dictionary.
10584
10585 * Thuban/UI/classifier.py (ClassRenderer): New class to
10586 draw the classifications in the dialog box's table.
10587 (Classifier): Modified to use the ClassRenderer class.
10588
10589 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
10590 methods of the Classification class.
10591
10592 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
10593 of the ClassData class.
10594
10595 * test/test_classification.py, test/test_layer.py,
10596 test/test_map.py, test/test_session.py: Fix the tests to work
10597 with the above code changes.
10598
10599 2003-02-03 Jonathan Coles <[email protected]>
10600
10601 * Thuban/Model/classification.py (Classification): Added getNull()
10602 to return the NullData reference
10603
10604 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
10605 Layer.SetStrokeWidth): Modified these functions to change the
10606 null data in the classification rather than keep these values
10607 directly in the Layer class. Menu options to change these values
10608 work again.
10609
10610 2003-01-28 Jonathan Coles <[email protected]>
10611
10612 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
10613 Fixed crashing problem on some systems. Dialog box shows
10614 classification data.
10615
10616 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
10617 Colors in the tree view.
10618
10619 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
10620 the tree info for classifications. Commented out unnecessary lines.
10621
10622 * Thuban/Model/classification.py (Classification.TreeInfo): New
10623 function to add information about the classification into the
10624 tree view.
10625
10626 2003-01-27 Jan-Oliver Wagner <[email protected]>
10627
10628 * Thuban/__init__.py (_): New.
10629
10630 * Thuban/Model/classification.py, Thuban/Model/extension.py,
10631 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
10632 Thuban/Model/session.py, Thuban/UI/application.py,
10633 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
10634 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
10635 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
10636 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
10637 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
10638
10639 2003-01-27 Jonathan Coles <[email protected]>
10640
10641 * Thuban/Model/layer.py: Classification initialization calls.
10642
10643 * Thuban/Model/classification.py: Created class to encapsulate
10644 a layer classification. Supports specific data points and
10645 ranges.
10646
10647 * Thuban/Model/load.py: Added support for loading classification
10648 information.
10649
10650 * Thuban/Model/save.py: Added support for saving classification
10651 information.
10652
10653 * Thuban/UI/classifier.py: Initial class for a dialog box for
10654 specifying classification information.
10655
10656 * Thuban/UI/mainwindows.py: Support for opening the classifier
10657 dialog.
10658
10659 * Thuban/UI/renderer.py: Support for drawing a layer with the
10660 classification information.
10661
10662 * Data/iceland_sample_class.thuban: iceland_sample with
10663 classification data.
10664
10665 * test/test_classification: Tests for the Classification class.
10666
10667 2002-12-09 Bernhard Herzog <[email protected]>
10668
10669 * test/test_command.py: New. Tests for the command classes.
10670
10671 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
10672 (Command.IsTool): New method to distinguish between command
10673 switching tools and other commands.
10674
10675 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
10676 the tool to avoid direct assignments to instance variables
10677 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
10678 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
10679 change the tool
10680
10681 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
10682 active tool's command turns insensitive, disable the tool.
10683 (_tool_command): Use the new ToolCommand class
10684
10685 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
10686 SelectTool method to change the tool
10687 (iconfile): Use the ToolCommand class
10688
10689 2002-12-03 Bernhard Herzog <[email protected]>
10690
10691 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
10692 the case of selected items that are not children of Layers or Maps
10693 properly. Previously this bug would trigger an assertion in
10694 wxWindows.
10695
10696 2002-11-06 Frank Koormann <[email protected]>
10697
10698 * Thuban/UI/mainwindow.py: Altered the order of tools in the
10699 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10700 Full Extent).
10701
10702 2002-10-23 Bernhard Herzog <[email protected]>
10703
10704 * setup.py (setup call): version now 0.1.3
10705
10706 * MANIFEST.in: Add the files in test/
10707
10708 * test/README: Add note about tests requiring the iceland data
10709
10710 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10711 copyright notice.
10712
10713 2002-10-18 Bernhard Herzog <[email protected]>
10714
10715 * test/test_map.py
10716 (TestMapWithContents.test_projected_bounding_box): Use an explicit
10717 epsilon.
10718
10719 * test/support.py (FloatComparisonMixin.assertFloatEqual)
10720 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10721 message if the assertion fails and don't return the return value
10722 of self.assert_. In assertFloatSeqEqual the return meant that not
10723 all items of the sequence were compared.
10724
10725 2002-09-20 Bernhard Herzog <[email protected]>
10726
10727 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10728
10729 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10730
10731 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10732 the string with the bounding box on the fly because of platform
10733 differences in the way %g is handled.
10734
10735 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10736 DBFfile too because Thuban layers can't yet cope missing DBF
10737 files.
10738
10739 2002-09-20 Bernhard Herzog <[email protected]>
10740
10741 * test/test_menu.py: Use initthuban instead of
10742 add_thuban_dir_to_path to initialize Thuban.
10743
10744 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10745 Mixin class for float comparisons
10746 (SubscriberMixin): New. Mixin class to test messages sent through
10747 the Connector class
10748
10749 * test/README: Fix a typo and add the -v flag to the command for
10750 individual tests
10751
10752 * test/test_session.py: New. Test cases for Thuban.Model.session
10753
10754 * test/test_proj.py: New. Test cases for Thuban.Model.proj
10755
10756 * test/test_map.py: New. Test cases for Thuban.Model.map
10757
10758 * test/test_layer.py: New. Test cases for Thuban.Model.layer
10759
10760 * test/test_label.py: New. Test cases for Thuban.Model.label
10761
10762 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10763
10764 * test/test_color.py: New. Test cases for Thuban.Model.color
10765
10766 * test/test_base.py: New. Test cases for Thuban.Model.base
10767
10768 2002-09-13 Bernhard Herzog <[email protected]>
10769
10770 * Thuban/Model/session.py (Session.forwarded_channels): Forward
10771 the CHANGED channel too.
10772
10773 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10774 CHANGED channel too.
10775 (Map.__init__): Call the Modifiable constructor as well.
10776
10777 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10778 event if the modified flag changes.
10779 (Modifiable.changed): Tweak the doc-string.
10780
10781 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10782 (MainWindow.set_position_text): Put the code that puts the text
10783 with the mouse position into the status bar into the new method
10784 set_position_text so that it can overwritten in derived classes.
10785
10786 2002-09-12 Bernhard Herzog <[email protected]>
10787
10788 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10789 message box on the main window.
10790
10791 2002-09-11 Bernhard Herzog <[email protected]>
10792
10793 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10794 the 'E' because it's less likely to interfere with other menu
10795 entries.
10796 (MainWindow.build_menu): remove an incorrect comment.
10797
10798 2002-09-10 Bernhard Herzog <[email protected]>
10799
10800 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10801 (_tool_command): Add sensitive parameter
10802 (_has_visible_map): Sensitivity callback to tools and other
10803 commands that require a visible map. Use it in map_zoom_in_tool,
10804 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10805 and map_full_extent
10806
10807 2002-09-06 Bernhard Herzog <[email protected]>
10808
10809 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10810 VIEW_POSITION
10811
10812 2002-09-04 Frank Koormann <[email protected]>
10813
10814 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10815
10816 2002-09-02 Bernhard Herzog <[email protected]>
10817
10818 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10819 wxWindows already and our implementation doesn't work correctly
10820 with wxGTK 2.3:
10821 (MapCanvas.__init__): Remove the instance variable
10822 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10823 be drawin
10824 (MapCanvas.OnIdle): Removed.
10825
10826 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10827 a parameter to determine the size of the rectangle.
10828 (MapCanvas.find_shape_at): Create the box around the point on a
10829 layer by layer basis and make the size depend on the shape type.
10830 This solves a problem with the selection of point shapes at the
10831 border of the layer's bounding box
10832
10833 2002-08-30 Bernhard Herzog <[email protected]>
10834
10835 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10836 for the sensitivity of remove layer.
10837 (_can_remove_layer): New. Sensitivity callback for remove layer
10838 (Command layer_remove): Use _can_remove_layer
10839
10840 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10841 determine whether a given layer can be deleted.
10842
10843 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10844 (MapCanvas.do_redraw): Get rid of the unused update_region
10845 instance variable
10846
10847 * Thuban/UI/view.py: Add/update some doc-strings.
10848
10849 * test/: new subdirectory with a bunch of unit tests.
10850
10851 * test/README, test/test_table.py, test/test_save.py,
10852 test/test_menu.py, test/test_load.py: Initial set of tests and
10853 brief instructions on how to run them
10854
10855 2002-08-29 Bernhard Herzog <[email protected]>
10856
10857 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10858 arcs with multiple parts.
10859
10860 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10861 Handle degenrate rectangles.
10862
10863 * Thuban/Model/table.py: Make writing records work correctly:
10864 (Table.__init__): Keep track of whether the DBF is open for
10865 writing
10866 (Table.write_record): Open the DBF file for writing when necessary
10867
10868 2002-08-27 Bernhard Herzog <[email protected]>
10869
10870 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10871 dbf files only for reading by default. Use a new writable dbf
10872 object for writing.
10873
10874 2002-08-26 Bernhard Herzog <[email protected]>
10875
10876 * Thuban/UI/mainwindow.py: Refactor the context creation:
10877 (MainWindow.Context): New method to return a context
10878 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10879 new method
10880
10881 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10882 layer table specific code from TableGrid into LayerTableGrid
10883 (TableFrame, LayerTableFrame): Split the layer table specific code
10884 from TableFrame into LayerTableFrame
10885 (LayerTableGrid.select_shape): Remove a debug print
10886
10887 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10888 LayerTableFrame
10889
10890 2002-08-23 Bernhard Herzog <[email protected]>
10891
10892 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10893 absolute filename.
10894
10895 2002-08-22 Bernhard Herzog <[email protected]>
10896
10897 * Thuban/Model/table.py (Table.write_record): New method to write
10898 records.
10899 (Table.__init__): Open the DBF file for writing too.
10900
10901 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10902 into the underlying table.
10903
10904 * extensions/shapelib/shapefil.h (DBFCommit),
10905 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10906 commit any changes made to the DBF file.
10907
10908 * Thuban/UI/mainwindow.py (make_check_current_tool)
10909 (_tool_command): Put the code that generates the "checked"
10910 callback into a separate function so that we can reuse it
10911 elsewhere
10912
10913 * Thuban/Model/save.py (Saver): New class to handle serializing a
10914 session into an XML file. The main reason to introduce a class is
10915 that applications built on Thuban can derive from it so that they
10916 can save additional information in a session file.
10917 (save_session): Delegate almost all the work to the Saver class.
10918 Rename the filename argument to file because it may be a file like
10919 object now.
10920
10921 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10922 code. Remove the little test code which would be executed when the
10923 module is run as a script which didn't work anymore since it can't
10924 import the other Thuban modules.
10925 (ProcessSession, load_session): Refactor the ProcessSession to
10926 have one method for each element start and end tag so that derived
10927 classes can easily override the processing of individual tags.
10928 Also, always parse with namespaces enabled because applications
10929 built on top of Thuban will likely use namespaces if they extend
10930 the session file format.
10931
10932 2002-08-21 Bernhard Herzog <[email protected]>
10933
10934 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10935 because thubaninit_contents will do it for us.
10936
10937 2002-08-16 Jan-Oliver Wagner <[email protected]>
10938
10939 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10940 tree window already open
10941
10942 2002-08-15 Bernhard Herzog <[email protected]>
10943
10944 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10945 with self.
10946
10947 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10948 when we have actually captured it.
10949
10950 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10951 shapefile and destroy the table.
10952
10953 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10954
10955 2002-08-14 Bernhard Herzog <[email protected]>
10956
10957 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10958 instance variable columns
10959 (RecordTable.GetTypeName): row and col may be negative in some
10960 cases.
10961
10962 * setup.py (InstallLocal.initialize_options)
10963 (InstallLocal.finalize_options, InstallLocal.user_options): New
10964 option create-init-file to build a thubaninit.py when running
10965 install_local
10966 (InstallLocal.run): Create the thubaninit.py module when requested
10967 (thubaninit_contents): Split the template into several parts and
10968 create a new function thubaninit_contents that creates the
10969 contents of a thubaninit module.
10970 (ThubanInstall.run): Use the new function to create the thubaninit
10971 module.
10972
10973 2002-07-30 Bernhard Herzog <[email protected]>
10974
10975 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10976 cleanup.
10977 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10978
10979 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10980 direct base class' Destroy method.
10981
10982 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10983 layers.
10984 (Map.Destroy): Destroy the label_layer as well and call the
10985 inherited Desatroymethod first so that no more messages are
10986 issued.
10987 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10988 message if the stacking order actually has changed. Add
10989 doc-strings.
10990 (Map.BoundingBox): Correct the doc-string.
10991 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10992 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10993
10994 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10995 all labels.
10996
10997 2002-07-29 Bernhard Herzog <[email protected]>
10998
10999 * Thuban/Model/map.py (Map.subscribe_layer_channels)
11000 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11001 to a layer's channels into separate methods.
11002 (Map.RemoveLayer, Map.AddLayer): Call the new methods
11003 (Map.Destroy): Unsubscribe from a layer's channels before
11004 destroying it.
11005
11006 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11007 selected_layer parameter to searched_layer which is the layer to
11008 search in.
11009 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11010 search to that layer. Return the selected layer and shape.
11011
11012 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11013 typo
11014
11015 2002-07-24 Bernhard Herzog <[email protected]>
11016
11017 * Thuban/UI/application.py (ThubanApplication.create_session):
11018 Extend the doc string.
11019 (ThubanApplication.subscribe_session)
11020 (ThubanApplication.unsubscribe_session): New methods to
11021 subscribe/unsubscribe to/from session channels.
11022 (ThubanApplication.SetSession): Call the new methods here.
11023 (ThubanApplication.maps_changed, ThubanApplication.set_map):
11024 Renamed set_map to maps_changed. Its now a subscriber for
11025 MAPS_CHANGED.
11026
11027 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11028 x-coordinate in case of simple clicks
11029
11030 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11031 don't pass it as a parameter
11032
11033 * Thuban/Model/session.py (Session.RemoveMap): New
11034
11035 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11036 window size into a parameter.
11037
11038 2002-07-23 Bernhard Herzog <[email protected]>
11039
11040 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11041 just commands.
11042
11043 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11044 parameter list a bit to allow setting the window title and the
11045 initial message in the status bar. Update the callers.
11046
11047 * Thuban/UI/application.py (ThubanApplication.OnInit)
11048 (ThubanApplication.CreateMainWindow): Put the mainwindow
11049 instantiation into a separate method so that it can be overridden
11050 by a subclass.
11051
11052 2002-07-19 Bernhard Herzog <[email protected]>
11053
11054 * Thuban/Model/session.py: Issue a CHANGED message every time
11055 another changed message is issued to make it easier to get
11056 notified of changes.
11057 (Session): Update the doc string
11058 (Session.forward): Issue changed-events as CHANGED as well.
11059 (Session.changed): Overwrite the inherited version to issue
11060 CHANGED events as well.
11061
11062 * Thuban/UI/tree.py: We can now simply subscribe to the session's
11063 CHANGED channel to be informed of changes.
11064 (SessionTreeCtrl.session_channels): Not needed any longer.
11065 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11066 Only have to (un)subscribe CHANGED
11067
11068 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11069
11070 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11071 for the wxPython locale bug to __init__.py so that it's
11072 automatically executed by anybody using UI code from Thuban.
11073
11074 2002-07-18 Bernhard Herzog <[email protected]>
11075
11076 * Thuban/UI/main.py (main): app no longer needs to be global
11077
11078 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11079 as parameter and store it in an instance variable
11080 (MainWindow.invoke_command, MainWindow.update_command_ui)
11081 (MainWindow.save_modified_session, MainWindow.NewSession)
11082 (MainWindow.OpenSession, MainWindow.SaveSession)
11083 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11084 application object.
11085
11086 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11087 the main window with self.
11088
11089 * Thuban/UI/context.py: New module with the context class
11090
11091 * Thuban/UI/command.py (Command): Update doc string.
11092
11093 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11094 MainWindow.update_command_ui): Pass an instance of the context
11095 class to the command's methods
11096 (check_current_tool, call_method): Handle the new context
11097 implementation
11098
11099 * Examples/simple_extensions/simple_tool.py (simple_tool,
11100 check_simple_tool): Handle the new context implementation
11101
11102 * Examples/simple_extensions/simple_command.py (simple_command):
11103 Handle the new context implementation. Update the comments about
11104 the context.
11105
11106 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11107 doc-string
11108 (ThubanApplication.Session): New method to return the session
11109 object
11110
11111 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11112 interactor's selected_layer may not be a layer of the current
11113 session when the tree is updated while a new session is being set.
11114
11115 2002-07-17 Bernhard Herzog <[email protected]>
11116
11117 * Thuban/UI/tree.py (color_string): Removed. No longer used.
11118 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11119 update_tree into update_tree and add_items. The tree now uses a
11120 more generic way to display the contents of the tree.
11121 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11122
11123 * Thuban/Model/layer.py (Layer.TreeInfo),
11124 Thuban/Model/extension.py (Extension.TreeInfo),
11125 Thuban/Model/map.py (Map.TreeInfo),
11126 Thuban/Model/session.py (Session.TreeInfo):
11127 Add TreeInfo methods to implement the new tree view update scheme
11128
11129 2002-07-16 Bernhard Herzog <[email protected]>
11130
11131 * Thuban/UI/application.py: Don't use "import from" for the
11132 MainWindow. It can't always be resolved.
11133 (ThubanApplication.OnInit): change reference to MainWindow
11134 accordingly.
11135
11136 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11137 completely
11138
11139 2002-07-10 Bernhard Herzog <[email protected]>
11140
11141 * setup.py (create_init_module): New configurable variable whose
11142 default depends on the platform we're running on.
11143 (ThubanInstall.initialize_options): Initialize
11144 self.create_init_module from the global create_init_module
11145 (ThubanInstall.user_options): indictate that the options
11146 create-init-module and init-module-dir have arguments.
11147
11148 * setup.py: In the setup call change the version number to include
11149 cvs.
11150
11151 * MANIFEST.in: Add the files in Examples
11152
11153 2002-07-09 Bernhard Herzog <[email protected]>
11154
11155 * setup.py: In the setup call, use the thuban homepage as the
11156 value of the url parameter.
11157
11158 * Examples: New subdirectory for examples.
11159
11160 * Examples/simple_extensions/simple_tool.xpm,
11161 Examples/simple_extensions/simple_tool.py,
11162 Examples/simple_extensions/simple_command.py,
11163 Examples/simple_extensions/README: Simple examples showing how to
11164 add new commands and tools.
11165
11166 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11167 bdist_rpm that we also have an install script.
11168 (bdist_inno): Add 2002 to the copyright notice.
11169
11170 * setup.py: Create a file in python's site-packages directory to
11171 make installation of Thuban as a library easier.
11172 (ThubanInstall.user_options): Add two new options,
11173 create-init-module and init-module-dir
11174 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11175 filenames for installation in the default directories.
11176 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11177 the inherited methods to capture some filenames before they're
11178 transformed too much by distutils.
11179 (ThubanInstall.run): Create the init module if requested.
11180 (ThubanInstall.thuban_init_filename): New method to return the
11181 full name of the init module.
11182 (ThubanInstall.get_outputs): Append the filename of the init
11183 module.
11184
11185 2002-07-08 Bernhard Herzog <[email protected]>
11186
11187 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11188 handle the prefix properly which means that the default for the
11189 installation prefix should be /usr for RPMs and /usr/local when
11190 doing a normal source install.
11191 (bdist_rpm_install_script): Script to override the default install
11192 commands in the specfile generated by the bdist_rpm command.
11193 (thuban_bdist_rpm.user_options): Add a prefix option
11194 (thuban_bdist_rpm.initialize_options): Init the prefix option.
11195 Create the script files for the spec files as empty files here
11196 (thuban_bdist_rpm._make_spec_file): Override the inherited method
11197 to fill the script files with content.
11198
11199 * Thuban/Model/save.py (relative_filename): Wrapper around
11200 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11201 argument. save_session now automatically uses this version,
11202 solving a problem when saving to a relative filename.
11203
11204 * setup.py: In the setup call, make sure that the library
11205 directories are under $prefix/lib not directly under $prefix.
11206
11207 2002-06-20 Jan-Oliver Wagner <[email protected]>
11208
11209 * Thuban/Model/extension.py: new module to handle extension objects.
11210 * Thuban/Model/messages.py: new messages for extensions.
11211 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11212 Session.AddExtension): new for handling extensions.
11213 Also some other minor changes to round up extension handling.
11214 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11215 of Extension titles and title and names of its objects.
11216
11217 2002-05-29 Bernhard Herzog <[email protected]>
11218
11219 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11220 the events for a command.
11221 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11222 Call bind_command_events to bind the events. add_toolbar_command
11223 can now bind events too so that it's possible to have commands
11224 that are only available through the toolbar.
11225 (MainWindow.init_ids): New instance variable events_bound to keep
11226 track of for which commands events have been bound.
11227
11228 2002-05-28 Bernhard Herzog <[email protected]>
11229
11230 * Thuban/UI/menu.py: New module to build and manage menus.
11231
11232 * Thuban/UI/mainwindow.py: Remove some unused imports.
11233 (MainWindow.__init__, main_menu): move the definition of the main
11234 menu from __init__ to the Menu instance main_menu.
11235 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11236 build the menu bar and sub-menus from a menu description.
11237
11238 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11239 startup file
11240 (ThubanApplication.read_startup_files): New method to run
11241 ~/.thuban/thubanstart.py
11242
11243 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11244 Move the toolbar definition to the Menu instance main_toolbar.
11245 (MainWindow.build_toolbar): New method to build the toolbar
11246 similar to the build_menu methods
11247
11248 2002-05-23 Bernhard Herzog <[email protected]>
11249
11250 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11251 layer_outline_color. Fix it in the definition of the command too.
11252
11253 * Thuban/UI/command.py (Command): Fix typo in doc string
11254
11255 2002-05-22 Bernhard Herzog <[email protected]>
11256
11257 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11258 in the docstring
11259
11260 2002-05-15 Bernhard Herzog <[email protected]>
11261
11262 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11263 when the shapefile is empty.
11264 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11265 now return None for empty shapefiles. Update doc-strings.
11266
11267 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11268 the layer's bbox being None.
11269
11270 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11271 layer's bbox being None.
11272
11273 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11274 necessary.
11275 (MapCanvas.__init__): New instance variables, last_selected_layer
11276 and last_selected_shape to determine how the selection has
11277 changed.
11278
11279 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11280 AutoSizeColumns because it will cause a traversal of the entire
11281 table which for large .dbf files will take a very long time.
11282
11283 2002-05-14 Bernhard Herzog <[email protected]>
11284
11285 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11286 maximum depth for the tree than shapelib does by default.
11287
11288 2002-05-10 Bernhard Herzog <[email protected]>
11289
11290 * setup.py (py_modules): The shptree modules doesn't have a
11291 wrapper, so don't include it in the py_modules
11292
11293 2002-05-08 Bernhard Herzog <[email protected]>
11294
11295 * extensions/shapelib/shptree.c (compare_ints): Make arguments
11296 const void * as in the qsort prototype
11297 (SHPTreeFindLikelyShapes): Remove some unused variables.
11298
11299 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11300 maintains to redraw the window during a drag.
11301 (MapCanvas.unprojected_rect_around_point): New method to determine
11302 a small region around a point for hit-testing.
11303 (MapCanvas.find_shape_at): Only test the shapes in a small region
11304 around the point.
11305
11306 * setup.py: Increment the version to 0.1.2
11307
11308 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11309 debug print and set session to None after unsubscribing
11310
11311 2002-05-07 Bernhard Herzog <[email protected]>
11312
11313 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11314 the file to have a .thuban extension.
11315
11316 * Thuban/UI/tree.py (session_channels): New class constant with
11317 all the session channels to subscribe to to update the tree
11318 (SessionTreeCtrl.session_changed): Remember the session so that we
11319 can unsubscribe properly. Use the new class constant to
11320 unsubscribe from the old session and subscribe to the new one.
11321 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11322 subscriptions of the SessionTreeCtrl.
11323 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11324
11325 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11326 Session Tree" command to the file menu.
11327
11328 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11329 as update_region to the renderer.
11330
11331 * Thuban/UI/renderer.py
11332 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11333 update box is now directly a tuple, not a wxRect anymore.
11334
11335 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11336 prints.
11337
11338 2002-05-07 Bernhard Herzog <[email protected]>
11339
11340 * setup.py: Add the shptree extension module. See
11341 extensions/pyshapelib/ChangeLog for more details.
11342
11343 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11344 extensions/shapelib/dbfopen.c: Really update to the versions of
11345 shapelib 1.2.9. For some reason it wasn't really done on
11346 2002-04-11.
11347
11348 * extensions/shapelib/shptree.c: Modified version of shptree.c of
11349 shapelib 1.2.9. The only real difference is the use of qsort
11350 instead of a bubble sort implementation
11351
11352 * Thuban/Model/layer.py (Layer.__init__): New instance variable
11353 shapetree to hold the shapelib quadtree for the shapefile
11354 (Layer.open_shapefile): Create the quad tree.
11355 (Layer.ShapesInRegion): New method to return the ids of shapes in
11356 a given region using the quad tree.
11357
11358 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11359 comment
11360 (draw_polygon_shape): Accept both arcs and polygons.
11361 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11362 the api.
11363
11364 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11365 return the shape ids to be rendered in a given layer.
11366 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11367 ids. Use draw_polygon_shape to draw arc shapes as well.
11368 (ScreenRenderer.RenderMap): New parameter for the rectangle that
11369 has to be updated
11370 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11371 calling it's ShapesInRegion method.
11372
11373 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11374 update_region for the update region.
11375 (MapCanvas.OnPaint): Maintain the update region
11376 (MapCanvas.do_redraw): Pass the bounding box of the update_region
11377 to the renderer when drawing the bitmap. Reset the update_region.
11378
11379 2002-05-03 Bernhard Herzog <[email protected]>
11380
11381 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11382 MainWindow.OpenSession): Change the file extension of the session
11383 files to .thuban
11384
11385 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11386 Move the map channels to be forwarded by the session into the
11387 class constant with forwarded_channels. Also add
11388 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11389 forwarded_channels
11390
11391 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11392 typo and some rewording).
11393
11394 2002-05-02 Bernhard Herzog <[email protected]>
11395
11396 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11397 around to speed up most redraws:
11398 (MapCanvas.__init__): New instance variable bitmap which holds the
11399 bitmap
11400 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11401 self.bitmap to draw.
11402 (MapCanvas.full_redraw): New method to force a full redraw
11403 including the bitmap
11404 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11405 make sure the bitmap is redrawn.
11406 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11407 MapCanvas.shape_selected): Call full_redraw instead of readraw to
11408 make sure the bitmap is redrawn.
11409 (MapCanvas.OnSize): New method to handle size events so that the
11410 bitmap can be redrawn.
11411
11412 2002-04-29 Bernhard Herzog <[email protected]>
11413
11414 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11415 canvas' VIEW_POSITION event
11416 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11417 Update the text in the status-bar accordingly.
11418
11419 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11420 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11421 called.
11422 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11423 current_position
11424 (MapCanvas.set_current_position): New method to set
11425 current_position. Issue a VIEW_POSITION event
11426 (MapCanvas.CurrentPosition): New public method to return the value
11427 of current_position. Should be called when the VIEW_POSITION event
11428 is processed.
11429 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11430 Update the position.
11431 (MapCanvas.OnLeaveWindow): Set the position to None.
11432
11433 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11434 position in the statusbar
11435
11436 2002-04-26 Frank Koormann <[email protected]>
11437
11438 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11439
11440 2002-04-24 Frank Koormann <[email protected]>
11441
11442 * Resources/Bitmaps/identify.xpm: shadow added
11443
11444 * Resources/Bitmaps/fullextent.xpm: new
11445
11446 2002-04-22 Jan-Oliver Wagner <[email protected]>
11447
11448 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11449 box
11450
11451 2002-04-21 Jan-Oliver Wagner <[email protected]>
11452
11453 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11454
11455 * Thuban/UI/tree.py (update_tree): added added map extent
11456
11457 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11458 icon; added map_full_extend as tool
11459
11460 2002-04-19 Jan-Oliver Wagner <[email protected]>
11461
11462 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11463 saving _new_ sessions
11464
11465 * Thuban/Model/session.py (create_empty_session): new session
11466 don't have a filename (set to None)
11467
11468 * Thuban/UI/tree.py (update_tree): added filename and modified flag
11469
11470 * Thuban/Model/load.py (ProcessSession): convert projection
11471 parameters from unicode to regular string
11472
11473 * Data/iceland_sample.session: Added UTM Zone 26 projection.
11474
11475 2002-04-11 Bernhard Herzog <[email protected]>
11476
11477 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11478 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11479 1.2.9
11480
11481 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11482 the pyshapelib directoy into the list of include dirs, so that
11483 pyshapelib_api.h can be found.
11484
11485 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11486 holds the pyshapelib C-API
11487 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11488 pyshapelib_api to access the shapelib functions.
11489 (initwxproj): Import the c_api from the shapelib module and
11490 initialize pyshapelib_api.
11491
11492 2002-04-04 Bernhard Herzog <[email protected]>
11493
11494 * setup.py (thuban_bdist_rpm.initialize_options): Use
11495 initialize_options to create the scripts for the rpm.
11496
11497 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11498
11499 2002-04-03 Bernhard Herzog <[email protected]>
11500
11501 * setup.py: Increment version to 0.1.1
11502
11503 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11504 Layer" and "Remove Layer" commands from the layer menu to the map
11505 menu
11506
11507 2002-02-15 Bernhard Herzog <[email protected]>
11508
11509 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11510 argument (python <= 1.5.2 erroneously accepted multiuple
11511 arguments)
11512
11513 2002-02-04 Bernhard Herzog <[email protected]>
11514
11515 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11516 RecordGrid in the identifyview.
11517 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11518 IdentifyListCtrl. The grid allows editing of the values.
11519
11520 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11521 implementing a grid for a single row of a thuban table.
11522
11523 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11524 layers by default. Easier to use than the previous default of only
11525 searching through the select layer which meant that if no layer
11526 was selected, you couldn't select a shape.
11527
11528 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11529
11530 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11531 stroke_width attribute
11532
11533 * Thuban/Model/save.py (save_session): Write the new stroke_width
11534 attribute
11535
11536 * Thuban/Model/load.py (ProcessSession.startElement): Read the
11537 stroke_width attribute
11538
11539 * Thuban/Model/layer.py (Layer.__init__): New parameter and
11540 instance variable stroke_width
11541 (Layer.SetStrokeWidth): Set the stroke_width.
11542
11543 2002-02-01 Bernhard Herzog <[email protected]>
11544
11545 * extensions/thuban/wxproj.cpp (project_points): Fix two
11546 off-by-one errors in the last loop that joins the various parts
11547 together.
11548
11549 2002-01-14 Bernhard Herzog <[email protected]>
11550
11551 * setup.py (data_dist.make_distribution): Fix some typos
11552
11553 2001-09-18 Bernhard Herzog <[email protected]>
11554
11555 * README: Slight tweaking in preparation for the 0.1 release
11556
11557 * setup.cfg: Add section for sdist to create both tgz and zip
11558 archives
11559
11560 * setup.py: increase version number to 0.1
11561 (data_dist): New command class for data distribution
11562
11563 2001-09-14 Bernhard Herzog <[email protected]>
11564
11565 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11566 Handle the case of no layer (i.e. layer is None) properly.
11567
11568 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11569 Set the initial selection of the combo boxes to reflect the
11570 projection we're starting with in a way that works on windows,
11571 too.
11572
11573 * Thuban/Lib/connector.py (Connector.print_connections): Print the
11574 puiblisher's ids in hex to make it easier to compare them to the
11575 standard repr of python methods
11576
11577 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
11578 messages
11579
11580 2001-09-13 Bernhard Herzog <[email protected]>
11581
11582 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
11583 deselect the layer if no layer is selected
11584
11585 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
11586 idle time when there actually is something to draw. If there's
11587 nothing to draw simply clear the window
11588 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
11589 (MapCanvas.SetMap): force a redraw in all cases because
11590 FitMapToWindow doesn't always do it.
11591 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
11592 specify the point to move into the center of the window
11593 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
11594 dragged, zoon in/out by a factor of 2
11595 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
11596 index, i.e. reversed drawing order) so that objects appearing to
11597 be in from of others are selected first. This is probably mostly
11598 relevant for point shapes where the symbols used may overlap
11599
11600 * Thuban/Model/session.py (create_empty_session): Unset the
11601 modified bit before returning it
11602
11603 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
11604 create_empty_session session to create the new, empty session.
11605
11606 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
11607 the tool bitmaps.
11608 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
11609 the code that asks whether the session should be saved into the
11610 new method save_modified_session.
11611 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
11612 method to save modified session here too.
11613
11614 2001-09-11 Bernhard Herzog <[email protected]>
11615
11616 * setup.py (InnoIconItem): fix typo
11617
11618 (thuban_bdist_inno.run):
11619 (bdist_inno.run): Move the decision not to create symlinks on
11620 non-nt platforms to thuban_bdist_inno and do it unconditinally
11621 since we never want to create the symlinks here
11622
11623 2001-09-10 Bernhard Herzog <[email protected]>
11624
11625 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
11626 identify view immediately
11627
11628 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
11629 and SelectableRecordListCtrl that implement the code shared by the
11630 identify view and the label dialog
11631
11632 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
11633 new class RecordListCtrl
11634
11635 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
11636 return value of GetValue is None instead of using it as a boolean
11637 directly so that Zero numbers are handled properly.
11638 (LabelListCtrl): Derive from the new class
11639 SelectableRecordListCtrl
11640
11641 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
11642 (Proj4Dialog.dialogLayout): Make the window resizable and set the
11643 size of the text control explicitly to make the sizers work on
11644 both Windows and X.
11645
11646 2001-09-07 Bernhard Herzog <[email protected]>
11647
11648 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
11649 that can limit the search to the currently selected layer.
11650 (MapCanvas.SelectShapeAt): Make sure that the currently selected
11651 layer stays selected even when no shape is found
11652 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
11653 height do nothing (avoids zero division errors)
11654
11655 2001-09-06 Bernhard Herzog <[email protected]>
11656
11657 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
11658 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
11659 convenient :-)
11660 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
11661 a new instvar layer_to_item to map layers to tree items
11662 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
11663 to match the current selection in the interactor
11664
11665 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
11666 (Interactor.HasSelectedLayer): New methods to query the current
11667 selection
11668
11669 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
11670 (MainWindow.has_selected_layer): Simply call the appropriate
11671 interactor method
11672
11673 * Thuban/UI/mainwindow.py (MainWindow.__init__):
11674 (MainWindow.LayerShowTable):
11675 (MainWindow.identify_view_on_demand): Store the interactor in an
11676 instvar and use that reference instead of going through main.app
11677
11678 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11679 * Thuban/UI/application.py (ThubanApplication.OnInit):
11680 * Thuban/UI/main.py (main): Create the session tree view in main
11681 with the new mainwindow method ShowSessionTree and not directly
11682 the application's OnInit method
11683
11684 * Thuban/UI/tree.py (myTreeCtrlPanel):
11685 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
11686 TreeCtrl isntead of a panel. This affects most method since we now
11687 refer to self instead of self.tree
11688 (SessionTreeView): New class implementing a non-modal dialog
11689 showing the session tree.
11690
11691 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
11692 layer to the tableview dialog.
11693
11694 * Thuban/UI/tableview.py: Add some doc-strings
11695 (TableGrid):
11696 (TableGrid.OnRangeSelect):
11697 (TableGrid.OnSelectCell):
11698 (TableFrame.__init__):
11699 (TableFrame.row_selected):
11700 Selecting rows in the grid view now updates the selected shapes
11701 through the TableFrame. To achieve this we derive TableGrid from
11702 Publisher and introduce the message type ROW_SELECTED which the
11703 TableFrame subscribes to and which is issued by OnRangeSelect and
11704 OnSelectCell
11705
11706 (DataTable.SelectRow): Removed because it's no longer needed in
11707 the row/shape selection scheme
11708
11709 * Thuban/UI/dialogs.py: New file implementing common classes for
11710 dialogs
11711
11712 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11713 the SELECTED_SHAPE message anymore. This is now handled by the
11714 parent.
11715 (TableGrid.select_shape): Only update the selection if the shape
11716 is not None.
11717 (TableFrame): Inherit from the new NonModalDialog class.
11718 (TableFrame.__init__, TableFrame.select_shape): Handle the
11719 SELECT_SHAPE message.
11720 (TableFrame.OnClose): Extend the inherited method to unsubscribe
11721 SELECT_SHAPE
11722
11723 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11724 (MainWindow.add_dialog):
11725 (MainWindow.dialog_open):
11726 (MainWindow.remove_dialog):
11727 (MainWindow.get_open_dialog): New methods to maintain a dictionary
11728 of opened non-modal dialogs.
11729
11730 (MainWindow.__init__): Initialize the new non-modal dictionary
11731 management code
11732 (MainWindow.LayerShowTable): maintain separate dialogs for each
11733 table using the non-modal dialog management code to only open a
11734 view once for each table.
11735
11736 (MainWindow.IdentifyTool):
11737 (MainWindow.__init__):
11738 (MainWindow.identify_view_on_demand): Don't open the identify view
11739 in IdentifyTool anymore. This will be done automatically by the
11740 new method identify_view_on_demand which handles the
11741 SELECTED_SHAPE message so that the identify view will be opened on
11742 demand
11743
11744 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11745 the interactor argument. The SELECTED_SHAPE message is now handled
11746 by the parent.
11747 (IdentifyView.__init__): Add the interactor argument so that we
11748 can handle the SELECTED_SHAPE message here
11749 (IdentifyView.selected_shape): New method to handle the
11750 SELECTED_SHAPE messages
11751
11752 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11753 NonModalDialog class
11754 (IdentifyView.OnClose): Extend the inherited version to
11755 unsubscribe SELECT_SHAPE
11756
11757 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11758
11759 2001-09-05 Bernhard Herzog <[email protected]>
11760
11761 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11762
11763 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11764 interactor to pass through to the MapCanvas
11765
11766 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11767 argument to the MainWindow constructor to get rid of the ugly hack
11768 that made main.app available early just so that the mapcanvas
11769 could access the interactor object.
11770
11771 2001-09-04 Bernhard Herzog <[email protected]>
11772
11773 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11774 that runs a modal message box
11775 (MainWindow.OnClose): Use the new method
11776 (MainWindow.RemoveLayer): Just do nothing in case no layer is
11777 selected. The command should be grayed out anyway, so there's no
11778 need to pop up a message box.
11779 (MainWindow.AddLayer): Pop up a message box with an error message
11780 if the shape file can't be opened
11781
11782 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11783 immediately. This will cause an exception in case the file can't
11784 be opened and we can display an appropriate message.
11785
11786 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11787
11788 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11789 specific bdist_rpm command.
11790
11791 * Thuban/UI/main.py: Catch ImportError exceptions when importing
11792 the locale module because it may not be available on some
11793 installations.
11794
11795 * extensions/pyprojection/LICENSE: Copy of the license text in
11796 Projection.i. Having it in a separate file makes it easier to
11797 refer to license text in e.g. RPMs
11798
11799 2001-09-03 Bernhard Herzog <[email protected]>
11800
11801 * setup.py: use wx-config instead of wxgtk-config because it's
11802 more generic
11803
11804 * setup.py (ThubanInstall.get_outputs): Add the symlink in
11805 <prefix>/bin to the outputs
11806 (ThubanInstall.link_file): New method to link files. We need this
11807 because the standard copy_files refuses to link non-existing
11808 files.
11809 (ThubanInstall.run): Remove the leading install root from the
11810 script filename if an install root was specified and use the new
11811 link_file method
11812
11813 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11814 the window when the first layer is added to the map.
11815
11816 * setup.py (ThubanInstall.run): Honor the build root (self.root)
11817 when linking thuban.py to <prefix>/bin
11818
11819 2001-08-31 Bernhard Herzog <[email protected]>
11820
11821 * setup.py: In the setup call, the install parameters shouldn't
11822 have trailing slashes because distutils on non-posix platforms
11823 doesn't like that. The same applies to other directories like
11824 "Resources/Bitmaps"
11825
11826 In the configuration section for nt, move the wxWindows directory
11827 optins into the part clearly marked as editable.
11828
11829 (InstallLocal.initialize_options):
11830 (InstallLocal.user_options): remove the currently unused debug
11831 flag
11832 (thuban_build_py.find_all_modules): Add this method so that it
11833 works for our case of having packages and modules in one
11834 distribution as well.
11835 (ThubanInstall.initialize_options):
11836 (ThubanInstall.finalize_options):
11837 (ThubanInstall.user_options):
11838 (ThubanInstall.boolean_options): Add new options, do-symlink and
11839 extra files. Since these are the first ThubanInstall specific
11840 options, override user_options and boolean_options
11841 (ThubanInstall.run): Honor the new do-symlink and extra-files
11842 options.
11843 (ThubanInstall.get_outputs): Add to override the base-class's
11844 version and add the extra-files to the outputs
11845 (bdist_inno): New class for windows distributions with Inno Setup
11846 (InnoIconItem): Helper class for bdist_inno
11847 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11848 this together with the appropriate parameters, to the setup call.
11849
11850 * setup.cfg (bdist_inno): added new section for the inno setup
11851 installer
11852
11853 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11854 changing_selection to avoid recursive selection events when
11855 modifying the selection in response to a selection event.
11856 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11857 changing the tree's selection.
11858 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11859 we're not being called indirectly from normalize_selection.
11860
11861 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11862 event.Check only if the command is actuall checkable.
11863 (MainWindow.__init__): Call the toolbar's Realize method to make
11864 sure that the items are actually shown
11865
11866 2001-08-28 Bernhard Herzog <[email protected]>
11867
11868 * setup.py: Fix some doc strings
11869
11870 * ChangeLog: started
11871

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26