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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2571 - (show annotations)
Fri Feb 18 14:54:17 2005 UTC (20 years ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 447991 byte(s)
Refactored baserenderer.py and renderer.py to remove baserenderer.py's
dependencies on wxPython. Added a new method projected_raster_layer()
that returns a raster layer image in projected space. This must be
implemented in classes derived from BaseRenderer. This also eliminates
the dependency on gdal in baserenderer.py.

1 2005-02-18 Jonathan Coles <[email protected]>
2
3 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
4 dependencies on wxPython. Added a new method projected_raster_layer()
5 that returns a raster layer image in projected space. This must be
6 implemented in classes derived from BaseRenderer. This also eliminates
7 the dependency on gdal in baserenderer.py.
8
9 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
10 new projected_raster_layer() to get projected raster image instead
11 of directly calling ProjectRasterFile().
12 (BaseRenderer.projected_raster_layer): New. This must be implemented
13 by derived classes. It takes almost the same arguments as ProjectRasterFile
14 did and returns a projected image with mask and alpha data (if requested).
15 (BaseRenderer.render_map_incrementally): Remove the check for gdal since
16 that check will be done in MapRenderer.projected_raster_layer(). This
17 also allows other implementations to use different projection code.
18
19 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
20 Implementation of BaseRenderer.projected_raster_layer. Checks for
21 gdal support and wxPython version. Also handles exceptions from
22 ProjectRasterFile.
23
24 * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
25 and added a variable which can be set through the options argument
26 of ProjectRasterFile.
27
28 * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
29 Calls ProjectRasterFile and returns the result.
30 (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
31 of calling projected_raster_layer() with different options.
32 (TestBaseRenderer.test_raster_no_projection): Removed tests based on
33 wxPython version and all tests of masks and alpha channels. These are
34 now in test_projected_raster_layer().
35
36 2005-02-17 Jan-Oliver Wagner <[email protected]>
37
38 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
39 doc-strings to comply with coding_guidelines.
40
41 2005-02-17 Jan-Oliver Wagner <[email protected]>
42
43 Docstring improvements and minor fixes for labellayer.
44
45 * Thuban/Model/map.py:
46 (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
47 Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
48 Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
49 Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
50 doc string.
51 (Map.BoundingBox): Removed superfluous test for label_layer
52 and improved doc string.
53 (Map.TreeInfo): Added label_layer and improved sdo string.
54
55 * Thuban/Model/label.py: Added import of _.
56 (Label, Label.__init__): Improved/added doc string.
57 (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
58 LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
59 Improved/added doc string.
60 (LabelLayer.AddLabel): Use already defined names for
61 align strings and improved doc string.
62 (LabelLayer.TreeInfo): New. Return the object data for
63 the tree view.
64
65 2005-02-16 Jonathan Coles <[email protected]>
66
67 Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
68 so that that wxproj doesn't crash. Added GUI support for selecting
69 alpha channel (opacity can't be selected yet).
70
71 NOTE: If wxPython.h is including in future distribution packages
72 then it will not be necessary to have the files swigPtrConvertHack.h
73 and wxPython_int.h included with Thuban. This is hopefully
74 a temporary workaround.
75
76 * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
77 access to the macro wxCHECK_VERSION so that it will properly
78 generate a bit mask. There was a problem between wx2.4 and wx2.5
79 that this works around.
80
81 * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
82 of RasterLayer.MaskType.
83 (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
84 (RasterLayer.MaskType): New. Returns the type of mask to use. Can
85 specify none, a bitmap, or an alpha channel.
86 (RasterLayer.SetMaskType): New. Set what kind of mask to use.
87
88 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
89 Set the raster warping options for the mask based on the value
90 of RasterLayer.MaskType.
91
92 * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
93 deprecated calls to SetItemSelectedImage in favor of SetItemImage
94 with wxTreeItemIcon_Selected.
95
96 * Thuban/UI/rasterlayerproperties.py: Support selecting to use
97 an alpha channel for the mask.
98
99 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
100 data if it is available and an alpha channel is supported under
101 the current version of wxPython.
102
103 * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
104 to select whether 1's or 0's select the desired portion of an image
105 in the bit mask. wx2.4 has a bug where the documentation is the opposite
106 from behavior.
107 (ProjectRasterFile): Only generate an alpha channel if the version
108 of wxPython is >= 2.5.3.
109
110 * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
111 When wxPython >= 2.5.3 use the special swig functions to decode an
112 object's address.
113
114 * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
115 based on the version of wxPython. If >= 2.5.3 use the special swig
116 functions from wxPython to decode wxPython objects, otherwise use
117 the old method of retrieving the address from the object __repr__ string.
118
119 * libraries/thuban/wxPython_int.h: Copied from wxPython source.
120 Unnecessary code was removed to make it smaller.
121
122 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
123 Add tests for returning an alpha channel.
124
125 * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
126 tests that used removed functions UseMask and SetUseMask
127
128
129 2005-02-08 Bernhard Herzog <[email protected]>
130
131 More wxPython 2.5 changes. This time taken from a patch from
132 Daniel Calvelo Aros.
133
134 * Thuban/UI/tableview.py (QueryTableFrame.__init__)
135 (QueryTableFrame.__init__): Pass the size of a spacer as a single
136 item.
137
138 * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
139 (ProjFrame.build_dialog): Pass the size of a spacer as a single
140 item.
141
142 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
143 size of a spacer as a single item.
144
145 * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
146 size of a spacer as a single item.
147
148 2005-02-08 Bernhard Herzog <[email protected]>
149
150 Compatibility with wxPython 2.5. The changes should make it work
151 better with 2.5 while still keeping compatibility with 2.4. There
152 are still problems with 2.5, though.
153
154 * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
155 of a spacer as a single item.
156
157 * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
158 from wxControl
159
160 * Thuban/UI/legend.py (LegendTree): When running with wxPython <
161 2.5, add an implementation of the GetFirstChild method that does
162 not require the second parameter.
163 (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
164 (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
165 (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
166 pass the second parameter to GetFirstChild
167
168 2005-02-08 Nina Hüffmeyer <[email protected]>
169
170 * Extensions/ogr/ogrshapes.py: Removed some print commands.
171
172 * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
173 additional menu but appears as a possibility in the menu Map.
174
175 2005-02-07 Jonathan Coles <[email protected]>
176 * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
177 and PYTHON_ERRF since they were no longer necessary.
178
179 2005-02-07 Bernhard Reiter <[email protected]>
180 * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
181 Enable translation for message string.
182
183 2005-02-06 Martin Schulze <[email protected]>
184
185 * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
186 the arguments of the contstructor to fit the global scheme
187
188 2005-01-31 Nina Hüffmeyer <[email protected]>
189
190 * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
191 some dialogs needed to start ogr.
192
193 * Extensions/ogr/__init__.py: Changed comments to avoid encoding
194 warnings.
195
196 * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
197 encoding warnings.
198
199 2005-01-28 Jonathan Coles <[email protected]>
200
201 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
202 mask is packed into a bit array. It's now slightly faster.
203
204 2005-01-28 Jonathan Coles <[email protected]>
205
206 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
207 default to true.
208
209 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
210 code that loads the state of the layer's use_mask flag. Its
211 usefulness is still being debated.
212
213 * Thuban/Model/save.py (SessionSaver.write_layer): Remove
214 code that saves the state of the layer's use_mask flag. Its
215 usefulness is still being debated.
216
217 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
218 options to ProjectRasterFile based on the state of layer.UseMask().
219 Catch more exceptions from ProjectRasterFile so that Thuban doesn't
220 quit is there is a problem projecting.
221 (BaseRenderer.draw_raster_data): Change the documentation to
222 describe the new format (XBM) that the mask data will be in.
223
224 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
225 data is in XBM format when format='RAW' which means it doesn't
226 need to be converted to a wxImage before being used as a mask
227 for a wxBitmap. Assume that if format != 'RAW' that the image
228 data and mask data are in the same format.
229
230 * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
231 and a mask is requested, convert the alpha band to a bit array in
232 XBM format. if an alpha channel is requested, simply return the
233 data in the alpha band. Provide better error handling by returning
234 python error messages (also fixes RT #2947).
235 (ProjectRasterFile): Support multiple mask options, rather than simply
236 a flag indicating that a mask should or should not be used. Provide
237 better error handling by returning python error messages.
238
239 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
240 Add mask data to test.
241
242 * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
243 should use the mask by default.
244 (TestLayerModificaton.test_raster_layer): Test that a layer should use
245 the mask by default.
246
247 * test/test_load.py (TestRasterLayer.test): Remove testing for
248 use_mask flag in file.
249
250 * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
251 for use_mask in file.
252
253 * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
254
255 2005-01-26 Jonathan Coles <[email protected]>
256
257 Add a new dialog box for raster layers. The dialog box allows
258 the user to toggle a mask that is generated by ProjectRasterFile
259 and is used to only draw the real parts of the projected image.
260
261 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
262 Instruct the warping code to generate a mask if the raster layer
263 requests one.
264 (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
265
266 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
267 obsolete optional mask argument.
268
269 * Thuban/UI/classifier.py (Classifier): Change the parent class
270 to LayerProperties and rework the code to support layout calls
271 from the parent.
272 (Classifier.dialog_layout): New. Layout the dialog box.
273 (Classifier.map_layers_removed): Removed. Moved to parent class.
274 (Classifier.map_replaced): Removed. Moved to parent class.
275 (Classifier._OnTry): Renamed to OnTry to support parent class.
276 (Classifier.OnClose): Removed. Supplied in parent class.
277 (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
278 (Classifier._OnOK): Renamed to OnOK to support parent class.
279 (Classifier._OnRevert): Renamed to OnRevert to support parent class.
280
281 * Thuban/UI/layerproperties.py: New. Base class for layer properties
282 dialog boxes.
283
284 * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
285 raster layer properties.
286
287 * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
288 with the non-simple version supplied with gdal. This allows added
289 features such as creating an alpha band.
290 (GetImageData): Generate a mask array from the alpha band that is
291 generated by gdal if the user has selected it. Try to support images
292 that have more than three bands, such as images with RGB plus an
293 alpha band.
294 (ProjectRasterFile): Convert python argument for mask and tell
295 gdal to enable or disable an alpha band.
296
297 * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
298 describing what kind of layer the class is. Defaults to "Unknown",
299 but should be overridden by subclasses.
300 (Layer.Type): New. Override base class method.
301 (RasterLayer.__init__): Create a flag for using a mask. Record extra
302 data from gdal for display in the properties dialog.
303 (RasterLayer.Type): New. Override base class method.
304 (RasterLayer.UseMask): New. Returns True if the mask should be used.
305 (RasterLayer.SetUseMask): New. Set if the mask should be used.
306 (RasterLayer.ImageInfo): New. Return extra information about the image.
307
308 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
309 the mask information.
310
311 * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
312
313 * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
314 Classifier classes as dialogs to use with the proper layer types.
315
316 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
317 Fix test.
318
319 * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
320 (TestLayerModification.build_path): New. Support function.
321 (TestLayerModification.test_raster_layer): New. Test new methods.
322
323 * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
324
325 * test/test_load.py (TestRasterLayer): Add tests for mask.
326
327 * test/test_load_1_0_1.py: New. Copied from test_load.py.
328
329 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
330 obsolete optional mask argument.
331
332 2005-01-26 Nina Hüffmeyer <[email protected]>
333
334 * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
335 which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
336 RowOrdinalToId() and ReadRowAsDict().
337
338 * Extensions/ogr/ogrstart.py: Added menu item which opens database
339 layers for existing database connections.
340
341 * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
342
343
344 2005-01-26 Jan-Oliver Wagner <[email protected]>
345
346 * Doc/manual/thuban-manual-de.xml: More translations.
347
348 2005-01-24 Bernhard Herzog <[email protected]>
349
350 Rework the status bar updates a bit to make sure the message about
351 the projections is produced at the right times.
352
353 * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
354 New class variable with messages that may require a status bar
355 update.
356 (MainWindow.view_position_changed)
357 (MainWindow.update_status_bar): Rename from view_position_changed
358 to update_status_bar. It's meaning has changed now that it may
359 also generate messages about problems with projection settings.
360 (MainWindow.__init__): Use the new update_status_bar_messages
361 class variable to subscribe update_status_bar
362 (MainWindow.set_position_text): Update doc-string. This method
363 has to be renamed at some point. See doc-string and comments.
364 (MainWindow.OnClose): Unsubscribe update_status_bar from all
365 messages in update_status_bar_messages
366
367 * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
368 class attribute. map messages to be forwarded by the viewport.
369 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
370 the messages in forwarded_map_messages
371
372 2005-01-21 Bernhard Herzog <[email protected]>
373
374 * test/postgissupport.py (PostGISDatabase.__init__): Tweak
375 doc-string
376 (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
377 different name for the initialization SQL file.
378
379 2005-01-21 Jonathan Coles <[email protected]>
380
381 * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
382 a projection and returns a formatted string representing the
383 parameters to feed to gdalwarp. This function eliminates
384 redundancy in draw_raster_layer().
385 (BaseRenderer.render_map_incrementally): Removed the optimization which
386 drew the top most raster layer first and then only those vector-
387 based layers that are above it. With the support for transparency
388 this optimization breaks correct behaviour.
389 (BaseRenderer.draw_raster_layer): Reorganize code to support possible
390 future enhancements to raster layer bounding box. The old behaviour has
391 not changed. Also, change calling parameters to draw_raster_data()
392 to specify new RAW data format and mask.
393 (BaseRenderer.draw_raster_data): Change signature to include an optional
394 parameter for mask information. Change documentation to mention
395 support for new parameter and added option for RAW data format.
396 The data argument is now a list of [width, height, data].
397
398 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
399 mask parameter. Add new condition for RAW format, which
400 significantly reduces rendering time. Add condition for
401 mask parameter.
402
403 * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
404 data array of RGB values from the projected image returned from
405 the gdal warping functions. In the case of palette based images, it
406 converts the NO_DATA index to the mask color.
407 (ProjectRasterFile): Removed all custom memory driver references
408 and replaced it with the standard in-memory dataset provided
409 by gdal. The return data is no longer a BMP file, but an array
410 of RGB values, one set triple per pixel.
411
412 * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
413 * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
414 * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
415
416 * setup.py (thuban_build_ext.finalize_options): Removed mention
417 of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
418 files. These are obsolete with the new version of gdalwarp.cpp
419
420 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
421 Updated signature.
422 (TestBaseRenderer.test_raster_no_projection): Changed the test
423 data to be data in the uncompressed RAW format returned from
424 ProjectRasterFile.
425
426 2005-01-21 Jan-Oliver Wagner <[email protected]>
427
428 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
429 string available for i18n.
430
431 2005-01-20 Russell Nelson <[email protected]>
432
433 * Resources/Projections/defaults.proj: Ruin the speling of the
434 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
435 It's the wrong thing to do in the long run, but it's necessary for
436 those users until that bug is fixed. Otherwise the projection
437 dialog segfaults. Better to annoy some Lambert-93 users with a
438 spelling mistake than every Fedora Core 3 user of Thuban-CVS.
439
440 2005-01-20 Bernhard Reiter <[email protected]>
441
442 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
443 docstring and comment that the warning code here is a hack.
444
445 2005-01-20 Russell Nelson <[email protected]>
446
447 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
448 user about misprojected layers when their lat/lon bounding
449 box exceeds rational lat/lon values.
450
451 2005-01-20 Bernhard Reiter <[email protected]>
452
453 * Thuban/UI/about.py (unicodeToLocale): Improved:
454 Use 'ascii' and then 'replace' for other characters
455 when getdefaultlocale returns None. Thanks to Bernhard H. .
456
457 2005-01-20 Bernhard Reiter <[email protected]>
458
459 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
460 that OnRangeText might be called twice and using None as argument.
461
462 2005-01-20 Bernhard Reiter <[email protected]>
463
464 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
465 OnRangeText(0) to work around a different in wx Behaviour noticed
466 on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
467
468 2005-01-20 Bernhard Reiter <[email protected]>
469
470 * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
471 None. (Fixes rt#2910.)
472
473 2005-01-18 Frank Koormann <[email protected]>
474
475 New Extension: mouseposition
476 Tool to collect mouse click positions (map coordinates) in a dialog.
477
478 * Extensions/mouseposition/__init__.py: New, extension registration
479
480 * Extensions/mouseposition/mouseposition.py: New, implements the
481 dialog and adds a tool to Thuban mainwindow.
482
483 * Extensions/mouseposition/position.xpm: New, icon for tool.
484
485 2005-01-14 Jan-Oliver Wagner <[email protected]>
486
487 * Doc/manual/thuban-manual-de.xml: More translations.
488
489 2005-01-11 Frank Koormann <[email protected]>
490
491 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
492 Fix indention bug.
493
494 2005-01-09 Frank Koormann <[email protected]>
495
496 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
497 BugFix 2901: Explicitly copy layers ClassificationColumn since it
498 is not part of the layers Classification.
499
500 2005-01-03 Frank Koormann <[email protected]>
501
502 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
503 BugFix 2883: Former implementation only worked on classified point
504 layers: KeyError was raised, now use the default size if field is None.
505
506 2004-12-27 Bernhard Reiter <[email protected]>
507
508 svgexport 1.0.0cvs: Fixed label export.
509
510 * Extensions/svgexport/test/test_svgmapwriter.py:
511 class TestSVGRenderer(): New class; new test test_label_font().
512
513 * Extensions/svgexport/svgmapwriter.py
514 (SVGRenderer.label_font()): initialised Font size with self.factor now,
515 makes test_label_font happy.
516
517 * Extensions/svgexport/TODO: crossed out fixed label export item.
518 Added item for options.
519
520 * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
521
522 2004-12-27 Russell Nelson <[email protected]>
523
524 Middle mouse button pans.
525
526 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
527 OnMiddleDown and OnMiddleUp events.
528 (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
529 previously used tool.
530 (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
531 pressing the middle mouse button.
532
533 2004-12-27 Jan-Oliver Wagner <[email protected]>
534
535 * Doc/manual/thuban-manual-de.xml: More translations.
536
537 2004-12-23 Jan-Oliver Wagner <[email protected]>
538
539 * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
540 \n to stderr after the warnings. Thanks to Russell Nelson.
541
542 2004-12-20 Nina Hueffmeyer <[email protected]>
543
544 * Extensions/ogr/ogrshapes.py: Fixed some issues from
545 Bernhard (coding guidelines etc.). Additionally it is now possible to
546 display shapefiles containing feature collections (e.g.polygons
547 with holes). Works with gdal 1.2.1 now.
548
549 * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
550 from Bernhard (coding guidelines etc.). If ogr can't be imported,
551 tests are skipped now.
552
553 * Extensions/ogr/ogrstart.py: Fixed some typings.
554
555 2004-12-20 Bernhard Reiter <[email protected]>
556
557 * Extensions/svgexport/TODO: updated to add support for
558 raster layers and labels for 1.0.1.
559
560 * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
561 Issue a warning now.
562
563 2004-12-19 Bernhard Reiter <[email protected]>
564
565 * Extensions/svgexport/TODO: Added idea to support triggering
566 the application down the pipe.
567
568 2004-12-19 Bernhard Reiter <[email protected]>
569
570 svgexport: Improved code quality, mainly by better naming.
571
572 * Extensions/svgexport/svgmapwriter.py:
573 DrawPath() renamed to DrawPolygonPath(),
574 added documentation, improved comments and variable names.
575
576 * Extensions/svgexport/svgmapwriter.py,
577 Extensions/svgexport/test/test_svgmapwriter.py:
578 All using DrawPolygonPath() now, the default parameter closed=True
579 omitted.
580
581 * Extensions/svgexport/test/test_svgmapwriter.py:
582 renamed test_polygon_opened() to test_polyline()
583 renamed test_transparent_polygon() to test_transparent_polyline()
584
585 2004-12-18 Jan-Oliver Wagner <[email protected]>
586
587 Some fixes of gns2shp extension.
588
589 * Extensions/gns2shp/test/__init__.py: New. Make this directory a
590 package.
591
592 * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
593 dynamically.
594
595 * Extensions/gns2shp/test/README: Simplified description how to test.
596
597 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
598 fixed some dimensions of fields according to the GNS documentation
599 which seems to change undocumented.
600 Now killing trailing \n and/or \r from MODIFY_DATE.
601 This fixes RT#2453.
602
603 2004-12-18 Bernhard Reiter <[email protected]>
604
605 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
606
607 * Extensions/svgexport/test/test_svgmapwriter.py:
608 Added new tests: test_export_polygon_with_hole()
609 and test_polygon_with_hole().
610
611 * Extensions/svgexport/svgmapwriter.py
612 (draw_polygon_shape()): Uses DrawPath correctly now.
613
614 * Doc/manual/thuban-manual.xml: Added documentation for stable
615 extention svgexport.
616 * Doc/manual/thuban-manual-de.xml: Copied English section about
617 svexport over.
618
619 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
620
621 * Extensions/svgexport/svgsaver.py,maplegend.py:
622 Moved from experimental to stable extension menu.
623
624 * Extensions/svgexport/TODO: updated.
625
626
627 2004-12-18 Bernhard Reiter <[email protected]>
628
629 Added Extensions/svgexport/TODO
630
631 2004-12-18 Bernhard Reiter <[email protected]>
632
633 Refactored in svgexport:
634 DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
635
636 * Extensions/svgexport/svgmapwriter.py
637 Added verbosity level 3 to print out polygon points.
638 (class Point): added __repr__
639 (class Brush, __str__()): Added space after ,.
640 (DrawPolygon): Renamed to DrawPath()
641 (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
642 (DrawLines): Using DrawPath now.
643
644 * Extensions/svgexport/test/test_svgmapwriter.py:
645 Replaced DrawPolygon() calls with DrawPath() and put the first argument
646 inside another list. Adapted test data with a newline before "M".
647
648 2004-12-18 Bernhard Reiter <[email protected]>
649
650 Refactored svgexport tests: 9 double tests runs eliminated;
651 code size reduced by 8 lines.
652
653 * Extensions/svgexport/test/test_svgmapwriter.py:
654 (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
655 (class BaseWithDCtools): New, subclass from BaseTestWithDC.
656 (class TestDrawSplines): now subclass from BaseTestWithDCtools,
657 this fixed the double running of the nine tests of TestVirtualDC.
658 (class TestVirtualDC): Using self.dc and self.file from setUp().
659
660 2004-12-17 Bernhard Herzog <[email protected]>
661
662 Two windows specific fixes ported from thuban-1­0-branch:
663
664 * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
665 instead of getlocale because getlocale doesn't return a usable
666 encoding name on a german windows 2000
667
668 * setup.py: windows build: Removed the absolute path names and
669 made all prfixes relative to the directory containing setup.py.
670 Makes it a little easier to adapt to a different system.
671
672 2004-12-16 Bernhard Herzog <[email protected]>
673
674 Add support for PostGIS tables with LINESTRING geometries.
675 Fixes RT#2299
676
677 * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
678
679 * test/postgissupport.py
680 (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
681 table to "roads-multi" because it now uses MULTILINESTRING
682 geometries and introduce a new "roads" table that uses LINESTRING
683 (coords_to_multilinestring): Make the doc string more precise
684 (coords_to_linestring): New. Create a LINESTRING WKT
685 representatin
686 (wkt_converter): Add coords_to_linestring
687 (upload_shapefile): Rephrase the doc-string a bit.
688
689 * test/test_postgis_db.py (TestPostGISShapestoreArc)
690 (LineStringTests)
691 (TestPostGISShapestoreLineString)
692 (TestPostGISShapestoreMultiLineString): Split
693 TestPostGISShapestoreArc into a base class LineStringTests and two
694 derived classes TestPostGISShapestoreLineString for LINESTRING
695 geometries and TestPostGISShapestoreMultiLineString for
696 MULTILINESTRING geometries. Most test methods are in the base
697 class with the exception of tests that explicitly check the raw
698 format.
699
700 2004-12-16 Bernhard Herzog <[email protected]>
701
702 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
703
704 * test/postgissupport.py (find_postgis_sql): Different postgis
705 versions put the postgis.sql file into slightly different places
706 so we have to look in both. The updated doc string describes this
707 is more detail.
708
709 * test/test_postgis_db.py
710 (TestPostGISSpecialCases.test_column_name_quoting): The return
711 value of UniqueValues is unsorted, so it has to be sorted for
712 comparison.
713
714 2004-12-16 Bernhard Herzog <[email protected]>
715
716 Fix for RT#2237
717
718 * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
719 panel to be shown is the UnknownProjPanel disable the OK and Try
720 buttons. Otherwise enable them.
721 (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
722 the parameters. In that case __GetProjection also returns None
723 now.
724
725 2004-12-15 Bernhard Herzog <[email protected]>
726
727 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
728 minimum number of classes to 2. The calculate_quantiles needs at
729 least two and raises an exception otherwise.
730 Fixes RT#2549
731
732 2004-12-15 Bernhard Herzog <[email protected]>
733
734 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
735 so that it returns a result for select statements.
736 (PostgreSQLServer.server_version): New. Return the version of the
737 server software.
738 (PostgreSQLServer.require_authentication): The format of
739 pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
740 server version and generate the file in the correct format
741
742 2004-12-15 Bernhard Herzog <[email protected]>
743
744 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
745 in the doc string and rephrase it a little.
746
747 2004-12-15 Frank Koormann <[email protected]>
748
749 * test/test_load.py (TestAltPath.checkSession): New, extended checks if
750 session has been loaded successfully. The check is called by the relevant
751 tests after executing load_session().
752
753 2004-12-13 Bernhard Herzog <[email protected]>
754
755 Make sure the region used to determine which shapes are visible
756 actually matches the region on the printed page. If this isn't
757 done properly some shapes might not be printed.
758 Fixes RT #2692
759
760 * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
761 renderer has to be at the same position as the mapregion
762
763 * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
764 has to be moved by (self.shiftx, self.shifty) too.
765
766 2004-12-13 Bernhard Herzog <[email protected]>
767
768 * libraries/pyprojection/Projection.i: Work around a bug in the
769 generated python code which leads to exception in the __del__
770 method when the constructor fails. See the comments in the code
771 for more details.
772
773 * libraries/pyprojection/Projection.py: Updated from Projection.i
774 with SWIG.
775
776 2004-12-13 Bernhard Herzog <[email protected]>
777
778 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
779 (TestAltPath.test_02_path_error_fix_from_list)
780 (TestAltPath.test_05_path_error_fix_from_list_changed)
781 (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
782 is destroyed in tearDown, so there's no need to do it in a test
783 case.
784
785 * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
786 debug print
787
788 2004-12-13 Bernhard Herzog <[email protected]>
789
790 * Extensions/svgexport/test/test_svgmapwriter.py
791 (TestDrawSplines.setUp): Do not use super with the unittest
792 classes because in Python 2.2 they're still old-style classes.
793
794 2004-12-13 Frank Koormann <[email protected]>
795
796 Alternative Path feature: When loading a (moved) session where
797 shapefiles cannot be found, ask the user. Use the specified path
798 if further shapefiles are missing. However, ask the usr for confirmation
799 in such cases.
800
801 * test/test_load.py (TestAltPath): New, tests for alternative path feature
802 in load_session()
803 (Shapefile_CallBack): Helper, implements controllable callback.
804
805 * Thuban/UI/application.py (ThubanApplication.OnInit):
806 Added "alt_path" to self.path
807 (ThubanApplication.OpenSession): Added shapefile_callback as second
808 callback similar to db_connection_callback.
809 (ThubanApplication.run_alt_path_dialog): New, implementaion of
810 shapefile_callback. In addition to raising the dialog the control of
811 self.path('alt_path') is implemented here.
812
813 * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
814 (SessionLoader.open_shapefile): Open shapefile, eventually with
815 alternative path. This wrapps the "theSession.OpenShapefile(filename)"
816 formerly used in start_fileshapesource()/start_layer().
817 (SessionLoader.start_fileshapesource): Call open_shapefile().
818 (SessionLoader.start_layer): Call open_shapefile().
819 (load_session): Added shapefile_callback.
820
821 * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
822 feature (search / check).
823
824 * Doc/manual/thuban-manual.xml: Added documentation of new feature.
825
826 2004-12-11 Bernhard Reiter <[email protected]>
827
828 svgexport 0.9.2: Point size supports for maps.
829
830 * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
831 (def draw_point_shape): new parameter size defaults to 2 as before.
832 (draw_shape_layer_incrementally): Moved draw_func log line higher.
833 Added draw_func call with size when dealing with a point layer.
834
835 * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
836
837 2004-12-11 Bernhard Reiter <[email protected]>
838
839 Made sure that newlines are inserted in the svg path d attributes
840 to raise the chance that the line length will be below 255 characters,
841 as recommended by REC SVG 1.1 in section 8.3.1.
842
843 * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
844 Adding \n before L's and changed whitespace handling.
845
846 * Extensions/svgexport/test/test_svgmapwriter.py:
847 Adapted tests to new whitespace handling of DrawPolygon.
848
849 2004-12-11 Bernhard Reiter <[email protected]>
850
851 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
852
853 * Extensions/svgexport/test/test_svgmapwriter.py:
854 Removed test_drawbezier in favour of new test_drawspline3 and
855 test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
856 All only to test DrawSpline.
857
858 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
859 New implementation now really using the strange algorithm of
860 xfig 3.1's approximated splines and its conversion to postscript
861 with one twist: SVG can do quadratic beziers, so skipped translation
862 to cubic beziers.
863 (TestWithDC): Typo in comment fixed.
864
865 2004-12-09 Martin Schulze <[email protected]>
866
867 * Thuban/Model/classgen.py: Added missing character encoding
868
869 * Extensions/wms/properties.py (OpenWMSProperties): removed
870
871 * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
872 support for get_srs_discrepancies() since there are no
873 discrepancies anymore (was a thinko)
874
875 * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
876 format priority now that more formats are supported globally by
877 the render engine.
878
879 2004-12-08 Silke Reimer <[email protected]>
880 * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
881 because it is not available in all versions of ogr
882
883 2004-12-08 Bernhard Reiter <[email protected]>
884 * Extensions/ogr/__init__.py: Added empty __init__.py to heal
885 global tests until a real one is commited.
886
887 2004-12-07 Nina Hüffmeyer <[email protected]>
888
889 * /Extensions/ogr/: Adding a new extension to read shapefiles with
890 ogr. It is planned to add other vector formats.
891
892 * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
893
894 2004-12-07 Jan-Oliver Wagner <[email protected]>
895
896 * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
897 part of a (non-)fix to renable that the tests are always
898 executed.
899
900 2004-12-07 Bernhard Reiter <[email protected]>
901
902 * Extensions/svgexport/test/test_svgmapwriter.py:
903 Added test_drawbezier() to test DrawSpline().
904
905 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
906 Really implemented bezier drawing.
907
908 * Extensions/svgexport/__init__.py: Bumped version of svgexport
909 to 0.9.1 because now the legend examples lines styles
910 will be drawing with beziers.
911
912 2004-12-05 Martin Schulze <[email protected]>
913
914 * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
915 GIF as supported bitmap image formats (helpful for the WMS extension)
916
917 2004-11-30 Martin Schulze <[email protected]>
918
919 * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
920 Improved the test for the internal compare method
921
922 2004-11-27 Jan-Oliver Wagner <[email protected]>
923
924 * Thuban/UI/about.py (About.__init__): Added
925 Norbert Solymosi for hungarian translation and Ole Rahn
926 as contrbutor. Moved Bernhard Reiter from Contributor
927 to Developer.
928
929 2004-11-27 Bernhard Reiter <[email protected]>
930
931 * Extensions/svgexport/test/test_svgmapwriter.py:
932 Removed Jan from author list as he did not change enough significant
933 lines yet.
934
935 * Extensions/svgexport/__init__.py: Added Bernhard as author
936 of the Extension.
937
938 2004-11-27 Jan-Oliver Wagner <[email protected]>
939
940 * po/hu.po: New. Hungarian translation. Contributed
941 by Norbert Solymosi.
942
943 2004-11-26 Bernhard Herzog <[email protected]>
944
945 * Extensions/svgexport/test/test_svgmapwriter.py
946 (Testobjectexport.test_transparent_polygon): Commented out some
947 debug prints
948
949 2004-11-24 Jan-Oliver Wagner <[email protected]>
950
951 Fix broken tests for svg extension and added svg legend
952 to Experimental menu.
953
954 * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
955 the test run correctly even if the extension is a package.
956 Also removed the "import Thuban" which makes no sense.
957
958 * Extensions/svgexport/__init__.py: Fix to have the extensions'
959 test module also be executed from the global test routine.
960 This is done by looking for the absense of the DISPLAY variable.
961
962 * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
963 to Experimental menu since this module has yet not reached a stable
964 status (ie. 1.0).
965
966 2004-11-22 Bernhard Reiter <[email protected]>
967
968 * Extensions/svgexport/svgmapwriter.py:
969 Added verbose variable and some logging depending on it.
970 (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
971 because counting i is not necessary.
972 (class Pen, class Brush): Added simple __str__ methods.
973 (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
974 not exported to svg file) Note: holes still unhandled.
975
976 * Extensions/svgexport/test/test_svgmapwriter.py:
977 Made a baseclass TestWithDC for test needed a DC.
978 Added tests for bug #2698 (transparent polygons are not
979 exported to svg file):
980 Testobjectexport.test_transparent_polygon()
981
982 * Thuban/Model/base.py (UnsetModified):
983 Fixed some typos in docstring.
984
985 * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
986 Added hints on the used algorithm for handling holes.
987
988 2004-11-20 Jan-Oliver Wagner <[email protected]>
989
990 Some face lifting for the examples.
991
992 * Examples/__init__.py: Make this directory a package.
993
994 * Examples/simple_extensions/__init__.py: Make this directory a package.
995
996 * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
997 menu to Examples menu.
998
999 * Examples/simple_extensions/simple_command.py: Some more comments,
1000 minor changes.
1001
1002 * Examples/simple_extensions/simple_tool.py: Minor changes.
1003
1004 2004-11-20 Jan-Oliver Wagner <[email protected]>
1005
1006 Changed way of extension registry for wms and added extension
1007 registry for umn_mapserver extension.
1008
1009 * Extensions/wms/__init__.py: Added registry entry and the importing
1010 of the actual wms module. Included a test for the required PyOGCLib.
1011
1012 * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1013
1014 * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1015 importing of the actual umn mapserver management modules.
1016 Included a test for the required Python MapScript.
1017
1018 2004-11-20 Jan-Oliver Wagner <[email protected]>
1019
1020 Changed way of extension registry for importAPR, bboxdump
1021 and added extension registry for svgexport.extension registry for
1022 svgexport.
1023
1024 * Extensions/importAPR/__init__.py: Added registry entry and the importing
1025 of the actual importAPR module.
1026
1027 * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1028 __init__.py).
1029
1030 * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1031 »···of the actual bboxdump module.
1032
1033 * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1034 »···__init__.py).
1035
1036 * Extensions/svgexport/__init__.py: Added registry entry and the importing
1037 of the svgsaver module.
1038
1039 * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1040 to Experimental menu since this module has yet not reached a stable
1041 status (ie. 1.0).
1042
1043 2004-11-18 Jan-Oliver Wagner <[email protected]>
1044
1045 Now the hit test considers the size of point symbols.
1046
1047 * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1048 'size' defaulting to the previously fixed value 5.
1049 Extended doc-string.
1050 (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1051 for symbols.
1052 Now the size of the largest point symbol is determined to find out
1053 about whether the point has been hit.
1054 This fixes the problem that only clicks inside a fixed distance of
1055 5 where found.
1056
1057 2004-11-17 Jan-Oliver Wagner <[email protected]>
1058
1059 Another open issue fixed regarding sizeable symbols: correct rendering of
1060 selected symbols.
1061
1062 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1063 Added consideration of the specific size of point symbols.
1064 The property for each point symbol is retrieved and the size applied
1065 for the rendering method.
1066 Added doc-string.
1067
1068 2004-11-16 Jan-Oliver Wagner <[email protected]>
1069
1070 Changed way of Extension Registry for gns2shp and profiling.
1071
1072 * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1073 __init__.py).
1074
1075 * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1076 of the actual gns2shp module.
1077
1078 * Extensions/profiling/profiling.py: Removed registry entry (moved to
1079 __init__.py).
1080
1081 * Extensions/profiling/__init__.py: Added registry entry and the importing
1082 of the actual profiling module.
1083
1084 2004-10-28 Bernhard Reiter <[email protected]>
1085
1086 * Extensions/svgexport/: Minor improvements to doc strings.
1087
1088 2004-10-07 Jan-Oliver Wagner <[email protected]>
1089
1090 Further elements for sizable point objects now
1091 making this feature usable though not yet complete.
1092
1093 * Thuban/Model/save.py (SessionSaver.write_classification): Write
1094 attribute 'size' for cldata when the shape layer is of point type.
1095 This also now make the test_load.py tests happy.
1096
1097 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1098 gradient.
1099
1100 * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1101 ID_SELPROP_SPINCTRL_LINEWIDTH.
1102 (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1103 (ID_SELPROP_SPINCTRL_SIZE): New Id.
1104 (SelectPropertiesDialog.__init__): Added a second spin control
1105 for the size in case the corresponding layer is of point type.
1106 (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1107 (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1108 (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1109 and refresh preview.
1110
1111
1112
1113 2004-10-04 Martin Schulze <[email protected]>
1114
1115 * Extensions/wms/test/test_parser.py
1116 (TestWMSCapabilitiesParser.test_compareLists): Added missing
1117 self-test for compareLists()
1118 (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1119 self-test for compareDicts()
1120 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1121 to verify the test routine fails with non-equal arguments
1122 (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1123 to verify the test routine fails with non-equal arguments
1124
1125 2004-10-03 Jan-Oliver Wagner <[email protected]>
1126
1127 First elements for sizeable point objects.
1128
1129 * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1130
1131 * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1132
1133 * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1134 of a corresponding argument is given.
1135 (TestSymbolSize): New. Test the size attribute of cldata.
1136
1137 * Thuban/Model/classification.py: Removed some trailing whitespaces.
1138 (ClassGroupProperties.__init__): Set default size.
1139 (ClassGroupProperties.SetProperties): Set the size.
1140 (ClassGroupProperties.GetSize): New. Return the size.
1141 (ClassGroupProperties.SetSize): New. Set the size.
1142 (ClassGroupProperties__eq__): Compare also size.
1143 (ClassGroupProperties__repr__): Print also size.
1144
1145 * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1146 the size attribute.
1147
1148 * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1149 Also, now there is a return value that indicates whether the drawing
1150 size exceeded the given rect extent and if so the new extent.
1151 Finally, point objects are drawn depending on the size. If either
1152 the width or height is exceeded, the new extent is returned.
1153 (ClassRenderer.Draw): Now when calling the previewer drawing function,
1154 evaluate the return value and, if not None, adapt the grid widget size
1155 accordingly and redraw again.
1156
1157 * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1158 If the draw function is for points, call it with the size as additional
1159 parameter.
1160 (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1161 the size. Compute the radius using the size.
1162
1163 * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1164 that Thuban supports size, apply this correctly.
1165
1166 * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1167
1168 2004-10-03 Jan-Oliver Wagner <[email protected]>
1169
1170 * Doc/manual/thuban-manual-de.xml: Started translation of
1171 Map chapter.
1172
1173 2004-10-01 Martin Schulze <[email protected]>
1174
1175 * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1176 argument for general use through properties-dialog selector
1177
1178 * Thuban/UI/classifier.py: Register properties dialog classes for
1179 both provided layer classes/types.
1180
1181 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1182 map can be retrieved through the parent which is passed to the
1183 constructor anyway and doesn't require an argument of its own,
1184 required for the unification of arguments for general use through
1185 properties-dialog selector.
1186 (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1187 whether a dialog is already opened (and raising it to the users
1188 attention) and creating a new dialog into a function of its own
1189 (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1190 method
1191 (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1192 global registration of properties dialog classes (which are indeed
1193 layer-specific).
1194
1195 * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1196 for general use through properties-dialog selector, the map can be
1197 retrieved through the parent and doesn't require an argument of
1198 its own.
1199
1200 * Extensions/wms/wms.py: Register the properties dialog class for
1201 the provided WMS layer
1202
1203 2004-09-28 Jan-Oliver Wagner <[email protected]>
1204
1205 New feature: Registry for Extensions.
1206
1207 * Thuban/UI/extensionregistry.py: This module defines a registry for
1208 Extensions.
1209
1210 * Thuban/UI/about.py (About.__init__): Added description
1211 of the registered extensions with all of the information.
1212
1213 * Thuban/Model/extension.py (Extension): Improved doc-string.
1214
1215 * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1216 Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1217 Extensions/wms/wms.py: Added registration of the extension.
1218
1219 2004-09-27 Bernhard Reiter <[email protected]>
1220
1221 More fixes to svgexport to make used ids unique and
1222 conforming to XML's Name production.
1223
1224 * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1225 test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1226 test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1227 Added Bernhard R. as author.
1228 * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1229 concatenation char now (makes test_make_ide_nosetbaseid() valid).
1230 Also transform second id part with "%d" and catch the TypeError
1231 to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1232 Corrected typo inBernhard's author line.
1233 (SetBaseID): Return the transformed base id. Transform characters
1234 which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1235 import binascii. If to be set string starts with "xml" or so, add "t".
1236 (draw_shape_layer_incrementally): use the returned value of SetBaseID
1237 for used_baseids checks.
1238
1239 2004-09-25 Bernhard Herzog <[email protected]>
1240
1241 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1242 Remove a debug print and some tab characters.
1243
1244 2004-09-25 Bernhard Reiter <[email protected]>
1245
1246 * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1247 (SetBaseID, SetID, make_id): Improved docstring comments to explain
1248 the interaction of the three functions and the XML id contrains.
1249
1250
1251 2004-09-23 Jan-Oliver Wagner <[email protected]>
1252
1253 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1254 Module.
1255
1256 * Doc/README: Added info on ThubanModel.xmi.
1257
1258 2004-09-23 Jan-Oliver Wagner <[email protected]>
1259
1260 * Doc/README: New. Some info about how to generate technical
1261 documentation from the source code.
1262 This text was send to the Thuban developer mailing list on
1263 September 21st 2004 by Bernhard Reiter.
1264
1265 2004-09-21 Bernhard Reiter <[email protected]>
1266
1267 Improved the svgexport to only use unique ids. Will issues
1268 an error message dialoge when two layer names are the same.
1269 ShapeIDs are now added with a dash within the svg ids.
1270
1271 * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1272 * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1273 (TestSVGRenderer): New test class with test_make_in() and
1274 test_check_for_layer_name_clash()
1275 * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1276 and draw_shape_layer_incrementally() to not use a baseid twice,
1277 satisfying test_check_for_layer_name_clash()
1278 (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1279 test_make_in().
1280 * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1281 and wxICON_HAND.
1282 (write_to_svg): Put dc and rendering in a try statement and on
1283 catching SVGmapWriterError notify the user and delete the target file.
1284
1285 2004-09-20 Bernhard Reiter <[email protected]>
1286
1287 * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1288
1289 2004-09-03 Jan Schüngel <[email protected]>
1290
1291 * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
1292 small bug with the line color. Now the line color will now only set
1293 if it is set in Thuban an not Transparent.
1294
1295 * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
1296 deleting the layers from mapfile. Now all layers will delete backwards
1297 from the last.
1298
1299 2004-08-20 Silke Reimer <[email protected]>
1300
1301 * Thuban/Model/layer.py:
1302 Fixes bug in projection handling: Otherwise very large region might not
1303 have valid values in the layer's projection.
1304
1305 2004-08-20 Silke Reimer <[email protected]>
1306
1307 * Thuban/UI/about.py:
1308 small changes to be consistent with coding style.
1309
1310 2004-08-13 Martin Schulze <[email protected]>
1311
1312 * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
1313 Adjusted a comment
1314
1315 2004-08-11 Silke Reimer <[email protected]>
1316
1317 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
1318 too many and too enhanced imports of locale
1319
1320 2004-08-10 Silke Reimer <[email protected]>
1321
1322 * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
1323 function unicodeToLocale() to convert special characters to users
1324 locale encoding
1325
1326 2004-08-10 Jan-Oliver Wagner <[email protected]>
1327
1328 * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
1329 lower case letter'
1330
1331 2004-08-09 Jan Schüngel <[email protected]>
1332
1333 * ChangeLog: Rewrite the last ChangeLog entry to follow
1334 the standard way.
1335
1336 * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
1337 the function where it is needed, because it don't works if it stands
1338 at the beginning.
1339 (MF_Layer.__init__): Removed the extra numclassed variable. Now
1340 numclasses from the mapscript will be used.
1341 (MF_Layer.get_index): New. Return the index of the layer in mapfile.
1342 (MF_Layer.set_classes): New. A Classlist will be set to the layer.
1343 (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
1344 (MF_Layer.remove_allclasses): New. All class of the layer will remove.
1345 (MF_Map.create_new_layer): New. A new Layer is created and associated
1346 with the mapscript object.
1347 (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
1348 the mapscript.
1349 (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
1350 linked to the layer in thuban, else the layerobject linked to the
1351 thubanlayer will be used.
1352 AnnotationLayer will now store the filename of the shapefile.
1353 (MF_Map.remove_layer): If a layer is removed the associated object
1354 must be set new.
1355
1356 * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
1357 layers which are exists in thuban to the mapobj. All removed Layers
1358 will be removed from the mapobj.
1359 Added comments to all functions.
1360 (thuban_to_map): No layer will be removed here.
1361
1362 * Extensions/umn_mapserver/mf_handle.py
1363 (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
1364 Layersettings for the mapserver kann be edited.
1365
1366 * Extensions/umn_mapserver/mf_import.py: Now all layers which are
1367 imported, will be linked with the associated MF_Layer.
1368 (import_mapfile): All layers, which are not selected, will be removed.
1369 Disable the "import layer from mapfile" menu option.
1370
1371 * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
1372 Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
1373 layer on permanently.
1374
1375 2004-08-03 Jan Schüngel <[email protected]>
1376
1377 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1378 New. This function removes all metadata
1379 (MF_Layer.set_group): New. Set the group setting.
1380 (MF_Layer.get_group): New. Get the group setting.
1381 (MF_Map): Removed the extra numlayers variable, used the mapscript
1382 parameter instead.
1383 (MF_Map.get_numlayers): New. This get numlayers.
1384 (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1385 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1386 if the object is an instance. Also added the annotation layer here to
1387 export, but only the layer is created in the mapfile.
1388
1389 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1390 the check if a mapobj exist, because its not needed anymore. The
1391 export function is only available if a mapobj exist.
1392 Use the new function to remove all layers.
1393
1394 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1395 option and the metadata button. The layer dialog is temporary disabled.
1396 (Metadata_CustomDataTable): Added some functions to show the grid
1397 correct.
1398
1399 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1400 the number of layer from import_mapfile to this function.
1401 (AnnotationLayer): New. This Class shows the Annotation layer in
1402 thuban. The layer don't do anything. It's only to show the layer
1403 and to save the layer order.
1404 (add_annotationlayer): New. Import an annotation layer to thuban.
1405 (select_layer2import): New. Import only layers to thuban and not
1406 the other settings like projection or scalebar.
1407 (create_new_mapfile): Moved the _has_umn_mapobj function and the
1408 create_new_mapfile functions from mf_handle.py to mf_import.py.
1409
1410 * Extensions/umn_mapserver/sample/iceland.map: Added the group
1411 parameter to the roads and cultural layers. Also added a new
1412 Annotation Layer for the cultural points.
1413
1414 * Extensions/umn_mapserver/sample/iceland.html: Added the select
1415 option for the annotation layer.
1416
1417 * Extensions/umn_mapserver/sample/index.html: Added the start
1418 parameter for the annotation layer.
1419
1420 2004-08-01 Jan-Oliver Wagner <[email protected]>
1421
1422 * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1423 translation completed.
1424
1425 * Doc/manual/thuban-manual.xml (Chapter Session Management):
1426 Fixed unprecise description for Save Session.
1427
1428 2004-07-31 Jan-Oliver Wagner <[email protected]>
1429
1430 Started translation of Users Manual into german.
1431
1432 * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1433
1434 * Doc/manual/Makefile: Added build instructions for german
1435 users manual.
1436
1437 * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1438
1439 2004-07-28 Jan Schüngel <[email protected]>
1440
1441 * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1442 functions. Now all metadata will handle by the function and its not
1443 needed to initialize it from outside. Therefor the associated mapobj
1444 will be stored in the Metadata Object. So we can use the special
1445 functions from the associated mapobj to get the Metadata.
1446 Therefor all initialization code for the metadata is removed from the
1447 other classes.
1448 (MF_Layer): Added a function to get the metadata object.
1449 (MF_Map): Added a function to set the mappath, the path where
1450 the mapfile ist stored.
1451
1452 * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1453 to set the extent in the mapfile. Now the code is set by the displayed
1454 data in the Thuban-view.
1455 (export_mapfile): The shapepath is now set empty, until relative
1456 pathnames are supported.
1457
1458 * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1459 metadata. Yet only mapfile metadata are supported. Layer and class
1460 supported are not implemented.
1461 Added a dialog to handle layer informations. The dialog only shows the
1462 selected layer at the moment.
1463
1464 * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1465 code for setting the extent in thuban. Now the extent is set to the
1466 given extent from the mapfile.
1467 Fixed a logical mistake. Now the extent is set when realy a layer is
1468 loaded, and not if one is selected to load.
1469
1470 * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1471 move the shown map in the browser.
1472
1473 * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1474 line to the mapobj and added metadata to the political layer.
1475
1476 * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1477 for Metadata.
1478
1479 2004-07-26 Martin Schulze <[email protected]>
1480
1481 * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1482 ClassMapper
1483
1484 * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1485 case for the new ClassMapper
1486
1487
1488 2004-07-22 Bernhard Herzog <[email protected]>
1489
1490 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1491 visible extent of the map in projected coordinates
1492
1493 * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1494 (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1495 tests.
1496 (SimpleViewPortTest.test_visible_extent): New. The real test for
1497 VisibleExtent()
1498
1499 2004-07-22 Bernhard Herzog <[email protected]>
1500
1501 * test/test_viewport.py: Use support.run_tests as the main
1502 function when running asa script.
1503
1504 2004-07-22 Jan Schüngel <[email protected]>
1505
1506 * Extensions/umn_mapserver/mf_export.py: Added "import os"
1507 Removed the old "import Thuban.UI.mainwindow" code.
1508 (tbextent_to_map): Removed the extra function and at the code direct
1509 to "thuban_to_map" function.
1510 (write_creatorcomment): Added. Now a short comment is added to the
1511 beginning of an generated mapfile.
1512 (export_mapfile): Now the Path and filename are saved in to variables,
1513 and not together in one variable. This is needed for the new
1514 write_creatorcomment function.
1515
1516 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1517 import module "re". Also added Range and the ClassGroupRange import
1518 from Thuban. Both are needed for the new range expression import.
1519 (create_rangeexpression): Added. Creates a Range Expression in Thuban
1520 style from a given mapfile expression.
1521 (added_rasterlayer): Make some small code changes. The shapepath is
1522 now stored in an extra variable and the clazz_name is set empty if no
1523 class name set in the mapfile.
1524 Changed the Error message for Range Expressions, becaus the new
1525 function create a error string which will be shown in the dialog.
1526
1527 * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1528 range expression import.
1529
1530 2004-07-21 Jan-Oliver Wagner <[email protected]>
1531
1532 * Extensions/umn_mapserver/README: Added hint that
1533 installation as root can be avoided. Removed all tabs.
1534
1535 2004-07-16 Bernhard Herzog <[email protected]>
1536
1537 * test/test_viewport.py
1538 (ViewPortTest.test_changing_map_projection): Check that changing
1539 the projection of an empty map shown in a viewport doesn't lead to
1540 exceptions in the viewport's handler for the
1541 MAP_PROJECTION_CHANGED messages
1542
1543 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1544 try to keep the same region visible when the map actually contains
1545 something
1546
1547 2004-07-15 Jan Schüngel <[email protected]>
1548
1549 * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1550 mappath directly from the mapobj. Is needed because of the changes
1551 in mf_import.py.
1552 (MF_Layer.add_thubanclass): Added a new comment.
1553 (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1554 mapobj is empty there is no extent get from thuban an so no one can
1555 set to th mapobj.
1556
1557 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1558 the discription.
1559 Split the funktion in to three smaller ones. The new functions are
1560 add_rasterlayer, add_polygonlayer and select_layer2import.
1561 Removed the mapfilepath and filepath initialisation, because its know
1562 include in the new functions.
1563 Now nothing will be imported if cancel is pressed in the
1564 layer choice dialog.
1565
1566 2004-07-14 Jan Schüngel <[email protected]>
1567
1568 * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1569 import.
1570 (MF_Symbolset): Removed the extra variable for numsymbols.
1571 (MF_Class.__init__): Added a comment to the exception clause.
1572 Removed the extent init, because it was not needed anymore.
1573 (MF_Layer.add_thubanclass): Added the code to set the class name to
1574 the expression value from thuban if no label is defined.
1575 Added the code to export Range expressions from thuban to the mapfile.
1576 (MF_Map.set_extent): Removed the exception and replace it by some if
1577 code. If the size of a map is not defined the size will be set to 1,1.
1578 This is necessary because if the extent is set, mapscript checks if
1579 the size is greater than zero.
1580 (MF_Web): Added the get and set function for the template.
1581
1582 * Extensions/umn_mapserver/mf_export.py: Added the function to check
1583 if a mapobject exists and used it to set the status of the menu items.
1584 If no mapfile exists the settings could not be edditied.
1585 Define after which menuitem the exportitem will include.
1586
1587 * Extensions/umn_mapserver/mf_handle.py: Removed the import
1588 Thuban.UI.mainwindow clause, because it is not needed.
1589 Added the command Refresh() to all "OnChangeColor()" functions,
1590 because the color preview window was not updated on a color change.
1591 Added the function to check if a mapobject exists and used it to set the
1592 status of the menu items. If no mapobject exists the settings could not
1593 be edditied.
1594 (Map_Dialog): Moved the imagetype selector from the
1595 Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1596 (Web_Dialog): Removed the name label and added the template textbox.
1597
1598 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1599 the exception handling on loading the layers by an if statement. It
1600 is not necessary to us the exception there.
1601 The Filepath creation now use os.path.join to build the path.
1602
1603 * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1604 definition from global to the setUp function. Now the testMap will
1605 initialize new on each test.
1606
1607 * Extensions/umn_mapserver/sample/iceland.map: Include three new
1608 classes in the Line Layer, to test logical Expressions.
1609 Set the status of the class "Point9" in the Point Layer to off
1610
1611 2004-07-13 Bernhard Herzog <[email protected]>
1612
1613 * Thuban/UI/baserenderer.py
1614 (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1615 optimization that tries not to draw layers under a raster layer.
1616 The bug was harmless. All it effectively did was to produce The a
1617 strange messages about not being able to draw Layer instances for
1618 all vector layers below a raster layer which would be invisible
1619 anyway because the raster layer currently always covers the entire
1620 window
1621
1622 2004-07-08 Jan Schüngel <[email protected]>
1623
1624 * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1625 a list of supported outputformats. This formats are not alle supported
1626 because there is no possibility to get the outputformat without the
1627 name known. Make some formal changes to the code.
1628 (MF_Map.set_name()): Fixed a bug if the name is None.
1629
1630 * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1631 statement, because its not needed anymore. The Outputformat is now
1632 given as string from the object. Make some formal changes to the code.
1633
1634 * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1635 most of the new setting which were added during the last changes.
1636 Removed the MF_Size Test.
1637
1638 * Extensions/umn_mapserver/test/test.map: Added a new class to the
1639 cultural Layer to test expressions and the the status of that layer
1640 from on to default.
1641 Changed the data path the the correct Thuban Data
1642 Added the Outputformat Object and Symbol Object
1643
1644 2004-07-07 Jan Schüngel <[email protected]>
1645
1646 * Extensions/umn_mapserver/mapfile.py: Added some new
1647 settings to edit (outputformat, label, imagetype)
1648
1649 * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1650 the Label Dialog and add the OutputDialog.
1651 Make some changes to the code order.
1652
1653 2004-07-06 Jan Schüngel <[email protected]>
1654
1655 * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1656 and line Obj and add the scalebar_status_type, scalebar_style_type and
1657 scalebar_position_type.
1658 Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1659 are only used to create a Symbol like the circle in Thuban.
1660 Added the scalebarObject (MF_Scalebar)
1661 (MF_Class): Added set_status and get_status.
1662 (MF_Layer.add_thubanclass): Added code to set the class status
1663 (MF_Map): Added code to handle the symbols and scalebar
1664 (MF_Label): Added the set_partials and get_partials functions
1665
1666 * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1667 from mapfile. Added a function to create a circle object like the one
1668 from thuban if no one exists.
1669
1670 * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1671 press ok in the assosiated dialog and not at the end of the
1672 colordialog.
1673 Added the Dialog for the Scalebar.
1674 (Label_Dialog): Added the offset option
1675
1676 * Extensions/umn_mapserver/mf_import.py: Added code to import the
1677 status of the Classes.
1678 Fixed a bug with the projection. Now the to_meter parameter will be
1679 added to the Projection only if it doesn't exists.
1680
1681 2004-07-01 Jan Schüngel <[email protected]>
1682
1683 Added the functionality to handle the content thuban is not
1684 able to handle directly.
1685
1686 * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1687 Thuban with the possibility to edit the mapfile content.
1688
1689 * Extensions/umn_mapserver/mf_import.py: Added the possibility
1690 to import mapfiles without any layer selected. So it is possible
1691 to edit the other settings in a mapfile.
1692 (import_mapfile): Added code to use the editing functions.
1693 Added the possibility to import the projection to a layer if one
1694 is defined.
1695 Status settings (On,Off) will now set in thuban (visible, invisible).
1696 fixed a bug with with classnames. If no classname is set in mapfile
1697 the value in Thuban will set to the expression.
1698
1699 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1700 possibility to save a new mapfile or use the old one which is
1701 imported or new created.
1702 Added code to use the editing functions.
1703 Remove some not needed import statements
1704
1705 * Extensions/umn_mapserver/mapfile.py: Added new types which are
1706 need for the editing functions.
1707 Added needed set-functions for the editing functions.
1708 Added the possibility to export rasterimages.
1709 Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1710 MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1711 moment.
1712 (MF_Class.set_thubanstyle): Now point layers will set to a default
1713 symbol to show a circle in mapserver and not only a 1px dot.
1714 (MF_Style.__init__): Fixed a bug with the color. Color was not set
1715 correct before.
1716 (MF_Size): Removed, because it is not needed.
1717
1718 * Extensions/umn_mapserver/README: Added the hints to use the
1719 export and editing functions, too.
1720
1721 * Extensions/umn_mapserver/sample/iceland.map: Added the
1722 new parameter "UNITS METERS".
1723 Change the political layer to status OFF.
1724
1725 * Extensions/umn_mapserver/sample/README: Added some
1726 more details to setup the sample in the MapServer.
1727
1728 2004-06-26 Bernhard Reiter <[email protected]>
1729
1730 * Extensions/svgexport/test/test_svgmapwriter.py:
1731 Removed class VFile and used standard StringIO instead.
1732
1733 2004-06-23 Jan Schüngel <[email protected]>
1734
1735 Add the export function to the umn_mapserver extension.
1736
1737 * Extension/umn_mapserver/mf_export.py: New. This module extents
1738 Thuban with the possibility to export the Thuban content.
1739
1740 * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1741 with the export module. Especially added the possibility to
1742 add thuban objects directly to the map objects.
1743
1744 * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1745 because of the hint from Bernhard Herzog.
1746 Corrected the handling of absolute pathnames.
1747 Changed the Text of the Menu-Item, now the beginning is upper case.
1748
1749 * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1750
1751 2004-06-16 Jan Schüngel <[email protected]>
1752
1753 Add a sample and make some changes.
1754
1755 * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1756 import from * to explicit used statements. Changed the
1757 Thuban.UI.mainwindow import phrase, too.
1758 (import_mapfile):Corrected a clerical mistake.
1759 Added wxCHANGE_DIR in OpenFile Dialog.
1760 Added a MultipleChoiceDialog, to select the layers to load from
1761 mapfile into thuban. Thereby the projection is only set if one layer
1762 is selected.
1763 Added the possibility to handle relative pathnames which uses
1764 up-level references.
1765 Removed some doubled code.
1766 Corrected an error with integer values used as label in thuban
1767 ClassGroup.
1768
1769 * Extensions/umn_mapserver/sample: New.
1770
1771 * Extensions/umn_mapserver/sample/README: New. Describes the
1772 usage of the sample files.
1773
1774 * Extensions/umn_mapserver/sample/iceland.map: New. This is
1775 a suitable .map-file for the iceland data.
1776
1777 * Extensions/umn_mapserver/sample/index.html: New. The template
1778 for the mapfile.
1779
1780 * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1781 file for the Iceland Application on web.
1782
1783 * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1784 some details.
1785
1786 * Extensions/umn_mapserver/test/test_mapserver
1787 (mapserver_import_Test_generalClasses.test_MF_Color):
1788 Corrected the thubancolor test.
1789
1790 2004-06-15 Jan Schüngel <[email protected]>
1791
1792 * Extensions/umn_mapserver/README: New. Install instruction.
1793
1794 2004-06-14 Bernhard Reiter <[email protected]>
1795
1796 * libraries/thuban/cpl_mfile.h: Added copyright header.
1797
1798 * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1799 Free Software License so that it is most useful with gdalwarp
1800 and bmpdataset.
1801
1802 2004-06-14 Bernhard Herzog <[email protected]>
1803
1804 * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1805 import of wxPython.wx itself (as opposed to the contents of
1806 wxPython.wx). For some reason wxPython.wx is available as
1807 wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1808 wrt. wxPython 2.4.
1809
1810 2004-06-10 Jan Schüngel <[email protected]>
1811
1812 Initial version of new extension "umn_mapserver". This extension aims
1813 to manage configuration for the UMN MapServer application. This
1814 inital version just imports the .map-files and displays all, Thuban is
1815 capable of.
1816
1817 * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1818
1819 * Extensions/umn_mapserver/test/README: New. Describes how to run the
1820 tests.
1821
1822 * Extensions/umn_mapserver/test/test.map: New. This is a test
1823 .map-file for automated tests of the umn_mapserver extension of
1824 Thuban.
1825
1826 * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1827 UMN Mapserver classes.
1828
1829 * Extensions/umn_mapserver/__init__.py: New. Init to make this
1830 directory a package.
1831
1832 * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1833 '.map'-file objects.
1834
1835 * Extensions/umn_mapserver/mf_import.py: New. This module extends
1836 Thuban with the possibility to handle UMN MapServer mapfiles.
1837
1838 2004-06-03 Bernhard Herzog <[email protected]>
1839
1840 * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1841 to a tuple before using it as arguments to the % operator. This
1842 fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1843 reported today on thuban-list by Jan Schüngel
1844
1845 * test/test_layer.py (TestLayerModification.setUp): Save the
1846 filename as an instance variable so we can refer to it in tests
1847 (TestLayerModification.test_tree_info): Uncomment this method
1848 again and make it work. This tests for the formatting issue
1849 filed in RT#2239 on 2004-01-13
1850
1851 2004-05-28 Bernhard Herzog <[email protected]>
1852
1853 * Thuban/UI/baserenderer.py: Fix some typos.
1854
1855 2004-05-18 Jan-Oliver Wagner <[email protected]>
1856
1857 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1858 by increasing a field size.
1859
1860 2004-05-17 Bernhard Herzog <[email protected]>
1861
1862 Update to newest shapelib and get rid of Thuban specific
1863 extensions, i.e. use the new DBFUpdateHeader instead of our
1864 DBFCommit kludge
1865
1866 * libraries/shapelib/shpopen.c: Update to version from current
1867 shapelib CVS.
1868
1869 * libraries/shapelib/shapefil.h: Update to version from current
1870 shapelib CVS.
1871
1872 * libraries/shapelib/dbfopen.c: Update to version from current
1873 shapelib CVS.
1874 (DBFCommit): Effectively removed since shapelib itself has
1875 DBFUpdateHeader now which is better for what DBFCommit wanted to
1876 achieve.
1877 We're now using an unmodified version of dbfopen.
1878
1879 * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1880 value '1' to the Lib.dbflibc extension. This simply reflects the
1881 shapelib and pyshapelib updates
1882
1883 2004-05-16 Jan-Oliver Wagner <[email protected]>
1884
1885 Finished introduction of Menu.FindOrInsertMenu.
1886
1887 * Extensions/drawshape/drawshape.py: Add the command
1888 to the experimental menu additionally to the toolbar.
1889
1890 * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1891 finding menu on its own.
1892
1893 * Doc/manual/thuban-manual.xml: updated sample file
1894 to use FindOrInsertMenu().
1895
1896 * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1897 instead of finding menu on its own.
1898
1899 2004-05-11 Jan-Oliver Wagner <[email protected]>
1900
1901 * test/test_menu.py (MenuTest.test): Added testing
1902 of method Menu.FindOrInsertMenu.
1903
1904 2004-05-10 Jan-Oliver Wagner <[email protected]>
1905
1906 Introduce and use Menu.FindOrInsertMenu.
1907
1908 * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1909 given menu or, if not found, insert it.
1910
1911 * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1912 /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1913 /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1914 menu on its own.
1915
1916 2004-05-06 Jan-Oliver Wagner <[email protected]>
1917
1918 Introduce a abstract ColorDialog class and remove
1919 and outdated file.
1920
1921 * Thuban/UI/proj4dialog.py: Removed. It is has been
1922 replaced by projdialog for quite a while and is not used
1923 anymore.
1924
1925 * Thuban/UI/colordialog.py: New. Abstraction for color selection
1926 dialog(s).
1927
1928 * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1929 Now calls the abstract ColorDialog instead of wxColourDialog.
1930 This also removed the dependency to Color class conversion
1931 from this function.
1932
1933 2004-05-04 Frank Koormann <[email protected]>
1934
1935 * Extensions/bboxdump/__init__.py: Fixed string left over from
1936 copying.
1937
1938 * Extensions/bboxdump/bboxdump.py (bboxdump):
1939 Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1940 xrange(layer.NumShapes()). Compile the bboxmessage from a list
1941 of formatted outputs (string.join) instead of appending to the
1942 message. Two progress bar dialogs to report progress on the sometimes
1943 lenghty processing.
1944
1945 2004-04-22 Frank Koormann <[email protected]>
1946
1947 New Extension to dump bounding boxes of all shapes of the selected
1948 layer. An optional column can be specified to group the objects,
1949 in this case the bounding box is a union of the separate boxes.
1950 Dump can be displayed in a ScrolledMessageDialog or written to file.
1951 The Extension is simply a combination of available and well tested
1952 Thuban functionality.
1953
1954 * Extensions/bboxdump/__init__.py: New: Init to make this
1955 directory a package.
1956
1957 * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1958 all shapes of the selected layer.
1959
1960 2004-04-22 Jan-Oliver Wagner <[email protected]>
1961
1962 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1963 strings to be i18n now.
1964
1965 2004-04-18 Jan-Oliver Wagner <[email protected]>
1966
1967 Changing popup menu of legend from direct building
1968 to using the Menu construction as used for the mainwindow.
1969
1970 * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1971 layer_to_bottom, layer_visibility
1972 (MainWindow.LayerToTop): New. Put current layer to the top.
1973 (MainWindow.LayerToBottom): New. Put current layer to bottom.
1974 (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1975 Replace 1,0 by True, False.
1976 (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1977 current layer.
1978 (MainWindow.LayerShowTable): Removed raising of dialog.
1979 (_has_selected_layer_visible): New. Support function.
1980
1981 * Thuban/UI/legend.py: ID_POP_xxx: removed.
1982 (LegendPanel.__init__): Removed EVT_MENU bindings.
1983 (LegendTree._OnRightClick): Replace direct creation of
1984 menu via wx Classes by applying the menu definition
1985 as of Menu class of menu.py.
1986
1987 2004-04-16 Jan-Oliver Wagner <[email protected]>
1988
1989 * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1990 button string to stronger clearify that Thuban will be closed when hitting
1991 the button.
1992
1993 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1994 Now for layers without a ShapeStore a corresponding message is given
1995 to the user, that this layer has no table to show.
1996
1997 2004-04-15 Martin Schulze <[email protected]>
1998
1999 * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2000 recalculate the format for the internal render engine as well.
2001
2002 * Extensions/wms/properties.py (wmsProperties): First start for a
2003 properties dialog. It's functional for a first selection of
2004 layers, but still has some weired wxWidgets/GTK problems but
2005 beautification can be done later.
2006
2007 * Extensions/wms/layer.py: Added more documentation
2008 (WMSLayer.getFormats): New: Return list of supported image formats
2009 by the WMS server
2010 (WMSLayer.getLayers): New: Return the list of layer names
2011 supported by the WMS server
2012 (WMSLayer.getLayerTitle): New: Return the title of the named layer
2013 (WMSLayer.getWMSFormat): New: Return the image format that is used
2014 for WMS GetMap requests
2015 (WMSLayer.setWMSFormat): New: Set the image format that is used
2016 for WMS GetMap requests
2017 (WMSLayer.__init__): Move away from using only one layer to using
2018 a list of layers (unsorted at the moment, though).
2019 (WMSLayer.getVisibleLayers): New: Return the list of names for all
2020 visible layers
2021 (WMSLayer.setVisibleLayers): New: Set the list of names for all
2022 visible layers
2023
2024 * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2025 order to establish a clean structure.
2026
2027 * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2028 own in order to establish a clean structure.
2029
2030 2004-04-13 Martin Schulze <[email protected]>
2031
2032 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2033 support for oldstyle (WMS 1.0 apparently) image format
2034 specification.
2035
2036 * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2037 supported graphic formats back to JPEG and BMP, PNG and others are
2038 too *cough* experimental... Sorry, I meant to filter this out
2039 before I committed this part. This should make the WMS extension
2040 run from CVS again.
2041 (wms_dialog): Reset an empty URL to None so that the subsequent
2042 program can depend on this, since the dialog will indeed return an
2043 empty URL, causing another declaration of love by Python.
2044
2045 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2046 Whenever a native BoundingBox request cannot be fulfilled, check
2047 whether the requested SRS is EPSG:3426, in which case return the
2048 LatLonBoundingBox values.
2049
2050 * Extensions/wms/test/test_parser.py
2051 (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2052 ignoring AUTO:* SRS.
2053 (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2054 Added another test method to test whether the LatLonBoundingBox
2055 values will be returned if BoundingBox values are requested with
2056 SRS set to EPSG:3426.
2057
2058 * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2059 Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2060 the moment by placing them into a variable which is currently
2061 unused. Also test whether the EPSG SRS is numerical as it should
2062 be and add an error message if it is not.
2063
2064 * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2065 appear in the real world as well. Since we cannot handle them yet
2066 (OGCLib can't either), we will ignore them for the moment.
2067
2068 * Extensions/wms/parser.py: Use a variable for denoting the sample
2069 filename
2070 (WMSCapabilitiesParser.peekLayers): Added support for error
2071 messages during grok(). They will be aggregated in an array and
2072 may be displayed later. We may have to add a classification
2073 "Warning" and "Error" to this. That requires more experience,
2074 though, since not every error may be lethal.
2075
2076 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2077 ShowTable() dialog/frame when the user attempts to display it
2078 while it has been opened before already and not closed again.
2079
2080 2004-04-11 Martin Schulze <[email protected]>
2081
2082 * Extensions/wms/infodialog.py: Adjusted the class documentation
2083
2084 * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2085 Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2086 wxWidgets variants.
2087 (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2088
2089 * Extensions/wms/infodialog.py: Added an information dialog that
2090 will display various information about the WMS current resource,
2091 so that additional information such as the title, the abstract,
2092 fees and access constraints can be displayed for the user if they
2093 are documented in the WMS XML.
2094
2095 2004-04-10 Martin Schulze <[email protected]>
2096
2097 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2098 string handling. It's "foo".lower() and not lower(foo) without
2099 lower imported from strings or something.
2100
2101 * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2102 from capabilities.py and parser.py. Implement priority list for
2103 supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2104 and GIF are supported here, but not yet by main Thuban. Hence,
2105 support for them may be removed later. Special contribution to
2106 usability: get wxWidgets to change the cursor when we're waiting
2107 for data from the network so the user won't start to worry. This
2108 causes a redrawing error/warning, though.
2109
2110 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2111 the DOM object.
2112
2113 2004-04-01 Martin Schulze <[email protected]>
2114
2115 * Extensions/wms/capabilities.py: Adjusted documentation
2116 (WMSCapabilities.__init__): Improved documentation, fixed syntax
2117 (WMSCapabilities.saveCapabilities): Only catch IOError when
2118 handling files
2119 (WMSCapabilities.loadCapabilities): Only catch IOError when
2120 handling files
2121 __main__: corrected variable naming
2122 (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2123 class a specialisation of WMSCapabilitiesParser as well. Also
2124 execute grok() after loading or fetching capabilities, if that
2125 went well, so that subsequent calls can already access the data.
2126 (WMSCapabilities.getVersion): Export the used version of the
2127 GetCapabilities request, so we can use it for subsequent calls,
2128 i.e. for GetMap requests.
2129 (WMSCapabilities.fetchCapabilities): Added proper error handling
2130 when the GetCapabilities request failed, so that the surrounding
2131 program can act accordingly.
2132
2133 2004-03-30 Martin Schulze <[email protected]>
2134
2135 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2136 Adjusted the getLayerSRS method to return the list of SRSes
2137 extracted from <SRS> elements instead of <BoundingBox> elements.
2138 Added a bit of documentation as well.
2139 (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2140 since it was only implemented due to a misunderstanding.
2141
2142 * Extensions/wms/test/test_parser.py
2143 (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2144 reflect the corrected interpretation of the standard: i.e. a layer
2145 does not have to define a BoundingBox for all SRSes it supports.
2146 Hence the <SRS></SRS> specification is authoritative, not the list
2147 of BoundingBoxes.
2148 (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2149 to ensure None is returned for a non-existing SRS.
2150 (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2151 since it is not applicable anymore. Listing more SRSes in <SRS>
2152 elements is valid according to the specs.
2153
2154 2004-03-26 Bernhard Reiter <[email protected]>
2155
2156 * README: Nicer formatting of text. Improved descriptions.
2157 Reflected wxWidgets name change.
2158
2159 * Thuban/UI/about.py: Extended copyright to 2004 and added
2160 information about the thuban-devel mailinglist.
2161
2162 2004-03-24 Martin Schulze <[email protected]>
2163
2164 * Extensions/wms/capabilities.py: Renamed the class to contain
2165 'WMS', also added a linebreak where required
2166
2167 * Extensions/wms/parser.py: Finally added the XML parser for the
2168 GetCapabilities response.
2169
2170 * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2171 <SRS> elements match the <BoundingBox> elements, except for the
2172 layer 'beschriftung'.
2173
2174 * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2175 since Python uses unicode strings internally, otherwise
2176 comparisons will fail. Removed tests for getLayerBBoxSRS() since
2177 the SRS will be calculated anyway and this method is obsoleted by
2178 getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2179 Move loading the sample file into the setUp method. Added a test
2180 for finding the integrity problem in the sample response.
2181 Improved formatting.
2182
2183 * Extensions/wms/domutils.py: Added convenience routines for
2184 handling of Document Object Model (DOM) nodes.
2185
2186 * Extensions/wms/test/test_domutils.py: Added a test for the
2187 domutils module
2188
2189 2004-03-19 Martin Schulze <[email protected]>
2190
2191 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2192 Moved path detection and adding into a module of its own,
2193 adjustpath, which exports thubandir as main Thuban directory.
2194
2195 * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2196 detection and adding into a module of its own, adjustpath, which
2197 exports thubandir as main Thuban directory. Reorganised the
2198 module in order to support the SkipTest feature for Thuban test
2199 cases.
2200
2201 * Extensions/wms/test/adjustpath.py: Moved path detection and
2202 adding into a module of its own.
2203
2204 2004-03-18 Martin Schulze <[email protected]>
2205
2206 * Extensions/wms/test/test_parser.py: Added another test for
2207 checking whether the WMS XML parser (to be implemented) returns
2208 the information we expect. This requires a sample WMS WML file
2209 (sample.xml) which has been extracted from the frida server and
2210 "improved" manually.
2211
2212 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2213 main Thuban directory to the path in order to be able to import
2214 random modules. Adjusted the PyOGCLib detection to reuse the
2215 information gathered. Also added a note about the PYTHONPATH
2216 environment variable.
2217
2218 * Extensions/wms/test/test_ogclib.py: The format specification is
2219 a mime-type, not a graphic format, hence image/jpeg wou ld be the
2220 proper format and not JPEG. We'll also have to take care of the
2221 encoding of / as %2F.
2222
2223 2004-03-16 Martin Schulze <[email protected]>
2224
2225 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2226 comprehensive test for the getMapURL method, built compare URLs
2227 according to the documentation in OGC 01-068r3
2228
2229 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2230 class WMSCapabilities to manage capabilites, will incorporate
2231 parsing the capabilities response and provide details for other
2232 classes.
2233
2234 2004-03-12 Bernhard Herzog <[email protected]>
2235
2236 Support views in addition to normal tables in the postgis
2237 shapestore
2238
2239 * Thuban/Model/postgisdb.py
2240 (PostGISShapeStore._fetch_table_information): Add a fallback for
2241 the case where the table name is not in the geometry_columns
2242 table. This is usually the case for views. Also, set
2243 self.shapestore here.
2244 (PostGISShapeStore.ShapeType): No need to query the database all
2245 the time. The shape type is now determined in
2246 _fetch_table_information
2247
2248 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2249 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2250 New parameter to specify views.
2251 (PostGISDatabase.has_data): Also compare the views. New views
2252 parameter
2253 (PostGISDatabase.initdb): Create the views.
2254 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2255 view
2256
2257 * test/test_postgis_db.py
2258 (TestPostGISShapestorePointFromViews): New. Test a
2259 PostGISShapeStore with a view
2260 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2261 the geometry_column explicitly to test whether that works
2262
2263 2004-03-12 Bernhard Herzog <[email protected]>
2264
2265 Final step for explicit id/geometry columns: Loading and saving
2266
2267 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
2268 with the following changes:
2269 (dbshapesource): Two new attributes id_column and geometry_column
2270
2271 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2272 (SessionSaver.write_session): Use the new namespace
2273 (SessionSaver.write_data_containers): Write the new dbshapesource
2274 parameters
2275
2276 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2277 the new file format version
2278 (SessionLoader.start_dbshapesource): Handle the new db parameters
2279
2280 * test/test_save.py: Update to the new dtd and namespace
2281 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2282 mock object to provide a working IDColumn method.
2283
2284 * test/test_load_1_0.py: New. Copy of the test_load.py before
2285 today's changes but with the round-trip tests removed.
2286
2287 * test/test_load_0_9.py: Update doc-string.
2288
2289 * test/test_load.py: Update all .thuban files to the new dtd and
2290 namespace.
2291 (TestPostGISLayer.file_contents): Add the new dbshapesource
2292 paramters
2293
2294 2004-03-11 Bernhard Herzog <[email protected]>
2295
2296 Next step for explicit id/geometry columns: User interaction
2297
2298 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
2299 the dialog is constructed. Add combo boxes to select id and
2300 geometry column. Rename some instance variables.
2301 (ChooseDBTableDialog.GetTable): Return id and geometry column
2302 names
2303 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
2304 selections in the table list
2305
2306 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
2307 and geometry_column
2308
2309 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
2310 parameters for id_column and geometry column of PostGISShapeStore
2311 here as well.
2312
2313 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
2314 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
2315 (PostGISConnection.GeometryTables): Use a better query to
2316 determine which relations in the database might be usable for
2317 shapestores. Now supports views as well but is more PostgreSQL
2318 specific
2319 (PostGISConnection.table_columns): New. Somewhat experimental
2320 method to let the db dialogs provide lists of columns to users so
2321 that they can select id and geometry columns.
2322 (PostGISTable.__init__): The default value of the id_column
2323 parameter is now None it still means "gid" effectively, though.
2324 (PostGISTable.IDColumn): New introspection method to return a
2325 column object for the id column
2326 (PostGISShapeStore.GeometryColumn): New introspection method to
2327 return a column object for the geometry column
2328
2329 * test/test_postgis_db.py
2330 (TestPostGISConnection.test_gis_tables_non_empty):
2331 Removed. Subsumed by the new:
2332 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
2333 New. Tes the GeometryTables and table_columns methods with actual
2334 tables and views.
2335 (PointTests.test_id_column, PointTests.test_geometry_column):
2336 New. tests for the new methods.
2337 (TestPostGISShapestorePoint.setUp)
2338 (TestPostGISShapestorePointSRID.setUp)
2339 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
2340 instance variables needed by the new tests
2341
2342 2004-03-11 Bernhard Herzog <[email protected]>
2343
2344 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
2345 numbers given to ReadValue are ordinals.
2346
2347 2004-03-11 Bernhard Herzog <[email protected]>
2348
2349 Elimiate the requirement for PostGIS tables to have a column
2350 called "gid".
2351
2352 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
2353 id_column to specify which column to use to identify rows. Also
2354 new instance variables id_column and quoted_id_column
2355 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
2356 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
2357 (PostGISTable.SimpleQuery): Use the id column name provided to the
2358 constructor instead of "gid"
2359 (PostGISShapeStore.__init__): New parameter id_column analogously
2360 to PostGISTable.__init__. This parameter is simply passed through
2361 to the base class constructor
2362 (PostGISShapeStore._create_col_from_description): Fix typo in
2363 doc-string
2364 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
2365 (PostGISShapeStore.ShapesInRegion): Use the id column name
2366 provided to the constructor instead of "gid"
2367
2368 * test/postgissupport.py
2369 (PostgreSQLServer.get_default_static_data_db): New static table
2370 landmarks_point_id with an id column != "gid. Update the comments
2371 a bit.
2372 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
2373 doc-
2374 (upload_shapefile): New parameter gid_column to use a name other
2375 than "gid" for the column to store the shape ids
2376
2377 * test/test_postgis_db.py (TableTests): New. Mixin-class
2378 containing all tests previously in TestPostGISTable. The actual
2379 tests are the same but the code is a bit more configurable to
2380 allow for different id columns etc.
2381 (TestPostGISTable): Derive from TableTests now for the actual
2382 tests.
2383 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2384 except that it the landmarks_point_id table to test the id_column
2385 parameter
2386 (PointTests): Extend the doc-string
2387 (TestPostGISShapestorePointExplicitGIDColumn)
2388 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2389 from PointTests to test the explicit id_column parameter. One
2390 tests with the name of the column holding the shape ids, the other
2391 uses PostgreSQL's OID column. For the latter a number of methods
2392 have to be overwritten to make them independent of the actual id
2393 values.
2394
2395 2004-03-08 Silke Reimer <[email protected]>
2396
2397 Update debian directory:
2398
2399 * debian/changelog: Added new version.
2400 * deiban/rules: Updated management of patches (with cbds)
2401 * debian/control: Added cbds to dependencies
2402 * debian/patches/*: New. Adds better support for patches of thuban in
2403 debian
2404 * debian/menu: Syntax of menu changed slightly
2405 * debian/setup.py.patch: removed because it has been moved to
2406 debian/patechs/setup.py.patch
2407
2408
2409 2004-02-26 Bernhard Herzog <[email protected]>
2410
2411 Create the Doc/technotes directory for text files with information
2412 for developers
2413
2414 * Doc/technotes/README: New. README for the technotes
2415
2416 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2417 Thuban
2418
2419 * Doc/technotes/release_process.txt: New. Used to be
2420 HOWTO-Release. Now slightly adapted to technote formatting style.
2421
2422 * HOWTO-Release: Removed. It's contents are now in
2423 Doc/technotes/release_process.txt
2424
2425 2004-02-25 Bernhard Herzog <[email protected]>
2426
2427 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2428 version of wxWindows the module was compiled with so we can check
2429 that against the wxPython version.
2430
2431 * Thuban/version.py (thuban_branch, thuban_release): New variables
2432 controlling which and how Thuban versions are shown. See the
2433 comments for details.
2434 (verify_versions): Also check that the wx version that wxproj is
2435 compiled against matches that of the wxPython we use at runtime
2436
2437 2004-02-20 Bernhard Herzog <[email protected]>
2438
2439 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2440 get_system_proj_file to read the epsg projections. The old way
2441 depended on the current directory being the top Thuban directory.
2442
2443 2004-02-20 Bernhard Herzog <[email protected]>
2444
2445 * Extensions/svgexport/test/test_svgmapwriter.py
2446 (TestVirtualDC.test_clippath): Remove a debug print
2447
2448 2004-02-20 Bernhard Herzog <[email protected]>
2449
2450 * Extensions/svgexport/__init__.py: New. Turn
2451 Extensions/svgexport into a package.
2452
2453 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2454 doc-string a bit. The doc-string must come first, otherwise it's
2455 not a doc-string. The __future__ import must be the first thing
2456 after the doc-string. Use only double quotes in doc-strings.
2457 Single quotes trip up emacs syntax highlighting if the text
2458 contains apostrophes.
2459
2460 2004-02-20 Bernhard Herzog <[email protected]>
2461
2462 * Extensions/svgexport/test/__init__.py,
2463 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2464 suite for svgexport
2465
2466 * test/runtests.py (find_test_modules): New. Function with the
2467 module finding code from main.
2468 (main): Use find_test_modules to figure out the default test
2469 modules and take modules from Extensions.svgexport.test too.
2470
2471 2004-02-19 Bernhard Herzog <[email protected]>
2472
2473 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2474 the mainwindow has a reference to the map of the initial session.
2475 This fixes a bug introduced with the fix for RT#2245
2476
2477 2004-02-19 Bernhard Herzog <[email protected]>
2478
2479 * Extensions/svgexport/svgsaver.py,
2480 Extensions/svgexport/svgmapwriter.py,
2481 Extensions/svgexport/maplegend.py: Added again. This time in the
2482 correct place.
2483
2484 2004-02-17 Bernhard Herzog <[email protected]>
2485
2486 Fix for RT#2245
2487
2488 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2489 instance variables before trying to create any windows. Creating
2490 windows can start an event loop if e.g. message boxes are popped
2491 up for some reason, and event handlers, especially EVT_UPDATE_UI
2492 may want to access things from the application.
2493 (ThubanApplication.maps_changed): The mainwindow may not have been
2494 created yet, so check whether it has been created before calling
2495 its methods
2496
2497 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2498 have a map
2499
2500 2004-02-17 Bernhard Herzog <[email protected]>
2501
2502 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2503 Extensions/svgmapwriter.py, Extensions/maplegend.py,
2504 extensions/svgexport/svgsaver.py,
2505 extensions/svgexport/svgmapwriter.py,
2506 extensions/svgexport/maplegend.py: Removed. These files were in
2507 the wrong places or didn't work at all.
2508
2509 2004-02-16 Bernhard Herzog <[email protected]>
2510
2511 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2512 line
2513
2514 2004-02-16 Bernhard Herzog <[email protected]>
2515
2516 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2517
2518 2004-02-15 Markus Rechtien <[email protected]>
2519
2520 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2521 to write a session to a file in SVG format.
2522 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2523 to write a SVG map of a session.
2524 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2525 in SVG format for the current session.
2526
2527 2004-02-13 Bernhard Herzog <[email protected]>
2528
2529 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2530 can't be created, return immediately after displaying the error
2531 message.
2532
2533 2004-02-11 Bernhard Herzog <[email protected]>
2534
2535 Handle postgis tables with more than one geometry column.
2536
2537 * Thuban/Model/postgisdb.py
2538 (PostGISTable._fetch_table_information): Delegate the creation of
2539 column objects to a different method so that we can extend that in
2540 derived classes
2541 (PostGISTable._create_col_from_description): New. Column object
2542 creation part of _fetch_table_information
2543 (PostGISShapeStore._create_col_from_description): New. Extend
2544 inherited method to handle geometry columns
2545 (PostGISShapeStore.__init__): New parameter geometry_column to
2546 specify which geometry column to use. Optional but mandatory for
2547 tables with more than one geometry column
2548 (PostGISShapeStore._fetch_table_information): Also use the name of
2549 the geometry column when looking for the srid
2550 (PostGISShapeStore.ShapeType): Also use the name of the geometry
2551 column when looking for the shape type
2552
2553 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2554 NonConnectionStore to changes in the PostGISShapeStore
2555
2556 * test/test_postgis_db.py
2557 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2558 PostGISShapeStore with tables having two geometry columns.
2559
2560 2004-02-10 Bernhard Herzog <[email protected]>
2561
2562 Fix some postgis problems. What remains to be done is real
2563 handling of SRIDs as they affect how reprojection is done
2564
2565 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2566 doc-string
2567 (PostGISShapeStore._fetch_table_information): New. Extend
2568 inherited method to retrieve srid
2569 (PostGISShapeStore.BoundingBox): Handle tables without data.
2570 extent yields NULL for those
2571 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2572
2573 * test/test_postgis_db.py
2574 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2575 for the special case of a table without any data
2576 (TestPostGISShapestorePointSRID): New class with tests for a table
2577 that uses srids
2578 (PolygonTests): Fix a doc-string typo
2579
2580 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2581 reference_systems with a specification of spacial reference
2582 systems to create in the new db.
2583 (PostgreSQLServer.new_postgis_db)
2584 (PostgreSQLServer.get_static_data_db): New parameter
2585 reference_systems to be passed through ultimately to
2586 PostGISDatabase. In new_postgis_db also check whether an existing
2587 db already has the right srids
2588 (PostgreSQLServer.get_default_static_data_db): Add srids and a
2589 table that uses srids
2590 (PostGISDatabase.initdb): Create the entries for the reference
2591 systems
2592 (PostGISDatabase.has_data): Add reference_systems parameter to
2593 check for those too
2594 (upload_shapefile): New parameter srid to create tables with a
2595 specific srid
2596
2597 2004-02-06 Frank Koormann <[email protected]>
2598
2599 * po/pt_BR.po: Fixed charset
2600
2601 2004-02-05 Frank Koormann <[email protected]>
2602
2603 * po/pt_BR.po: Fixed format string for error message, missing %s
2604 added (Thuban/UI/application.py:273)
2605
2606 2004-02-03 Frank Koormann <[email protected]>
2607
2608 First version of Portuguese (Brazilian) translation
2609
2610 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2611 Brazilian Portuguese by Eduardo Patto Kanegae.
2612
2613 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2614 translators.
2615
2616
2617 2004-01-22 Frank Koormann <[email protected]>
2618
2619 * Doc/manual/thuban-manual.xml: Added section on installation of
2620 Thuban under Win32 systems. Fixed image path references in the postgis
2621 section. Some minor source formattings.
2622
2623 2004-01-21 Frank Koormann <[email protected]>
2624
2625 Make Thuban remember path selections (at least for one application run).
2626
2627 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2628 attribute of application object. Path is a dictionary of
2629 strings, currently with the items "data" and "projection".
2630 (Application.SetPath): New, stores path for the specified item.
2631 (Application.Path): New, return path for the specified item.
2632
2633 * Thuban/UI/mainwindow.py
2634 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2635 MainWindow.AddLayer, MainWindow.AddRasterLayer,
2636 MainWindow.TableOpen): Access "data" path information of the
2637 application.
2638
2639 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2640 Access "projection" path information of the application.
2641
2642 2004-01-05 Bernhard Herzog <[email protected]>
2643
2644 * po/ru.po: Updated translations from Alex Shevlakov
2645
2646 2004-01-05 Bernhard Herzog <[email protected]>
2647
2648 * po/Makefile, po/README: Move the description of how to generate
2649 the translation statistics to the README.
2650
2651 2003-12-23 Bernhard Herzog <[email protected]>
2652
2653 * NEWS: Update for 1.0.0
2654
2655 * po/it.po: Another update from Maurizio Napolitano
2656
2657 2003-12-23 Bernhard Herzog <[email protected]>
2658
2659 * po/it.po: Updated translation from Maurizio Napolitano
2660
2661 2003-12-23 Bernhard Herzog <[email protected]>
2662
2663 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2664 for translation
2665
2666 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2667 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2668 strings for translation
2669
2670 * po/de.po: Update with the newly marked strings.
2671
2672 2003-12-22 Bernhard Herzog <[email protected]>
2673
2674 * HOWTO-Release: Fix the places where version numbers have to be
2675 updated
2676
2677 2003-12-22 Bernhard Herzog <[email protected]>
2678
2679 * setup.py (setup call): 1.0.0, yeah!
2680
2681 * Thuban/version.py (longversion): 1.0.0, yeah!
2682
2683 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2684 1.0.0 namespace too
2685
2686 * Thuban/Model/save.py (SessionSaver.write_session): Save with
2687 1.0.0 namespace
2688
2689 * test/test_load.py (LoadSessionTest.dtd)
2690 (TestSingleLayer.file_contents)
2691 (TestNonAsciiColumnName.file_contents)
2692 (TestLayerVisibility.file_contents)
2693 (TestClassification.file_contents, TestLabels.file_contents)
2694 (TestLayerProjection.file_contents)
2695 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2696 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2697 (TestPostGISLayerPassword.file_contents)
2698 (TestLoadError.file_contents, TestLoadError.test): Update for
2699 1.0.0 namespace
2700
2701 * test/test_save.py (SaveSessionTest.dtd)
2702 (SaveSessionTest.testEmptySession)
2703 (SaveSessionTest.testSingleLayer)
2704 (SaveSessionTest.testLayerProjection)
2705 (SaveSessionTest.testRasterLayer)
2706 (SaveSessionTest.testClassifiedLayer)
2707 (SaveSessionTest.test_dbf_table)
2708 (SaveSessionTest.test_joined_table)
2709 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2710
2711 2003-12-22 Bernhard Herzog <[email protected]>
2712
2713 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2714 alignment flags are byte strings not unicode and that they have
2715 valid values
2716
2717 * test/test_load.py (TestLabelLayer): New. Test loading (and
2718 indirectly saving) of maps with labels.
2719
2720 2003-12-22 Bernhard Herzog <[email protected]>
2721
2722 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2723 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2724 unsubscribe all subscribers.
2725 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2726 self.grid since it may already have been destroyed.
2727 Fixes RT #2256
2728
2729 2003-12-19 Bernhard Herzog <[email protected]>
2730
2731 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2732
2733 2003-12-16 Bernhard Herzog <[email protected]>
2734
2735 * debian/bitmappath.patch, debian/setup.py.patch:
2736 added to ensure compliance with FHS for debian
2737 * debian/rules, debian/changelog:
2738 added patches in rules to ensure compliance with FHS for debian
2739
2740 2003-12-16 Bernhard Herzog <[email protected]>
2741
2742 * po/Makefile (mo): Make the output a bit nicer so that it prints
2743 statistics about the translations. Add a comment how produce even
2744 nicer statistics with sed.
2745
2746 2003-12-09 Frank Koormann <[email protected]>
2747
2748 * Resources/Projections/defaults.proj:
2749 French projection sample with correct accents (UNICODE).
2750
2751 2003-12-05 Bernhard Herzog <[email protected]>
2752
2753 * MANIFEST.in: Add the devtools directory
2754
2755 * setup.py (setup call): Use license instead of licence. This
2756 silences a deprecation warning on Python 2.3
2757
2758 2003-12-05 Frank Koormann <[email protected]>
2759
2760 Documentation synced with 1.0rc1
2761
2762 * Doc/manual/thuban-manual.xml:
2763 Minor formatting changes and references to database layers .
2764 Introduction.Internationalization: New section on i18n.
2765 MapManagement.AddingandRemovingLayers: Added item on database layers.
2766 MapManagement.TheLegend: Added section and screenshot on popup menu.
2767 ProjectionManagement: Updated screenshot and sentence on EPSG.
2768 Appendix.SupportedDataSources: Added PostGIS.
2769 Appendix.WorkingwithPostGIS: New section.
2770
2771 * Doc/manual/images/6_projection.png: Updated screenshot including
2772 EPSG checkboxes.
2773
2774 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2775
2776 * Doc/manual/images/app_postgis_add_layer.png,
2777 Doc/manual/images/app_postgis_db_add.png,
2778 Doc/manual/images/app_postgis_db_management.png:
2779 New screenshots focussing on database layers
2780
2781 2003-12-05 Frank Koormann <[email protected]>
2782
2783 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2784 write warning to stderr instead of rising a warning dialog
2785
2786 2003-12-03 Bernhard Herzog <[email protected]>
2787
2788 Fix for RT #2243
2789
2790 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2791 New. Like has_selected_layer but for shape layers only
2792 (_has_selected_shape_layer): New. Like _has_selected_layer but for
2793 shape layers only
2794 (layer_show_table command, layer_jointable command): Use these
2795 commands should only be available for shape layers
2796
2797 2003-12-03 Bernhard Herzog <[email protected]>
2798
2799 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2800 publishers that are wx objects and may have been destroyed by wx
2801 already. Fixes RT #2242.
2802
2803 2003-12-03 Bernhard Herzog <[email protected]>
2804
2805 * po/ru.po: Updates from Alex Shevlakov
2806
2807 2003-12-03 Silke Reimer <silkeintevation.de>
2808
2809 * debian/control, debian/changelog: Added gdal-support to
2810 debian package, updated to new thuban version
2811
2812
2813 2003-12-03 Bernhard Herzog <[email protected]>
2814
2815 * Thuban/Lib/version.py: New. Module for version number
2816 manipulations. The version of make_tuple here also deals better
2817 with more unusual version number strings, such as e.g.
2818 "1.2+cvs20031111"
2819
2820 * Thuban/version.py (make_tuple): Removed. It's now in
2821 Thuban.Lib.version. Use that implementation instead.
2822
2823 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2824
2825 2003-12-02 Bernhard Herzog <[email protected]>
2826
2827 * MANIFEST.in: Add debian files
2828
2829 * setup.py (setup call): Add packages for the Extensions so that
2830 they're installed too
2831 (data_files): Add READMEs and sample data from some Extensions
2832
2833 * NEWS: Add note about the extensions in binary packages
2834
2835 2003-12-02 Bernhard Herzog <[email protected]>
2836
2837 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2838 with the thuban-1.0rc1
2839
2840 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2841 thuban-1.0rc1 namespace too
2842
2843 * test/test_save.py (SaveSessionTest.dtd)
2844 (SaveSessionTest.testEmptySession)
2845 (SaveSessionTest.testSingleLayer)
2846 (SaveSessionTest.testLayerProjection)
2847 (SaveSessionTest.testRasterLayer)
2848 (SaveSessionTest.testClassifiedLayer)
2849 (SaveSessionTest.test_dbf_table)
2850 (SaveSessionTest.test_joined_table)
2851 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2852 namespace
2853
2854 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2855 namespace
2856 (TestSingleLayer.file_contents)
2857 (TestNonAsciiColumnName.file_contents)
2858 (TestLayerVisibility.file_contents)
2859 (TestClassification.file_contents, TestLabels.file_contents)
2860 (TestLayerProjection.file_contents)
2861 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2862 (TestPostGISLayer.file_contents)
2863 (TestPostGISLayerPassword.file_contents)
2864 (TestLoadError.file_contents, TestLoadError.test): Update to
2865 thuban-1.0rc1 namespace
2866
2867 2003-12-01 Bernhard Herzog <[email protected]>
2868
2869 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2870 nt to better match Intevation's current w32 setup
2871
2872 * HOWTO-Release: Add note about updating MANIFEST.in
2873
2874 * MANIFEST.in: Add the Extensions
2875
2876 * NEWS: Update for 1.0rc1
2877
2878 2003-12-01 Bernhard Herzog <[email protected]>
2879
2880 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2881 cards for the dialog so that shapefiles ending in all uppercase
2882 SHP are listed too
2883
2884 2003-11-28 Bernhard Herzog <[email protected]>
2885
2886 * Thuban/version.py (longversion): Update to 1.0rc1
2887
2888 * setup.py (setup call): Update version to 1.0rc1. Use the
2889 [email protected] email address as author email instead of my
2890 personal one.
2891
2892 2003-11-28 Bernhard Herzog <[email protected]>
2893
2894 * po/de.po: Update german translation.
2895
2896 2003-11-28 Bernhard Herzog <[email protected]>
2897
2898 Unify the filenames stored in .thuban files so that the .thuban
2899 files are more platform independend
2900
2901 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2902 that they can be used on both windows and unix
2903 (SessionSaver.prepare_filename): New. Handle all filename
2904 transformations for filenames stored in the thuban file
2905 (SessionSaver.write_data_containers, SessionSaver.write_layer):
2906 Use prepare_filename
2907
2908 * test/test_save.py (SaveSessionTest.testSingleLayer)
2909 (SaveSessionTest.testLayerProjection)
2910 (SaveSessionTest.testRasterLayer)
2911 (SaveSessionTest.testClassifiedLayer)
2912 (SaveSessionTest.test_dbf_table)
2913 (SaveSessionTest.test_joined_table): Filenames are always stored
2914 with slashes on all currently supported platforms so adapt all
2915 tests to this
2916
2917 * test/test_load.py (LoadSessionTest.filenames): With the new
2918 filename scheme the filenames in the tests should be
2919 understandable on all currently supported platforms so we turn
2920 this into an empty list because we don't have to normalize them
2921 anymore
2922
2923 2003-11-28 Bernhard Herzog <[email protected]>
2924
2925 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2926 Add the ellipsoid to the projection since some Proj versions
2927 complain if it's missing.
2928
2929 2003-11-27 Bernhard Herzog <[email protected]>
2930
2931 Corect some bounding box projection problems
2932
2933 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2934 version of ForwardBBox
2935 (Projection._transform_bbox): New. common implementation of
2936 ForwardBBox and InverseBBox
2937 (Projection.ForwardBBox): Use _transform_bbox.
2938
2939 * test/test_proj.py (TestProjection.test): Add test for
2940 InverseBBox
2941
2942 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2943 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2944 new InverseBBox method to determine the unprojected bounding box
2945 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2946 bbox.
2947
2948 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2949 Removed.
2950 (TestLayer.test_arc_layer_with_projection): New. This test is
2951 better able to test whether bounding boxes are projected correctly
2952 than test_point_layer_with_projection
2953
2954 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2955 InverseBBox to unproject bboxes
2956
2957 2003-11-25 Bernhard Herzog <[email protected]>
2958
2959 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2960 source code.
2961
2962 2003-11-25 Bernhard Herzog <[email protected]>
2963
2964 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2965 there for backwards compatibility and all code relying on that
2966 should have been updated by now.
2967
2968 2003-11-25 Bernhard Herzog <[email protected]>
2969
2970 * test/test_load.py (TestClassification.test): Add the missing
2971 round trip test.
2972 (TestClassification.file_contents): Update to the newest file
2973 format
2974
2975 2003-11-25 Bernhard Herzog <[email protected]>
2976
2977 Add very experimental (and possibly dangerous) extension to draw
2978 polygons:
2979
2980 * Extensions/drawshape/README: New. Brief installation
2981 instructions
2982
2983 * Extensions/drawshape/drawshape.py: New. Implementation of the
2984 drawshape extensions
2985
2986 * Extensions/drawshape/patch.diff: Patch to apply before the
2987 extension can be used.
2988
2989 2003-11-24 Bernhard Herzog <[email protected]>
2990
2991 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2992 (ShapefileStore.__init__): Factor opening the shapefile into a
2993 separate method (the new _open_shapefile). This makes the code a
2994 bit more readable but the real reason is that it makes some evil
2995 hacks easier. :-)
2996
2997 2003-11-24 Bernhard Herzog <[email protected]>
2998
2999 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3000 converter is specified for an attribute assume it's a string
3001 containing only Latin1 characters. Update doc-string accordingly.
3002 This change should fix many places where unicode objects might
3003 accidentally enter Thuban.
3004
3005 * test/test_load.py (TestNonAsciiColumnName): New test to check
3006 what happens with column names in DBF files that contain non-ascii
3007 characters
3008
3009 2003-11-21 Bernhard Herzog <[email protected]>
3010
3011 Enable the experimental attribute editing again and introduce a
3012 command line switch to actually activate it
3013
3014 * Thuban/UI/main.py (options): New. Container for options set on
3015 the commmand line
3016 (main): Add the --enable-attribute-editing flag.
3017
3018 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3019 editing is enabled use the grid ctrl which allows editing of the
3020 values
3021
3022 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3023 New. Just delegate this to the underlying table.
3024
3025 2003-11-20 Bernhard Herzog <[email protected]>
3026
3027 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3028 Skip this test if run under non-posix systems since it only works
3029 there
3030
3031 2003-11-19 Bernhard Herzog <[email protected]>
3032
3033 * Thuban/Model/resource.py: Rework the way gdal support is
3034 determined so that we can give a reason in the about why gdal is
3035 not supported.
3036 (gdal_support_status): New. Variable holding a string with the
3037 reason for no gdal support
3038
3039 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3040 not supported to the message
3041
3042 2003-11-19 Bernhard Herzog <[email protected]>
3043
3044 Remove the old table interface and its test cases
3045
3046 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3047 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3048 anymore
3049
3050 * Thuban/Model/transientdb.py (TransientTableBase)
3051 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3052 anymore
3053
3054 * test/test_table.py: Removed since the old interface it tests is
3055 gone.
3056
3057 * test/runtests.py (main): The old table interface is gone and
3058 with it the deprecation warnings so remove the code that turns
3059 these warnings into errors
3060
3061 2003-11-19 Bernhard Herzog <[email protected]>
3062
3063 * test/test_table.py: Revert to revision 1.5 again. Changing the
3064 tests to use the new table interface is completely wrong since the
3065 whole purpose of the tests in this module is to test the old
3066 interface.
3067
3068 2003-11-18 Bernhard Herzog <[email protected]>
3069
3070 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3071 New. Test whether the connection matches a set of connection
3072 parameters
3073
3074 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3075 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3076 for existing connections with the same parameters and break out of
3077 the loop correctly.
3078
3079 * test/test_postgis_db.py (TestBriefDescription)
3080 (TestPostGISSimple.test_brief_description): Rename
3081 TestBriefDescription to TestPostGISSimple and the test method to
3082 test_brief_description so that we can add more test methods.
3083 (TestPostGISSimple.test_matches_parameters): New. Test the new
3084 MatchesParameters method
3085
3086 2003-11-18 Bernhard Herzog <[email protected]>
3087
3088 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3089 _was_destroyed, to indicate whether an publisher instance has
3090 already been destroyed.
3091 (Publisher.Unsubscribe): Only disconnect if the publisher has not
3092 been destroyed yet.
3093 (Publisher.Destroy): Set the _was_destroyed flag to true.
3094
3095 * test/test_connector.py
3096 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3097 calling Unsubscribe after Destroy doesn't raise an exception
3098
3099 2003-11-14 Bernhard Herzog <[email protected]>
3100
3101 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3102 typo in doc-string
3103
3104 2003-11-13 Bernhard Herzog <[email protected]>
3105
3106 Quote table and column names properly for postgis.
3107
3108 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3109 quote an identifier for use in an sql statement
3110 (PostGISColumn.__init__): Add the quoted_name attribute
3111 (PostGISTable.__init__): New instance variable quoted_tablename
3112 (PostGISTable._fetch_table_information): Use the quoted table
3113 name. New isntance variable quoted_geo_col with a quoted version
3114 of geometry_column
3115 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3116 (PostGISTable.RowOrdinalToId): Use the quoted table name
3117 (PostGISTable.ReadValue, PostGISTable.ValueRange)
3118 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3119 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3120 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3121 Use quoted table and column names
3122
3123 * test/test_postgis_db.py (TestPostGISSpecialCases)
3124 (TestPostGISIgnoredColumns): Rename the class to
3125 TestPostGISSpecialCases because that better describes the new
3126 cases
3127 (TestPostGISSpecialCases.test_unsupported_types)
3128 (TestPostGISSpecialCases.test): Rename the method to
3129 test_unsupported_types because we need a more descriptive name now
3130 that there are more methods
3131 (TestPostGISSpecialCases.test_table_name_quoting)
3132 (TestPostGISSpecialCases.test_column_name_quoting)
3133 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3134 cases to test quoting of table and column names in PostGISTable
3135 and PostGISShapeStore
3136
3137 * test/postgissupport.py
3138 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3139 AddGeometryColumn desn't support table or column names with sapces
3140 or double quotes
3141
3142 2003-11-12 Jan-Oliver Wagner <[email protected]>
3143
3144 * Extensions/wms/__init__.py: New: Init to make this
3145 directory a package.
3146
3147 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3148
3149 2003-11-11 Bernhard Herzog <[email protected]>
3150
3151 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3152 Constant for the file woth deprecated epsg projections
3153 (get_system_proj_file): Update doc-string
3154
3155 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3156 above the EPS widgets, introduce a check box for the deprecated
3157 eps projections and a label for the epsg widgets
3158 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3159 too
3160
3161 2003-11-11 Bernhard Herzog <[email protected]>
3162
3163 Avoid warnings when run under Python 2.3
3164
3165 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3166 (BaseRenderer.draw_label_layer): Coordinates must be ints.
3167
3168 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3169 real method so that we can convert to int.
3170 (MapRenderer.label_font): The font size mist be an int.
3171
3172 * Thuban/UI/common.py (Color2wxColour): The color values must be
3173 ints. Also, remove the unnecessary asserts.
3174
3175 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3176 (TestUnicodeStrings.test): Python source code should not contain
3177 non-ascii characters unless an encoding is specified in the file.
3178 Therefore use \x escapes in the string literals for non-ascii
3179 characters.
3180
3181 2003-11-11 Bernhard Herzog <[email protected]>
3182
3183 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3184 parameter so that this function can be used for all proj files in
3185 Resource/Projections
3186 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3187 get_system_proj_file
3188
3189 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3190 ProjFile self.__sysProjFile use a dictionary of system ProjFile
3191 objects self._sys_proj_files
3192 (ProjFrame.build_dialog): Adapt to the new changes in the
3193 ProjectionList constructor. Add a check button to toggle whether
3194 EPSG projections are shown
3195 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3196 events.
3197 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3198 the busy cursor if the files have not yet been loaded by the
3199 dialog.
3200 (ProjFrame.load_system_proj): Add a parameter for the name of the
3201 proj file. Maintain the dictionary of system projections
3202 self._sys_proj_files
3203
3204 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3205 user_projs parameters into one parameter proj_files which is a
3206 list of proj files.
3207 (ProjectionList._subscribe_proj_files)
3208 (ProjectionList._unsubscribe_proj_files): New. Move
3209 subscription/unsubscription of projfile messages to separate
3210 methods
3211 (ProjectionList.Destroy): The unsubscribe is now done in
3212 _unsubscribe_proj_files
3213 (ProjectionList.update_projections): We now have a list of proj
3214 file objects
3215 (ProjectionList.SetProjFiles): New method to set a new list of
3216 proj file objects
3217
3218 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3219 Specify explicitly which system proj file to load.
3220
3221 2003-11-11 Bernhard Herzog <[email protected]>
3222
3223 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3224 instance variables to cut cyclic references. The GC would have
3225 collected the loader eventually but it can happen that it doesn't
3226 run at all until thuban is closed (2.3 but not 2.2 tries a bit
3227 harder and forces a collection when the interpreter terminates)
3228 (load_session): Call the handler's Destroy method to make sure
3229 that it gets garbage collected early. Otherwise it will be
3230 collected very late if at all and it holds some references to e.g.
3231 shapestores and the session which can lead to leaks (of e.g. the
3232 temporary files)
3233
3234 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3235 resource leak in load_session
3236
3237 2003-11-10 Bernhard Herzog <[email protected]>
3238
3239 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3240 extensions are to be rendered.
3241 (_renderer_extensions): New. List with renderer for layers in
3242 extensions
3243 (add_renderer_extension): New. Add a renderer extension
3244 (init_renderer_extensions): New. Init the renderer extensions
3245 (BaseRenderer.render_map_incrementally): Search
3246 _renderer_extensions for how to draw unknown layer types
3247 (BaseRenderer.draw_raster_data): Add format parameter so that
3248 formats other than BMP can be drawn
3249 (BaseRenderer.draw_raster_layer): Pass an explicit format to
3250 draw_raster_data
3251
3252 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3253 strings of the format parameter of draw_raster_data method to wx
3254 constants
3255 (MapRenderer.draw_raster_data): Add the format parameter and use
3256 raster_format_map to map it to the right wxwindows constant for
3257 wxImageFromStream
3258
3259 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3260 the format parameter and record it
3261 (TestBaseRenderer.test_raster_no_projection): check the format
3262 paramter of the draw_raster_data method
3263 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3264 extension facility
3265
3266 2003-11-07 Bernhard Herzog <[email protected]>
3267
3268 Tweak the usage of the sqlite database to make common use cases
3269 more responsive. In most cases copying the data to the sqlite
3270 database takes so long that using sqlite doesn't have enough
3271 advantages.
3272
3273 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3274 comments about performance and query the min and max in separate
3275 statements because only that way will indexes be used.
3276 (TransientTableBase.UniqueValues): Add some comments about
3277 performance.
3278 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3279 Do not copy the data to the transient DB but use the transient
3280 copy if it exists. See the new comments for the performance trade
3281 offs
3282
3283 * test/test_transientdb.py
3284 (TestTransientTable.test_auto_transient_table): Make sure that the
3285 data is copied to the transient database at some point.
3286
3287 2003-11-03 Bernhard Herzog <[email protected]>
3288
3289 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
3290 globals to locals so that it's a bit faster
3291
3292 2003-11-03 Bernhard Herzog <[email protected]>
3293
3294 * Thuban/UI/baserenderer.py
3295 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
3296 method. ReadValue is faster than ReadRowAsDict since it only reads
3297 one cell especially now that the dbf file objects actually
3298 implement it.
3299
3300 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
3301 read_attribute method of the dbf objects
3302
3303 2003-11-03 Bernhard Herzog <[email protected]>
3304
3305 * Extensions/profiling/profiling.py (popup_dialog_box): New config
3306 variable to indicate whether the result should be shown in a
3307 dialog box
3308 (profile_screen_renderer, time_screen_renderer): Only show a
3309 dialog box if popup_dialog_box is true.
3310 (profile_screen_renderer): Flush stdout after the printing the
3311 first part of the "profiling..." message
3312
3313 * Thuban/UI/baserenderer.py
3314 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
3315 brushes for the groups so that they're not created over and over
3316 again
3317
3318 * Thuban/Model/classification.py (Classification.__getattr__)
3319 (Classification._compile_classification)
3320 (Classification._clear_compiled_classification): New. Methods to
3321 manage a 'compiled' representation of the classification groups
3322 which is created on demand
3323 (Classification.InsertGroup, Classification.RemoveGroup)
3324 (Classification.ReplaceGroup): reset the compiled representation
3325 (Classification.FindGroup): Use the compiled representation to
3326 find the matching group
3327 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
3328
3329 2003-10-31 Bernhard Herzog <[email protected]>
3330
3331 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
3332 Send a CLASS_CHANGED message
3333 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
3334 not return the removed group since it wasn't used.
3335
3336 * test/test_classification.py
3337 (TestClassification.test_set_default_group): New. Test the
3338 SetDefaultGroup method
3339 (TestClassification.test_insert_group): New. Test the InsertGroup
3340 method
3341 (TestClassification.test_remove_group): New. Test the RemoveGroup
3342 method
3343 (TestClassification.test_replace_group): New. Test the
3344 ReplaceGroup method
3345
3346 2003-10-31 Bernhard Herzog <[email protected]>
3347
3348 * test/test_classification.py (TestClassification.setUp):
3349 Subscribe to the CLASS_CHANGED messages
3350 (TestClassification.tearDown): New. Destroy the classification
3351 properly
3352 (TestClassification.test_defaults): Add tests for the default line
3353 width and whether no messages were sent yet
3354 (TestClassification.test_set_default_properties): Add tests for
3355 messages and setting the default line width
3356 (TestClassification.test_add_singleton)
3357 (TestClassification.test_add_range)
3358 (TestClassification.test_multiple_groups): Add tests for messages
3359
3360 2003-10-31 Bernhard Herzog <[email protected]>
3361
3362 Some more refactoring in preparation for new tests:
3363
3364 * test/test_classification.py (TestClassification.setUp): New.
3365 Instantiate the classification here. Update the test methods
3366 accordingly.
3367 (TestClassification.test_multiple_groups): Make sure that the two
3368 singletons matching 1 are considered different.
3369
3370 2003-10-31 Bernhard Herzog <[email protected]>
3371
3372 * test/test_classification.py (red, green, blue): New. These
3373 constants were used in several cases. Update the relevant methods.
3374 (TestClassification.test_defaults)
3375 (TestClassification.test_set_default_properties)
3376 (TestClassification.test_add_singleton)
3377 (TestClassification.test_add_range)
3378 (TestClassification.test_multiple_groups)
3379 (TestClassification.test_deepcopy): New. These were formerly all
3380 part of the single method test.
3381 (TestClassification.test_deepcopy): Removed.
3382 (TestClassIterator): Removed. The test case is now a method of
3383 TestClassification since it tests part of the public interface of
3384 Classification
3385 (TestClassification.test_iterator): New. Used to be
3386 TestClassIterator effectively
3387
3388 2003-10-31 Jan-Oliver Wagner <[email protected]>
3389
3390 GUIfied the functions of the profiling extension.
3391
3392 * /Extensions/profiling/__init__.py: New: Init to make this
3393 directory a package.
3394
3395 * Extensions/profiling/profiling.py: Moved menu entries to
3396 the Extensions menu. Applied _() for strings.
3397 (profile_screen_renderer): Catch the detailed printout and present
3398 it in a dialog.
3399 (time_screen_renderer): Raise a dialog to present the result instead
3400 of printing it to stdout.
3401
3402 2003-10-31 Bernhard Herzog <[email protected]>
3403
3404 * test/test_classification.py (TestClassGroupProperties)
3405 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3406 (TestClassGroupSingleton, TestClassIterator, TestClassification):
3407 Split TestClassification into several classes, one for each class
3408 being tested. TestClassification itself now only tests
3409 Classification. This split makes changes to the tests a bit easier
3410
3411 2003-10-31 Bernhard Herzog <[email protected]>
3412
3413 * Extensions/profiling/profiling.py: New. Extension to measure
3414 Thuban performance
3415
3416 2003-10-31 Frank Koormann <[email protected]>
3417
3418 Added two items to legend popup menu: Remove Layer and Show Layer Table
3419
3420 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3421 LegendPanel._OnShowTable): New event handlers, call the corresponding
3422 mainwindow methods.
3423 (LegendTree._OnRightClick): Added items to popup menu.
3424
3425 2003-10-30 Bernhard Herzog <[email protected]>
3426
3427 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3428 EVT_WINDOW_DESTROY
3429 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3430 nothing but is convenient for the derived classes.
3431
3432 * Thuban/UI/tableview.py
3433 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3434 Unsubscribe the messages here not in OnClose because that might
3435 get called multiple times. Fixes RT #2196
3436 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3437 anymore.
3438
3439 * README: Update the minimum requirement for wxPython. Since we
3440 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3441 the version in which that was introduced for all platforms
3442
3443 2003-10-30 Frank Koormann <[email protected]>
3444
3445 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3446 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3447 frame.
3448
3449 2003-10-30 Jan-Oliver Wagner <[email protected]>
3450
3451 Improved APR import extension, added further EPSG definitions
3452 and some cleanup regarding string class.
3453
3454 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3455 Added test for alias 'longlat'.
3456
3457 * Resources/Projections/epsg-deprecated.proj: New. Contains
3458 deprecated EPSG definitions.
3459
3460 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3461 the variable names for objects.
3462
3463 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3464 Copied from importAPR and provided with documentation.
3465
3466 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3467 Moved to apr.py.
3468 (APR_View): Added object ref 'ITheme'.
3469
3470 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3471 split function by corresponding use of the string class method.
3472
3473 * Thuban/Model/xmlwriter.py: Replaced string replace function by
3474 corresponding string method.
3475
3476 2003-10-29 Bernhard Herzog <[email protected]>
3477
3478 * Thuban/UI/baserenderer.py
3479 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3480 special case of a classification that only has the default group
3481
3482 2003-10-27 Bernhard Herzog <[email protected]>
3483
3484 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3485
3486 * po/de.po: Update.
3487
3488 * Thuban/UI/application.py
3489 (ThubanApplication.ShowExceptionDialog): Handle translation of the
3490 dialog message properly
3491
3492 2003-10-27 Bernhard Herzog <[email protected]>
3493
3494 Rework how localization works so that we use wx's translation
3495 functions when running Thuban as a normal application but not when
3496 we don't need any UI, such as in the test suite. See the comment
3497 in Thuban/__init__.py for details
3498
3499 * Thuban/__init__.py (_): Add one level of indirection to make the
3500 translation handling more flexible and to make it possible to use
3501 either wx's translation services or not.
3502 (gettext_identity, translation_function_installed)
3503 (install_translation_function): New function to help with this
3504
3505 * Thuban/UI/__init__.py: Install the wx specific translation
3506 function if it's OK to do that
3507
3508 * test/support.py (initthuban): Install a dummy translation
3509 function so that importing Thuban.UI doesn't install a wx specific
3510 one for which would need to import wxPython
3511
3512 2003-10-27 Bernhard Herzog <[email protected]>
3513
3514 * HOWTO-Release: Source archives should be created first and the
3515 binary packages should be created from the source archives.
3516 There's an official debian package now so there's no need to test
3517 the rpm on debian anymore
3518
3519 2003-10-27 Bernhard Herzog <[email protected]>
3520
3521 Several rendering changes:
3522
3523 - Render the selection into a separate bitmap so that only that
3524 bitmap needs to be redrawn when the selection changes
3525
3526 - Render incrementally showing previews and allowing interaction
3527 before rendering is complete
3528
3529 - Update the renderer interface a bit. Most parameters of
3530 RenderMap are now parameters of the constructor
3531
3532 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3533 and the update region as parameters. Update the doc-string
3534 (BaseRenderer.render_map_incrementally): New. Generator function
3535 to renders the map incrementally
3536 (BaseRenderer.render_map): Remove the map argument (it's now in
3537 the constructor) and simply iterate over the
3538 render_map_incrementally generator to draw the map.
3539 (BaseRenderer.draw_shape_layer_incrementally)
3540 (BaseRenderer.draw_shape_layer): Renamed to
3541 draw_shape_layer_incrementally and changed into a generator that
3542 yields True every 500 shapes. Used by render_map_incrementally to
3543 render shape layers incrementally
3544
3545 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3546 map and region parameters which are now in the constructor
3547 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3548 the inherited render_map_incrementally.
3549 (BaseRenderer.draw_shape_layer): Removed.
3550 (ScreenRenderer.draw_selection_incrementally): New. The selection
3551 drawing part of the removed draw_shape_layer as a generator
3552 (ScreenRenderer.layer_shapes): Update because of the region
3553 parameter change
3554 (ExportRenderer.__init__): New. Extend the inherited constructor
3555 with the destination region for the drawing
3556 (ExportRenderer.RenderMap): Removed the map and region parameters
3557 which are now in the constructor
3558
3559 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3560 bitmap suitable for a preview in a tool
3561 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3562 bitmap
3563 (MapPrintout.draw_on_dc): Adapt to new renderer interface
3564 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3565 exists
3566 (MapCanvas.OnIdle): Update the logic to deal with incremental
3567 rendering and the selection bitmap
3568 (MapCanvas._do_redraw): Handle the instantiation of the render
3569 iterator and the redraws during rendering
3570 (MapCanvas._render_iterator): New. Generator to incrementally
3571 redraw both bitmaps
3572 (MapCanvas.Export): Adapt to new renderer interface.
3573 (MapCanvas.full_redraw): Reset the selection bitmap and the
3574 renderer iterator too
3575 (MapCanvas.redraw_selection): New. Force a redraw of the selection
3576 bitmap
3577 (MapCanvas.shape_selected): Only redraw the selection bitmap
3578
3579 * test/test_baserenderer.py
3580 (TestBaseRenderer.test_polygon_no_projection)
3581 (TestBaseRenderer.test_raster_no_projection)
3582 (TestBaseRenderer.test_point_map_projection)
3583 (TestBaseRenderer.test_point_layer_and_map_projection)
3584 (TestBaseRenderer.test_point_layer_projection)
3585 (TestBaseRenderer.test_point_with_classification): Adapt to new
3586 renderer interface
3587
3588 2003-10-24 Bernhard Herzog <[email protected]>
3589
3590 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3591 (point_in_polygon_shape, shape_centroid): Raise an exception if
3592 the shape can't be read. Previously invalid shape ids would lead
3593 to a segfault.
3594
3595 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3596 New. test whether an exception is raised for invalid shape ids
3597
3598 2003-10-24 Jan-Oliver Wagner <[email protected]>
3599
3600 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3601 as alias for 'latlong'.
3602
3603 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3604 as alias for 'latlong'.
3605
3606 2003-10-24 Jan-Oliver Wagner <[email protected]>
3607
3608 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3609 the projection even for the UnknownPanel.
3610 (UnknownProjPanel.__init__): Define the text and create the textctrl
3611 widget.
3612 (UnknownProjPanel._DoLayout): Replaced static text widget by the
3613 textctrl created in __init__.
3614 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3615 including the parameters of the projection.
3616
3617 2003-10-24 Jan-Oliver Wagner <[email protected]>
3618
3619 * Resources/Projections/epsg.proj: New. This is a list of
3620 EPSG codes with parameters for proj. The list has been
3621 generated using devtools/create_epsg.py based on the
3622 file nad/epsg of the proj 4.4.7 package. Four projection
3623 definitions have been deleted as they are not accepted by proj:
3624 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3625 and "HD72 / EOV".
3626
3627 2003-10-22 Bernhard Herzog <[email protected]>
3628
3629 Some more tweaks to the projection dialog which should fix RT
3630 #1886.
3631
3632 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3633 the ProjFile's messages and call the base class methods correctly
3634 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3635 flag on the newly selected item too. Otherwise some other item is
3636 focused and the first time the focus is moved with the keyboard
3637 the selection moves in unexpected ways.
3638
3639 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3640 focus on the OK button, only on the projection list. That way the
3641 list really has the focus initially
3642 (ProjFrame.OnClose): Call the projection list's Destroy method to
3643 make it unsubscribe all messages
3644
3645 2003-10-21 Bernhard Herzog <[email protected]>
3646
3647 Rework the projection dialog to fix a few bugs, including RT 2166
3648 and most of 2168
3649
3650 * Thuban/UI/projlist.py: New. The class ProjectionList is a
3651 special wxListCtrl to show a list of projections in a more MVC
3652 fashion
3653
3654 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3655 throughout the class. The main change is to use the ProjectionList
3656 class instead of a normal wxListBox. Also, add an explicit
3657 "Unknown" projection to the projection choice control.
3658 (ProjPanel.__init__): Add an "unknown" ellipsoid
3659 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3660 instantiation of the panel's controls to make the tab-order more
3661 natural
3662
3663 2003-10-21 Bernhard Herzog <[email protected]>
3664
3665 * test/test_load.py (TestSingleLayer.file_contents)
3666 (TestSingleLayer.test): Add non-ascii characters to the titles of
3667 session, map and layer. This is effectively a port of the
3668 TestUnicodeStrings test in test_load_0_8.py which for some reason
3669 was only added there.
3670
3671 * test/test_load_0_9.py (TestSingleLayer.file_contents)
3672 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3673 characters to the titles of session, map and layer,.
3674
3675 2003-10-21 Bernhard Herzog <[email protected]>
3676
3677 Add EPSG projection handling to .thuban files
3678
3679 * test/test_save.py (SaveSessionTest.dtd)
3680 (SaveSessionTest.testEmptySession)
3681 (SaveSessionTest.testLayerProjection)
3682 (SaveSessionTest.testRasterLayer)
3683 (SaveSessionTest.testClassifiedLayer)
3684 (SaveSessionTest.test_dbf_table)
3685 (SaveSessionTest.test_joined_table)
3686 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3687 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3688 use a and epsg projection to test saving them
3689
3690 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3691 namespace
3692 (TestLayerVisibility.file_contents, TestLabels.file_contents)
3693 (TestLayerProjection.file_contents)
3694 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3695 (TestPostGISLayer.file_contents)
3696 (TestPostGISLayerPassword.file_contents)
3697 (TestLoadError.file_contents, TestLoadError.test): Update to use
3698 1.0-dev namespace
3699 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3700 use 1.0-dev namespace and use an EPSG projection to test whether
3701 loading it works
3702
3703 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3704 as of Thuban 0.9. These are now tests to determine whether Thuban
3705 can still read files generated by Thuban 0.9
3706
3707 * Thuban/Model/save.py (SessionSaver.write)
3708 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3709 namespace
3710 (SessionSaver.write_projection): Write the projection's epsg
3711 attribute
3712
3713 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3714 thuban-1.0-dev.dtd namespace
3715 (SessionLoader.check_attrs): Allow a callable object as conversion
3716 too
3717 (SessionLoader.start_projection, SessionLoader.end_projection)
3718 (SessionLoader.start_parameter): Handle the epsg attribute and
3719 rename a few instance variables to lower case
3720
3721 * Resources/XML/thuban-1.0.dtd: New. Only difference to
3722 thuban-0.9.dtd is the epsg attribute for projections.
3723
3724 2003-10-21 Bernhard Herzog <[email protected]>
3725
3726 * test/runtests.py (main): Let the user specify which tests to run
3727 on the command line
3728
3729 * test/support.py (ThubanTestResult.getDescription): Override to
3730 give a better short description. The description can be used as a
3731 parameter to run_tests to run that particular test in isolation.
3732
3733 2003-10-21 Frank Koormann <[email protected]>
3734
3735 Popup menu for legend. Scheduled for the 1.2 release this was too
3736 simple to implement: The popup menu is bound to the legend tree, while
3737 the events are hanlded by its anchestor, the legend panel. This
3738 allows reuse of all the event handlers already implemented for the
3739 legend toolbar buttons.
3740
3741 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3742 to add handlers for the events issued by the popup menu.
3743 (LegendPanel._OnToggleVisibility): Handler for toggling layer
3744 visibility event
3745 (LegendPanel._OnProjection): Handler for layer projection event.
3746 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3747 (LegendTree._OnRightClick): Event handler for right click, select item
3748 and pop up menu.
3749 (LegendTree.ToggleVisibility): Toggle layer visibility
3750 (LegendTree.LayerProjection): Raise layer projection dialog for
3751 current layer.
3752
3753 2003-10-21 Bernhard Herzog <[email protected]>
3754
3755 * Resources/Projections/defaults.proj: Use correct DOCTYPE
3756 declaration. The top-level element is projectionlist not projfile
3757
3758 2003-10-20 Bernhard Herzog <[email protected]>
3759
3760 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3761 method to write a projfile and display a busy cursor and error
3762 dialogs.
3763 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3764 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3765 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3766 busy cursor while loading the user and system prj files.
3767
3768 2003-10-16 Bernhard Herzog <[email protected]>
3769
3770 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3771 ProjFile objects
3772 (clear_proj_file_cache): New function to clear the cache. Mainly
3773 useful for use by the test suite
3774 (read_proj_file): Use the cache.
3775
3776 * test/test_proj.py (TestProjFile): Clarify the doc-string
3777 (ProjFileReadTests): Update doc-string
3778 (ProjFileReadTests.test_get_system_proj_file): Check whether the
3779 system proj files is cached.
3780 (ProjFileLoadTestCase): New base class for the proj file tests
3781 derived from support.FileLoadTestCase to provide some common
3782 behavior.
3783 (TestLoadingProjFile)
3784 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3785 (TestProjFileWithInvalidParameters.file_contents): Derive from
3786 ProjFileLoadTestCase
3787 (TestLoadingProjFile.test_caching): New. Test whether the cache
3788 works
3789
3790 2003-10-16 Silke Reimer <[email protected]>
3791
3792 * debian/*: New directory with configuration files for building a thuban
3793 deb-package.
3794
3795 2003-10-14 Bernhard Herzog <[email protected]>
3796
3797 * test/test_proj.py: Execute support.run_tests when run as
3798 __main__ so that missing unsubscribes are detected
3799 (TestProjFile.tearDown): Destroy the proj_file properly
3800
3801 2003-10-14 Bernhard Herzog <[email protected]>
3802
3803 * Thuban/Model/messages.py (PROJECTION_ADDED)
3804 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3805 the ProjFile objects
3806
3807 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3808 easily send messages when the projections change
3809 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3810 when the change was successful
3811
3812 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3813 proj file messages
3814 (TestProjFile.test_add_remove)
3815 (TestProjFile.test_remove_non_existing)
3816 (TestProjFile.test_replace)
3817 (TestProjFile.test_replace_non_existing): Test whether the right
3818 messages are sent
3819
3820 2003-10-14 Bernhard Herzog <[email protected]>
3821
3822 * test/test_proj.py (TestProjFile.test): Refactor into several
3823 tests
3824 (TestProjFile.test_add_remove)
3825 (TestProjFile.test_remove_non_existing)
3826 (TestProjFile.test_replace)
3827 (TestProjFile.test_replace_non_existing): Some of the new
3828 individual test cases
3829 (TestProjFileSimple): New class for the rest of the test cases
3830 that came out of the refactoring
3831 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3832 derived classes don't have to
3833
3834 2003-10-13 Bernhard Herzog <[email protected]>
3835
3836 Add an optional EPSG code to the projection objects and extend the
3837 .proj file format accordingly.
3838
3839 * Resources/XML/projfile.dtd (element projection): Add epsg
3840 attribute
3841
3842 * Thuban/Model/proj.py (Projection.__init__): New parameter and
3843 instance variable epsg. Update doc-string
3844 (Projection.EPSGCode, Projection.Label): New methods to provide
3845 access to EPSG code and a label for use in dialogs
3846
3847 * Thuban/Model/resource.py (ProjFileReader.start_projection)
3848 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3849 Handle the epsg code attribute when reading or writing proj files
3850
3851 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3852 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3853 (ProjFrame.__FillAvailList): Use the projection's Label method to
3854 get the string for the list box
3855
3856 * test/test_proj.py (TestProjection.test_label)
3857 (TestProjection.test_label_epsg)
3858 (TestProjection.test_epsgcode_for_non_epsg_projection)
3859 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3860 for the label and EPSGCode methods
3861 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3862 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3863 objects in the test cases and put the expected contents into the
3864 test case methods too. Update doTestWrite accordingly
3865 (TestLoadingProjFile)
3866 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3867 read tests from TestProjFile.
3868 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3869 tests are now in the new classes.
3870 (sample_projfile, sample_projfile_data)
3871 (sample_projfile2, sample_projfile_data2): Removed. Not used
3872 anymore.
3873 (TestProjFile.test_read_unreadable_file): No need to reset the
3874 permissions at the end anymore since we use a unique filename
3875
3876 2003-10-13 Bernhard Herzog <[email protected]>
3877
3878 * test/test_proj.py: Some more refactoring of the test cases
3879 (ProjFileTest): New base class for the proj file tests.
3880 (TestProjFile): Derive from ProjFileTest
3881 (TestProjFile.test_read_unreadable_file)
3882 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3883 the new filename method to get a unique filename
3884 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3885 (WriteProjFileTests): New class for proj file write tests.
3886 Contains the write test that were in TestProjFile originally.
3887
3888 2003-10-13 Bernhard Herzog <[email protected]>
3889
3890 * test/test_proj.py (TestProjFile.testRead)
3891 (TestProjFile.test_read_non_existing_file)
3892 (TestProjFile.test_read_unreadable_file)
3893 (TestProjFile.test_read_empty_file): Split into several methods.
3894
3895 2003-10-10 Bernhard Herzog <[email protected]>
3896
3897 * Thuban/UI/sizers.py: New file with custom sizers.
3898
3899 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3900 all projection type specific panels and put them into a
3901 NotebookLikeSizer. This way the dialog doesn't change its size
3902 when a different projection is selected
3903 (ProjFrame.__init__): Rename projection_panels
3904 projection_panel_defs and reuse projection_panels for a list of
3905 the instantiated panels.
3906 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3907 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3908 the panels
3909 (UnknownProjPanel._DoLayout): Place the newlines in the message
3910 differently to make the panel narrower.
3911 (TMPanel._DoLayout): Layout the parameters in one column.
3912
3913 2003-10-10 Bernhard Herzog <[email protected]>
3914
3915 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3916 that contains all the setup for the dialog's widgets, layout and
3917 event handling.
3918 (__): Call build_dialog to build the dialog.
3919 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3920 Their functionality is now in build_dialog
3921 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3922 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3923 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3924 different widget names and hierarchy introduced with build_dialog.
3925
3926 2003-10-10 Bernhard Herzog <[email protected]>
3927
3928 * README: Fix typo.
3929
3930 2003-10-09 Bernhard Herzog <[email protected]>
3931
3932 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3933 projection is already in the list. This is *a lot* faster when
3934 loading files with hundreds of projections since it saves a linear
3935 search. OTOH this will allow adding the same projection to the
3936 user.proj file multiple times in the projection dialog but we'll
3937 deal with that later
3938
3939 2003-10-09 Jan-Oliver Wagner <[email protected]>
3940
3941 * devtools: New. Directory for developer tools that are not intended
3942 for the regular user.
3943
3944 * devtools/create_epsg.py: New. Convert the epsg file of proj into
3945 a python .proj file.
3946
3947 2003-10-09 Bernhard Herzog <[email protected]>
3948
3949 * test/test_proj.py
3950 (TestProjection.test_get_parameter_without_equals_sign): New. Test
3951 whether GetParameter handles parameters without "=" sign correctly
3952
3953 * Thuban/Model/proj.py (Projection.GetParameter): Handle
3954 parameters that do not contain a "=". Update the doc-string
3955
3956 2003-10-08 Bernhard Herzog <[email protected]>
3957
3958 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3959 length limit on the projname text control
3960
3961 2003-10-08 Bernhard Herzog <[email protected]>
3962
3963 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3964 (TestProjection.test_get_projection_units_normal): New. Tests for
3965 the Projection.GetProjectedUnits method
3966
3967 2003-10-08 Jan-Oliver Wagner <[email protected]>
3968
3969 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3970 Added missing 'val' parameter.
3971
3972 2003-10-08 Bernhard Herzog <[email protected]>
3973
3974 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3975 projection type of the currently selected projection is not known,
3976 i.e. there's no panel for it, use the UnknownProjPanel
3977 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3978 the actual replacing of the proj panel into the new method
3979 _show_proj_panel.
3980 (UnknownProjPanel): Add doc-string.
3981 (UnknownProjPanel._DoLayout): Insert a newline into the text so
3982 that the panel is not so wide.
3983
3984 2003-10-08 Bernhard Herzog <[email protected]>
3985
3986 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3987 too. Update the doc-string
3988 (get_proj_files): Removed. It wasn't used anywhere
3989 (get_system_proj_files, get_system_proj_file): Rename to
3990 get_system_proj_file and return the ProjFile object and not a list
3991 of ProjFile objects. Update the callers.
3992 (get_user_proj_files, get_user_proj_file): Rename to
3993 get_user_proj_file return the ProjFile object and not a list of
3994 ProjFile objects. Update the callers.
3995 (ProjFileReader.__init__): New instance variable for the warnings.
3996 Rename the __pf ivar to projfile. Update the methods referring to
3997 __pf
3998 (ProjFileReader.end_projection): Catch any errors raised when
3999 instantiating the projection and record that as an error. The
4000 projection will not be in the final ProjFile object.
4001 (ProjFileReader.GetWarnings): New method to return the warnings.
4002
4003 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4004 show the warnings from the projfile reader
4005 (ProjFrame._OnImport): Deal with any warnings returned by
4006 read_proj_file
4007 (ProjFrame.__FillAvailList): Deal with any warnings returned by
4008 get_system_proj_file or get_user_proj_file.
4009
4010 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4011 (TestProjFileWithInvalidParameters.file_contents): New test cases
4012 to test whether read_proj_file handles invalid projection
4013 parameters correctly
4014 (TestProjFile.test_get_system_proj_file): New. Simple test for
4015 resource.get_system_proj_file
4016
4017 2003-10-07 Bernhard Herzog <[email protected]>
4018
4019 * test/test_derivedshapestore.py
4020 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4021 properly so that the temporary directories get deleted correctly
4022
4023 2003-10-06 Bernhard Herzog <[email protected]>
4024
4025 Handle the title changes in a proper MVC way.
4026
4027 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4028 canvas' TITLE_CHANGED messages
4029 (MainWindow.update_title): New. Update the main window's title
4030 (MainWindow.__SetTitle): Removed. Use update_title instead.
4031 (MainWindow.SetMap): Use update_title instead of __SetTitle
4032 (MainWindow.RenameMap): Do change the window title explicitly
4033 here. That's handled in a proper MVC way now.
4034 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4035 messages
4036
4037 * Thuban/Lib/connector.py (Conduit): New class to help classes
4038 that forward messages
4039
4040 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4041 (ViewPort): Derive from Conduit instead of Publisher
4042 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4043 when calling the inherited versions
4044 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4045 methods to subscribe and unsubscribe map messages
4046 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4047 handle the map subscriptions
4048 (ViewPort.Map, ViewPort.map_projection_changed)
4049 (ViewPort.layer_projection_changed): Add or update doc-strings
4050
4051 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4052 typo
4053 (MyConduit): Helper class for the Conduit test.
4054 (TestConduit): Test cases for Conduit
4055
4056 * test/test_connector.py: Use support.run_tests as main.
4057
4058 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4059 the TITLE_CHANGED messages
4060 (ViewPortTest.test_forwarding_title_changed): New test to check
4061 whether the viewport forwards the map's TITLE_CHANGED messages
4062 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4063 after the port's because the latter may require a still functional
4064 map.
4065
4066 2003-10-06 Bernhard Herzog <[email protected]>
4067
4068 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4069 doc-string
4070
4071 2003-10-06 Bernhard Herzog <[email protected]>
4072
4073 * test/test_viewport.py (ViewPortTest.setUp)
4074 (SimpleViewPortTest.test_init_with_size): Move the test for the
4075 initial size as a constructor parameter from ViewPortTest.setUp
4076 method to a new separate test in SimpleViewPortTest.
4077
4078 2003-10-06 Bernhard Herzog <[email protected]>
4079
4080 * test/test_viewport.py (MockView): New class derived from
4081 ViewPort with a mock implementation of GetTextExtent to be used in
4082 the test cases
4083 (ViewPortTest.setUp): Use MockView instead of ViewPort
4084
4085 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4086 into what would be a "pure virtual function" in C++: always raise
4087 NotImplementedError. Mock implementations for test cases don't
4088 belong into the real code
4089
4090 2003-10-02 Bernhard Herzog <[email protected]>
4091
4092 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4093 close the dbf file we create so that it's contents have been
4094 written properly.
4095
4096 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4097 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4098 Update to shapelib 1.2.10
4099
4100 2003-10-01 Jan-Oliver Wagner <[email protected]>
4101
4102 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4103 it annoys lintian which warns about these files not being
4104 executable. The #! isn't necessary here since if you absolutely
4105 must execute them you can always say "python <filename>".
4106
4107 2003-09-26 Bernhard Herzog <[email protected]>
4108
4109 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4110 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4111 is ported to a newer the import will fail, so it should be noticed
4112 immediately that this function is gone.
4113 Fixes RT#1919
4114
4115 2003-09-26 Bernhard Herzog <[email protected]>
4116
4117 Add a DTD for the projection files and make thuban write valid
4118 projection files
4119
4120 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4121 files
4122
4123 * Thuban/Model/resource.py (ProjFileSaver.write): Use
4124 'projectionlist' as the name in the document type declaration so
4125 that it matches the element type of the root element.
4126
4127 * test/test_proj.py (sample_projfile, sample_projfile2): Use
4128 'projectionlist' as the name in the document type declaration just
4129 as it is done now in the files thuban would write
4130 (sample_projfile, sample_projfile_data): Fix spelling of
4131 "Mercator"
4132 (TestProjFile.doTestWrite): Validate the written and the expected
4133 XML data
4134 (TestProjFile): Derive from ValidationTest so that we can run xml
4135 validation tests
4136
4137 2003-09-24 Bernhard Herzog <[email protected]>
4138
4139 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4140 modify the list returned by map.Layers() in place since it is the
4141 actual list of layers used by the map.
4142
4143 2003-09-23 Jan-Oliver Wagner <[email protected]>
4144
4145 * Doc/manual/thuban-manual.xml: Added subsection to chapter
4146 Extensions to describe the extensions coming with the Thuban
4147 standard package (gns2shp and importAPR).
4148
4149 2003-09-23 Bernhard Herzog <[email protected]>
4150
4151 * libraries/thuban/wxproj.cpp (project_point): if there's an
4152 inverse but no forward projection, convert to degrees after
4153 applying the inverse projection. Fixes RT#2096
4154
4155 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4156 implicitly tests for the fix to RT#2096
4157
4158 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4159 Check that the sequences have the same lengths
4160
4161 * Resources/Projections/defaults.proj (Geographic projection): Use
4162 a much more precise value for the to_meter attribute.
4163
4164 2003-09-22 Bernhard Herzog <[email protected]>
4165
4166 * test/support.py (initthuban): Make sure to unset the LANG env.
4167 var. so that tests that compare translated strings work. Solves RT
4168 #2094
4169
4170 2003-09-22 Jan-Oliver Wagner <[email protected]>
4171
4172 Small improvement of APR import.
4173
4174 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4175 Added tests for text-ranges.
4176
4177 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4178 returns a string object if the range is based on text.
4179
4180 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4181 range retrieval.
4182
4183 2003-09-22 Jan-Oliver Wagner <[email protected]>
4184
4185 Initial version of the importAPR extension which is in
4186 experimental state.
4187
4188 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4189 /Extensions/importAPR/test/: New directories.
4190
4191 * /Extensions/importAPR/samples/README: New: Howto load the samples.
4192
4193 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4194 file which refers to the Thuban Iceland demo data.
4195
4196 * /Extensions/importAPR/test/README: New: Howto execute the tests.
4197
4198 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4199
4200 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4201 as in '.apr'-files.
4202
4203 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4204 ODB Objects as in '.apr', '.avl' and other files.
4205
4206 * /Extensions/importAPR/__init__.py: New: Init to make this
4207 directory a package.
4208
4209 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4210 project file (.apr) and convert it to Thuban.
4211
4212 2003-09-22 Jan-Oliver Wagner <[email protected]>
4213
4214 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4215
4216 2003-09-19 Jan-Oliver Wagner <[email protected]>
4217
4218 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4219 with description on RPM installation and RPM binary package
4220 creation.
4221
4222 2003-09-18 Bernhard Herzog <[email protected]>
4223
4224 * setup.py (data_files): Only add the mo files if the Locales
4225 directory actually exists, so that setup.py works with a fresh CVS
4226 checkout
4227
4228 2003-09-12 Jan-Oliver Wagner <[email protected]>
4229
4230 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4231 in viewport, not anymore in view
4232
4233 2003-09-04 Jan-Oliver Wagner <[email protected]>
4234
4235 Introducing first Extension (gns2shp).
4236
4237 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4238
4239 * Extensions/__init__.py: New. init to make this dir a package.
4240
4241 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4242
4243 * Extensions/gns2shp/test/README: New. some info on this test directory.
4244
4245 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4246
4247 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4248 of Shapefile from GNS text file format
4249
4250 2003-09-03 Jan-Oliver Wagner <[email protected]>
4251
4252 Fix/workaround for bug #2019:
4253 https://intevation.de/rt/webrt?serial_num=2019
4254
4255 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4256 (IdentifyView.__init__): Added another button that allows to
4257 stop the identify mode.
4258 (IdentifyView.OnStop): New. Stops the identify mode.
4259
4260 2003-09-03 Jan-Oliver Wagner <[email protected]>
4261
4262 Introducing a new exception dialog that allows to exit the
4263 application immediately.
4264 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4265
4266 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4267
4268 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4269 Made strings available to translations. Exchanged the simple
4270 ScrolledMessageDialog by the new ExceptionDialog.
4271
4272 2003-09-01 Bernhard Herzog <[email protected]>
4273
4274 * NEWS: New. Summary of changes and release notes.
4275
4276 * MANIFEST.in: Add NEWS
4277
4278 2003-09-01 Bernhard Herzog <[email protected]>
4279
4280 * MANIFEST.in: Correct the include statement for the mo-files and
4281 include the documentation too.
4282
4283 * setup.py (data_files): Add the .mo files
4284 (setup call): Up to version 0.9.0
4285
4286 2003-09-01 Bernhard Herzog <[email protected]>
4287
4288 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4289 parameter list to just parent and session
4290 (ChooseDBTableDialog.__set_properties): Removed. Setting the
4291 selection of empty list boxes is not allowed (and produces C++
4292 assertion errors) and the rest of the setup is better done in
4293 __init__ anyway.
4294 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
4295 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
4296 builtins True/False for booleans to avoid warnings from wxPython
4297
4298 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
4299 ChooseDBTableDialog constructor parameters.
4300
4301 2003-09-01 Bernhard Herzog <[email protected]>
4302
4303 * Thuban/Model/postgisdb.py
4304 (PostGISTable): Extend doc-string
4305 (PostGISTable._fetch_table_information): Set the column index
4306 correctly, pretending ignored columns don't exist.
4307
4308 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
4309 for postgis tables with data types not yet supported by thuban.
4310
4311 2003-08-29 Bernhard Herzog <[email protected]>
4312
4313 * HOWTO-Release: Tweak item about running the tests.
4314
4315 2003-08-29 Jan-Oliver Wagner <[email protected]>
4316
4317 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
4318
4319 2003-08-29 Bernhard Herzog <[email protected]>
4320
4321 Add some missing parameters to projections. Proj complains about
4322 them on windows but for some reason not on Linux.
4323
4324 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
4325 missing required projection parameters
4326
4327 * test/test_proj.py (TestProjFile.test): Add missing required
4328 projection parameters
4329
4330 * test/test_load_0_8.py (TestLayerProjection.file_contents)
4331 (TestLayerProjection.test): Add missing required projection
4332 parameters and tests for them
4333
4334 * test/test_load.py (TestLayerProjection.file_contents)
4335 (TestLayerProjection.test): Add missing required projection
4336 parameters and tests for them
4337
4338 * test/test_layer.py (TestLayer.test_base_layer): Add missing
4339 required projection parameters
4340
4341 2003-08-29 Bernhard Herzog <[email protected]>
4342
4343 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
4344 access the pj_errno because directly accessing pj_errno doesn't
4345 work on windows if the proj library is in a DLL
4346
4347 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
4348
4349 2003-08-28 Bernhard Herzog <[email protected]>
4350
4351 * test/test_proj.py: Import things from Thuban after calling
4352 initthuban
4353
4354 * test/test_load.py (LoadSessionTest.filenames): New class
4355 variable with the filename attributes to normalize
4356 (LoadSessionTest.check_format): Pass self.filenames to
4357 sax_eventlist to normalize the filename attributes
4358
4359 * test/xmlsupport.py: Add cvs keywords
4360 (SaxEventLister.__init__): New parameter filenames which indicates
4361 attributes that contain filenames
4362 (SaxEventLister.startElementNS): Normalize the filename attributes
4363 with os.path.normpath
4364 (sax_eventlist): New parameter filenames to pass through to
4365 SaxEventLister
4366
4367 * test/test_derivedshapestore.py: Make this file callable as a
4368 program to execute the tests
4369 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
4370 the session to self.session so that it gets destroyed properly
4371
4372 * test/test_layer.py (TestLayer.tearDown): Call the session's
4373 Destroy method
4374
4375 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
4376 too if it exists
4377 (TestMapAddLayer.test_add_layer): Bind the session to self.session
4378 so that it gets destroyed properly
4379
4380 * test/postgissupport.py (reason_for_not_running_tests): Add a
4381 test for the existence of popen2.Popen4.
4382
4383 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4384 reliable way to destroy the sessions created in the test cases
4385 (SaveSessionTest.test_dbf_table): Bind the session to self.session
4386 so that it gets destroyed properly
4387 (SaveSessionTest.testLayerProjection): Bind the session to
4388 self.session so that it gets destroyed properly
4389
4390 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4391 sure that the session is destroyed properly
4392
4393 * test/test_shapefilestore.py: Make this callable as a program to
4394 execute the tests
4395
4396 * test/test_scalebar.py: Remove unnecessary import of _ from
4397 Thuban
4398
4399 * test/support.py (print_garbage_information): Call initthuban
4400 here because it may be called indirectly from test cases that test
4401 test support modules which do not use anything from thuban itself
4402 (ThubanTestProgram.runTests): Remove unnecessary debug print
4403
4404 2003-08-28 Bernhard Herzog <[email protected]>
4405
4406 * Thuban/version.py (longversion): Update to 0.9
4407
4408 * Thuban/UI/mainwindow.py: Remove some unused imports
4409
4410 * README: Add section about required additional software. Add date
4411 and revision CVS keywords
4412
4413 * HOWTO-Release: Add item about the translations. Add date and
4414 revision CVs keywords and change formatting to match README a bit
4415 better
4416
4417 * po/de.po: Update for 0.9
4418
4419 * test/README: Tweak the wording a little because many tests are
4420 not really unittest.
4421
4422 2003-08-27 Bernhard Herzog <[email protected]>
4423
4424 As preparation for the 0.9 release, switch thuban files to a
4425 non-dev namespace
4426
4427 * Thuban/Model/save.py (SessionSaver.write_session): Write files
4428 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4429 namespace
4430
4431 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4432 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4433
4434 * test/test_save.py (SaveSessionTest.dtd)
4435 (SaveSessionTest.testEmptySession)
4436 (SaveSessionTest.testSingleLayer)
4437 (SaveSessionTest.testLayerProjection)
4438 (SaveSessionTest.testRasterLayer)
4439 (SaveSessionTest.testClassifiedLayer)
4440 (SaveSessionTest.test_dbf_table)
4441 (SaveSessionTest.test_joined_table)
4442 (SaveSessionTest.test_save_postgis): Update for new namespace
4443
4444 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4445 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4446 (TestLayerProjection.file_contents)
4447 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4448 (TestPostGISLayer.file_contents)
4449 (TestPostGISLayerPassword.file_contents)
4450 (TestLoadError.file_contents, TestLoadError.test): Update for new
4451 namespace
4452
4453 2003-08-27 Bernhard Herzog <[email protected]>
4454
4455 Make the table interface distinguish between row ids (an integer
4456 that uniquely identifies a row) and row ordinals (a simple row
4457 count from 0 to NumRows() - 1)
4458
4459 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4460 (PostGISTable.RowOrdinalToId): New methods to conver between row
4461 ids and row ordinals
4462 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4463 parameter row_is_ordinal to indicate whether the row parameter is
4464 the row id or the ordinal
4465
4466 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4467 (TransientTableBase.RowOrdinalToId)
4468 (AutoTransientTable.RowIdToOrdinal)
4469 (AutoTransientTable.RowOrdinalToId): Same new methods as in
4470 PostGISTable.
4471 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4472 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4473 Same new parameter as in PostGISTable.
4474
4475 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4476 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4477 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4478 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4479 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4480 parameter as in PostGISTable.
4481
4482 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4483 (DataTable.RowOrdinalToId): New methods to convert between row ids
4484 and row ordinals.
4485 (TableGrid.SelectRowById): New method to select a row based on its
4486 ID as opposed to its ordinal
4487 (DataTable.GetValue, TableGrid.OnRangeSelect)
4488 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4489 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4490 (LayerTableFrame.__init__): Convert between row ids and row
4491 ordinals as appropriate
4492
4493 * test/postgissupport.py (PostGISDatabase.__init__): Add
4494 doc-string.
4495 (PostGISDatabase.initdb): The optional third item in a tuple in
4496 tables is now a (key, value) list with additional arguments to
4497 pass to upload_shapefile
4498 (upload_shapefile): New parameter gid_offset to allow gids that
4499 are not the same as the shapeids in the shapefile
4500 (PostgreSQLServer.get_default_static_data_db): Use the new
4501 gid_offset to make the gids in landmarks 1000 higher than the
4502 shapeids in the shapefile
4503
4504 * test/test_viewport.py
4505 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4506 new shapeids in the landmarks table
4507
4508 * test/test_transientdb.py
4509 (TestTransientTable.run_iceland_political_tests)
4510 (TestTransientTable.test_transient_joined_table): Add tests for
4511 the new table methods and new keywords arguments.
4512
4513 * test/test_postgis_db.py
4514 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4515 (TestPostGISTable.test_read_value_row_count_mode)
4516 (TestPostGISTable.test_row_id_to_ordinal)
4517 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4518 table methods and the new arguments
4519 (TestPostGISShapestorePoint.test_shapes_in_region)
4520 (TestPostGISShapestorePoint.test_shape_raw_data)
4521 (TestPostGISShapestorePoint.test_shape_points)
4522 (TestPostGISShapestorePoint.test_shape_shapeid)
4523 (TestPostGISShapestorePoint.test_all_shapes)
4524 (TestPostGISTable.test_simple_query)
4525 (TestPostGISTable.test_simple_query)
4526 (TestPostGISTable.test_simple_query)
4527 (TestPostGISTable.test_read_value)
4528 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4529 shapeids in the landmarks table
4530
4531 * test/test_memory_table.py
4532 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4533 (TestMemoryTable.test_read_value_row_count_mode)
4534 (TestMemoryTable.test_row_id_to_ordinal)
4535 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4536 table methods and the new arguments
4537
4538 * test/test_dbf_table.py
4539 (TestDBFTable.test_read_row_as_dict_row_count_mode)
4540 (TestDBFTable.test_read_value_row_count_mode)
4541 (TestDBFTable.test_row_id_to_ordinal)
4542 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4543 methods and the new arguments
4544
4545 2003-08-26 Bernhard Herzog <[email protected]>
4546
4547 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4548 more postgis specific but much faster method to get the bounding
4549 box
4550
4551 2003-08-26 Bernhard Herzog <[email protected]>
4552
4553 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4554 (PostGISShapeStore.AllShapes): Add these missing methods.
4555 (PostGISShapeStore.ShapesInRegion): No need to raise
4556 StopIteration. We can simply return
4557
4558 * test/test_postgis_db.py (TestPostGISTable.test_title)
4559 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4560 new methods
4561
4562 2003-08-25 Bernhard Herzog <[email protected]>
4563
4564 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4565
4566 * test/test_postgis_db.py (PolygonTests): New class containing
4567 those tests from TestPostGISShapestorePolygon that can also be
4568 used to test MUTLIPOLYGON tables
4569 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4570 so derive from that
4571 (TestPostGISShapestoreMultiPolygon): New class with tests for
4572 MUTLIPOLYGON tables
4573
4574 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4575 tables argument to have tuples with three items to override the
4576 WKT type used.
4577 (PostgreSQLServer.get_default_static_data_db): Use the above to
4578 create a polygon table with MUTLIPOLYGONs
4579 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4580 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4581 coords_to*
4582 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4583 (wkt_converter): New. Map WKT types to converters
4584 (upload_shapefile): New parameter force_wkt_type to use a
4585 different WKT type than the default
4586
4587 2003-08-25 Bernhard Herzog <[email protected]>
4588
4589 * Thuban/UI/application.py
4590 (ThubanApplication.run_db_param_dialog): New. Suitable as a
4591 db_connection_callback. Main difference is that the dialog run
4592 from this method doesn't have a parent so it can be used even when
4593 there is no main window
4594 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4595 no db_connection_callback was given. This way the dialog pops up
4596 even when the .thuban file was given as a command line parameter.
4597
4598 2003-08-25 Bernhard Herzog <[email protected]>
4599
4600 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4601 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4602 which leads to an effectively frozen X session because the user
4603 can only interact with the dialog but the mouse is still grabbed
4604 by the canvas.
4605 Also, call the tool's Hide method before MouseLeftUp because
4606 MouseLeftUp may change the tool's coordinates.
4607
4608 2003-08-25 Bernhard Herzog <[email protected]>
4609
4610 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4611 LoadCancelled exceptions and handle them by returning immediately.
4612
4613 2003-08-25 Bernhard Herzog <[email protected]>
4614
4615 GUI part of loading sessions with postgis connections which may
4616 require user interaction to get passwords or updated parameters
4617
4618 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4619 bit nucer and be more generic.
4620 (DBFrame.OnAdd): Adapt to new DBDialog interface
4621
4622 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4623 optional parameter db_connection_callback which is passed to
4624 load_session.
4625
4626 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4627 Suitable as a db_connection_callback
4628 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4629 db_connection_callback of the application's OpenSession method
4630
4631
4632 2003-08-25 Bernhard Herzog <[email protected]>
4633
4634 Basic loading of sessions containing postgis connections:
4635
4636 * Thuban/Model/load.py (LoadError): Add doc-string
4637 (LoadCancelled): New exception class to indicate a cancelled load
4638 (SessionLoader.__init__): Add the db_connection_callback parameter
4639 which will be used by the loader to get updated parameters and a
4640 password for a database connection
4641 (SessionLoader.__init__): Add the new XML elements to the
4642 dispatchers dictionary
4643 (SessionLoader.check_attrs): Two new conversions, ascii to convert
4644 to a byte-string object and idref as a generic id reference
4645 (SessionLoader.start_dbconnection)
4646 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4647 elements
4648 (load_session): Add the db_connection_callback to pass through the
4649 SessionLoader
4650
4651 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4652 New classes to test loading of sessions with postgis database
4653 connections.
4654
4655 2003-08-25 Bernhard Herzog <[email protected]>
4656
4657 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4658 replace it and the comment with __BuildDate__ by the Source: and
4659 Id: cvs keywords as used in the other files.
4660
4661 2003-08-25 Bernhard Herzog <[email protected]>
4662
4663 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4664 LoadError when a required attribute is missing. The code used to
4665 be commented out for some reason, but probably should have been
4666 active.
4667
4668 * test/test_load.py (TestLoadError.test): Test the message in the
4669 LoadError too to make sure it really is about the missing
4670 attribute
4671
4672 2003-08-22 Bernhard Herzog <[email protected]>
4673
4674 * test/test_save.py (SaveSessionTest.test_dbf_table)
4675 (SaveSessionTest.test_joined_table): Add XML validation tests.
4676
4677 2003-08-22 Bernhard Herzog <[email protected]>
4678
4679 Implement saving a session with a postgis connection
4680
4681 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4682 elements for database connections and shapestores using db
4683 connections
4684 (session): Add the dbconnections to the content model
4685
4686 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4687 Write the db connections
4688 (SessionSaver.write_session): Call write_db_connections to write
4689 the connection before the data sources
4690 (SessionSaver.write_data_containers): Handle postgis shapestores
4691
4692 * test/test_save.py (SaveSessionTest.thubanids)
4693 (SaveSessionTest.thubanidrefs): Update for new DTD
4694 (SaveSessionTest.test_save_postgis): New. Test saving a session
4695 with postgis connections
4696
4697 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4698 (PostGISTable.TableName): New accessor methods for the connection
4699 and table name
4700
4701 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4702 (TestPostGISTable.test_dbname): New methods to test the new
4703 PostGISConnection methods
4704
4705 2003-08-22 Bernhard Herzog <[email protected]>
4706
4707 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4708 for exceptions occurring when establishing a Database connection
4709 (PostGISConnection.connect): Catch psycopg.OperationalError during
4710 connects and raise ConnectionError.
4711
4712 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4713 tests for database exceptions
4714
4715 2003-08-22 Bernhard Herzog <[email protected]>
4716
4717 Prepare the test suite for tests with required authentication
4718
4719 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4720 variables with two predefined users/passwords, one for the admin
4721 and one for a non-privileged user.
4722 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4723 the non-privileged user to the database and set the admin password
4724 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4725 Better error reporting
4726 (PostgreSQLServer.connection_params)
4727 (PostgreSQLServer.connection_string): New methods to return
4728 information about how to connect to the server
4729 (PostgreSQLServer.execute_sql): New. Convenience method to execute
4730 SQL statements
4731 (PostgreSQLServer.require_authentication): Toggle whether the
4732 server requires authentication
4733 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4734 Add or alter users
4735 (PostGISDatabase.initdb): Pass the admin name one the
4736 subprocesses' command lines. Grant select rights on
4737 geometry_columns to everybody.
4738 (upload_shapefile): Use the admin name and password when
4739 connecting. Grant select rights on the new table to everybody.
4740
4741 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4742 server's new methods to get the connection parameters.
4743
4744 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4745 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4746 server's new methods to get the connection parameters.
4747
4748 * test/test_postgis_db.py
4749 (TestPostGISConnection.test_gis_tables_empty)
4750 (TestPostGISConnection.test_gis_tables_non_empty)
4751 (PostGISStaticTests.setUp): Use the server's new methods to get
4752 the connection parameters.
4753
4754 2003-08-22 Bernhard Herzog <[email protected]>
4755
4756 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4757
4758 * Thuban/version.py: Add psycopg version
4759
4760 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4761 version of the psycopg module
4762
4763 2003-08-22 Bernhard Herzog <[email protected]>
4764
4765 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4766 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4767 at the moment. The functionality should probably be implemented
4768 some time, though.
4769 (DBFrame.OnRemove): Display a message if the connection can't be
4770 removed because it's still in use.
4771
4772 2003-08-22 Jan-Oliver Wagner <[email protected]>
4773
4774 * Thuban/UI/about.py (About.__init__): split up the huge about
4775 text into elements/lists for easier translation. This fixes bug
4776 https://intevation.de/rt/webrt?serial_num=2058
4777 Also, made some forgotten string available for the i18n.
4778
4779 2003-08-21 Bernhard Herzog <[email protected]>
4780
4781 Make postgis support really optional including insensitive menu
4782 items.
4783
4784 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4785 whether the postgis is supported.
4786
4787 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4788 to make postgis support optional
4789
4790 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4791 version of Thuban.Model.postgisdb.has_postgis_support
4792 (database_management command): Make it only sensitive if postgis
4793 is supported.
4794
4795 2003-08-21 Jan-Oliver Wagner <[email protected]>
4796
4797 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4798 (section Adding and Removing Layers): Added text and described
4799 multi-selection.
4800 (chapter Extensions): New.
4801
4802 2003-08-21 Jan-Oliver Wagner <[email protected]>
4803
4804 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4805 settings to allow multiple files to load into the map.
4806 Also reduced selection to *.shp as a default.
4807
4808 2003-08-20 Bernhard Herzog <[email protected]>
4809
4810 Add dialogs and commands to open database connections and add
4811 database layers.
4812
4813 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4814 method to open the database connection management dialog
4815 (MainWindow.AddDBLayer): New method to add a layer from a database
4816 (_has_dbconnections): New helper function to use for sensitivity
4817 (database_management command, layer_add_db command): New commands
4818 that call the above new methods.
4819 (main_menu): Add the new commands to the menu.
4820
4821 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4822 (PostGISConnection.connect): Establish the actual connection in a
4823 separate method and call it in __init__. This makes it easier to
4824 override the behavior in test cases
4825 (PostGISConnection.BriefDescription): New method to return a brief
4826 description for use in dialogs.
4827
4828 * test/test_postgis_db.py (NonConnection): DB connection that
4829 doesn't actually connect
4830 (TestBriefDescription): New class with tests for the new
4831 BriefDescription method
4832
4833 2003-08-19 Jan-Oliver Wagner <[email protected]>
4834
4835 Moved anything from extensions to libraries.
4836
4837 * libraries: New.
4838
4839 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4840
4841 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4842 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4843 been moved here from thuban/extensions/pyprojection/
4844 See there in the Attic for the older history.
4845
4846 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4847 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4848 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4849 have been moved here from thuban/extensions/pyshapelib/
4850 See there in the Attic for the older history.
4851
4852 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4853 files have been moved here from thuban/extensions/shapelib/
4854 See there in the Attic for the older history.
4855
4856 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4857 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4858 thuban/extensions/thuban/
4859 See there in the Attic for the older history.
4860
4861 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4862
4863 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4864 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4865
4866 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4867 Moved to libraries/shapelib.
4868
4869 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4870 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4871 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4872 Moved to libraries/pyshapelib.
4873
4874 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4875 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4876 Moved to libraries/pyprojection.
4877
4878 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4879
4880 * extensions: Removed.
4881
4882 2003-08-19 Bernhard Herzog <[email protected]>
4883
4884 * test/test_viewport.py (ViewPortTest): We don't use the
4885 facilities of FileTestMixin so don't derive from it.
4886 (TestViewportWithPostGIS): New class with tests for using a
4887 viewport on a map with postgis layers.
4888
4889 2003-08-19 Bernhard Herzog <[email protected]>
4890
4891 Add the db connection management to the session.
4892
4893 * Thuban/Model/session.py (Session.__init__): New instance
4894 variable db_connections
4895 (Session.AddDBConnection, Session.DBConnections)
4896 (Session.HasDBConnections, Session.CanRemoveDBConnection)
4897 (Session.RemoveDBConnection): New methods to manage and query the
4898 db connections managed by the session
4899 (Session.OpenDBShapeStore): New method to open a shapestore from a
4900 db connection
4901
4902 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4903 messages for the db connection handling in the session
4904
4905 * test/test_postgis_session.py: New. test cases for the session's
4906 db connection handling with postgis connections
4907
4908 2003-08-19 Bernhard Herzog <[email protected]>
4909
4910 Add very basic postgis database support and the corresponding test
4911 cases. The test cases require a PostgreSQL + postgis installation
4912 but no existing database. The database will be created
4913 automatically by the test cases
4914
4915 * test/README: Add note about skipped tests and the requirements
4916 of the postgis tests.
4917
4918 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4919
4920 * test/test_postgis_db.py: New. Test cases for the postgis
4921 support.
4922
4923 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4924 format
4925
4926 * test/test_wellknowntext.py: New. Test cases for the
4927 wellknowntext parser
4928
4929 * test/postgissupport.py: New. Support module for tests involving
4930 a postgis database.
4931
4932 * test/support.py (execute_as_testsuite): Shut down the postmaster
4933 if it's still running after the tests
4934
4935 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4936 well known text format
4937
4938 2003-08-19 Jan-Oliver Wagner <[email protected]>
4939
4940 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4941 message dialog.
4942
4943 2003-08-18 Bernhard Herzog <[email protected]>
4944
4945 * test/support.py (ThubanTestResult.printErrors): Indent the
4946 reason for the skips in the output to make it a bit more readable.
4947 (execute_as_testsuite): New helper function to run a test suite
4948 and print some more information.
4949 (run_tests): Use execute_as_testsuite to run the tests
4950
4951 * test/runtests.py (main): Use execute_as_testsuite to run the
4952 tests
4953
4954 2003-08-18 Bernhard Herzog <[email protected]>
4955
4956 Fix some bugs in Thuban and the test suite that were uncovered by
4957 changes introduced in Python 2.3:
4958
4959 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4960 filename is an absolute name
4961
4962 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4963 filename is an absolute name
4964
4965 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4966 unique filename to save to and use the correct relative filename
4967 in the expected output.
4968 (SaveSessionTest.test_dbf_table): Use the correct relative
4969 filename in the expected output.
4970
4971 * test/test_layer.py (TestLayer.test_raster_layer): Update the
4972 test to check whether the filename is absolute.
4973
4974 2003-08-18 Jan-Oliver Wagner <[email protected]>
4975
4976 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4977
4978 2003-08-15 Bernhard Herzog <[email protected]>
4979
4980 Change the way shapes are returned by a shape store. The
4981 ShapesInRegion method returns an iterator over actual shape
4982 objects instead of a list of shape ids.
4983
4984 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4985 id.
4986 (ShapefileStore.ShapesInRegion): Return an iterator over the
4987 shapes which yields shape objects instead of returning a list of
4988 shape ids
4989 (ShapefileStore.AllShapes): New. Return an iterator over all
4990 shapes in the shape store
4991 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4992
4993 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4994 doc-string.
4995
4996 * Thuban/UI/baserenderer.py
4997 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4998 layer_shapes and make it return an iterator containg shapes
4999 instead of a list of ids.
5000 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5001 layer_shapes() change
5002
5003 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5004 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5005
5006 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5007 changes in the ShapesInRegion return value.
5008 (ViewPort._get_hit_tester): Remove commented out code
5009
5010 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5011 new return value.
5012 (SimpleShapeStore.AllShapes): New. Implement this method too.
5013
5014 * test/test_layer.py (TestLayer.test_arc_layer)
5015 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5016 (TestLayer.test_point_layer_with_projection)
5017 (TestLayer.test_derived_store): Adapt to changes in the
5018 ShapesInRegion return value.
5019
5020 * test/test_shapefilestore.py
5021 (TestShapefileStoreArc.test_shapes_in_region)
5022 (TestShapefileStorePolygon.test_shapes_in_region)
5023 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5024 in the ShapesInRegion return value.
5025 (TestShapefileStorePoint.test_all_shapes)
5026 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5027 methods
5028
5029 * test/test_derivedshapestore.py
5030 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5031 the ShapesInRegion return value.
5032 (TestDerivedShapeStore.test_all_shapes)
5033 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5034 methods
5035
5036 2003-08-15 Bernhard Herzog <[email protected]>
5037
5038 Make the renderers deal correctly with raw vs. python level
5039 representation of shape geometries
5040
5041 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5042 Return a flag useraw in addition to the callable and the parameter
5043 to indicate whether the callable can deal with the raw shape data
5044 or uses the higher level python lists of coordinates. The callable
5045 now should accept either the raw data or the return value of the
5046 shape's Points() method.
5047 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5048 change
5049 (BaseRenderer.projected_points): Instead of the shape id use the
5050 points list as parameter.
5051 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5052 (BaseRenderer.draw_point_shape): Adapt to projected_points()
5053 change and accept the points list as parameter instead of the
5054 shape id.
5055
5056 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5057 the useraw flag as required by the BaseRenderer
5058 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5059 changes.
5060
5061 * test/test_baserenderer.py
5062 (TestBaseRenderer.test_point_with_classification): New test for
5063 rendering a map with classifications.
5064
5065 2003-08-15 Bernhard Herzog <[email protected]>
5066
5067 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5068 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5069 (ViewPort._get_hit_tester, ViewPort.projected_points)
5070 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5071 (ViewPort._find_label_at): Split the find_shape_at method into
5072 several new methods and use the functions in the hit-test module.
5073
5074 * Thuban/UI/hittest.py: New module with Python-level hit-testing
5075 functions
5076
5077 * test/test_hittest.py: New. Test for the new hittest module
5078
5079 2003-08-15 Bernhard Herzog <[email protected]>
5080
5081 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5082 projection to all corners of the bounding box to get a better
5083 approximation of the projected bounding box
5084
5085 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5086 New. Test coordinate handling of a layer with a projection.
5087 Catches the bug fixed in Layer.ShapesInRegion
5088
5089 2003-08-15 Bernhard Herzog <[email protected]>
5090
5091 Move some of the mock objects in test_baserenderer into their own
5092 module so they can easily be used from other tests
5093
5094 * test/mockgeo.py: New test helper module with some mock objects
5095 for geometry related things like shapes, shapestores and
5096 projections.
5097
5098 * test/test_mockgeo.py: New. Tests for the new helper module
5099
5100 * test/test_baserenderer.py: Some of the mock-objects are in
5101 mockgeo now.
5102
5103 2003-08-12 Jan-Oliver Wagner <[email protected]>
5104
5105 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5106
5107 2003-08-12 Bernhard Herzog <[email protected]>
5108
5109 * po/de.po: New. German translations by Bjoern Broscheit
5110
5111 2003-08-12 Bernhard Herzog <[email protected]>
5112
5113 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5114 strings have to be one string literal.
5115
5116 2003-08-11 Bernhard Herzog <[email protected]>
5117
5118 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5119 New. This method was used in various derived classes, but it's
5120 better to have it here.
5121
5122 * test/test_shapefilestore.py
5123 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5124 FloatComparisonMixin
5125
5126 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5127 It's now in FloatComparisonMixin
5128
5129 * test/test_derivedshapestore.py
5130 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5131 in FloatComparisonMixin
5132
5133 2003-08-11 Bernhard Herzog <[email protected]>
5134
5135 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5136 error message
5137
5138 2003-08-08 Jan-Oliver Wagner <[email protected]>
5139
5140 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5141 with version number.
5142 Changed title to reflect version number of Thuban.
5143
5144 2003-08-08 Jan-Oliver Wagner <[email protected]>
5145
5146 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5147 the list corresponds to the "About" web page.
5148
5149 2003-08-08 Bernhard Herzog <[email protected]>
5150
5151 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5152 Make sure translated strings are recognized as one string literal.
5153
5154 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5155 Make sure translated strings are recognized as one string literal.
5156
5157 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5158 translated strings are recognized as one string literal.
5159
5160 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5161 sure translated strings are recognized as one string literal.
5162
5163 2003-08-07 Bernhard Herzog <[email protected]>
5164
5165 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5166 Simply delegates to the original shapestore.
5167
5168 * test/test_derivedshapestore.py
5169 (TestDerivedShapeStore.test_raw_format): New. Test case for
5170 DerivedShapeStore.RawShapeFormat
5171
5172 2003-08-07 Bernhard Herzog <[email protected]>
5173
5174 Add raw data interface to shape objects.
5175
5176 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5177 class to ShapefileShape which now holds shapefile specific
5178 information.
5179 (ShapefileShape.compute_bbox): Simplified to not cache any
5180 information. The way this method is used that shouldn't matter
5181 performance wise.
5182 (ShapefileShape.RawData): New. Return the shapeid which is the raw
5183 data format for shapes from shapefiles.
5184 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5185 in the shape objects returned by a shapestore. For a
5186 ShapefileStore this is always RAW_SHAPEFILE.
5187 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5188 method.
5189
5190 * test/test_shapefilestore.py
5191 (TestShapefileStore.test_raw_format): New test to test the raw
5192 format feature of shapes.
5193
5194 * Thuban/Model/layer.py: Remove the unused import of Shape from
5195 data. It was only there for interface compatibility but it's not
5196 used inside of Thuban and the generic Shape class has gone away.
5197
5198 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5199 the raw data format and only use an optimized version of its a
5200 shapefile.
5201
5202 2003-08-07 Bernhard Herzog <[email protected]>
5203
5204 * test/test_baserenderer.py (SimpleShape): Shape class for the
5205 tests.
5206 (SimpleShapeStore.Shape): Use SimpleShape instead of
5207 Thuban.Model.data.Shape to make the tests independed of the coming
5208 changes.
5209
5210 2003-08-07 Bernhard Herzog <[email protected]>
5211
5212 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5213 (ThubanTestProgram): New classes that extend the respective
5214 classes from unittest. These new version support skipping tests
5215 under certain expected conditions. In the Thuban test suite we
5216 uses this for tests that require the optional gdal support.
5217 (run_tests): Use ThubanTestProgram instead of the unittest.main()
5218
5219 * test/runtests.py (main): Use the new ThubanTestRunner instead of
5220 the normal one from unittest
5221
5222 * test/test_layer.py (TestLayer.test_raster_layer): If this test
5223 is not run because gdal support isn't available report this to the
5224 runner.
5225
5226 * test/test_baserenderer.py
5227 (TestBaseRenderer.test_raster_no_projection): Do not run this test
5228 if gdal support isn't available and report this to the runner.
5229
5230 2003-08-06 Bernhard Herzog <[email protected]>
5231
5232 Rearrange the renderers a bit, partly in preparation for changes
5233 required for the postgis merge, partly to make it more testable.
5234 Also make the representation of coordinates in Shapes more
5235 consistent.
5236
5237 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5238 this class is now in BaseRenderer. This class is now practically
5239 only a specialization of BaseRenderer for rendering to an actual
5240 wx DC.
5241 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5242 to get the shapetype specific rendering functions.
5243
5244 * Thuban/UI/baserenderer.py: New file with the basic rendering
5245 logic. The code in this file is completely independend of wx.
5246 (BaseRenderer): Class with the basic rendering logic
5247
5248 * test/test_baserenderer.py: New. Test cases for BaseRenderer
5249
5250 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5251 error_on_redraw to guard agains endless loops and stack overflows
5252 when there's a bug in the rendering code that raises exceptions.
5253 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5254 rendering into a separate method _do_redraw so that error handling
5255 is a bit easier. When an exception occurs, set error_on_redraw to
5256 true. When it's true on entry to OnIdle do nothing and return
5257 immediately.
5258
5259 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5260 Shape object will always have the coordinates as a list of list of
5261 coordinate pairs (tuples).
5262 (Shape.compute_bbox): Adapt to new representation.
5263
5264 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5265 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5266 Shape objects.
5267
5268 * test/test_shapefilestore.py
5269 (ShapefileStoreTests.assertFloatTuplesEqual)
5270 (ShapefileStoreTests.assertPointListEquals): Rename to
5271 assertPointListEquals and change purpose to checking equality of
5272 the lists returned by Shape.Points().
5273 (TestShapefileStoreArc.test_shape)
5274 (TestShapefileStorePolygon.test_shape)
5275 (TestShapefileStorePoint.test_shape): Use the new
5276 assertPointListEquals instead of assertFloatTuplesEqual
5277
5278 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5279 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5280 and change purpose to checking equality of the lists returned by
5281 Shape.Points().
5282 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5283 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5284 (TestLayer.test_derived_store): Use the new assertPointListEquals
5285 instead of assertFloatTuplesEqual
5286
5287 * test/test_derivedshapestore.py
5288 (TestDerivedShapeStore.assertFloatTuplesEqual)
5289 (TestDerivedShapeStore.assertPointListEquals): Rename to
5290 assertPointListEquals and change purpose to checking equality of
5291 the lists returned by Shape.Points().
5292 (TestDerivedShapeStore.test_shape): Use the new
5293 assertPointListEquals instead of assertFloatTuplesEqual
5294
5295 2003-08-06 Jan-Oliver Wagner <[email protected]>
5296
5297 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
5298 a bounding box. A dialog is raised in case, no bounding box
5299 is found. This fixes bug #2043:
5300 https://intevation.de/rt/webrt?serial_num=2043
5301
5302 2003-08-05 Bernhard Herzog <[email protected]>
5303
5304 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
5305 object look like a Color instantiation. Formerly it looked like a
5306 tuple.
5307
5308 * test/test_color.py (TestColor.test_repr)
5309 (TestColor.test_equality, TestColor.test_inequality): New. test
5310 some more apects of the Color class
5311 (TestTransparent.test_repr, TestTransparent.test_hex)
5312 (TestTransparent.test_equality): New. Test cases for the
5313 Transparent object.
5314
5315 2003-08-04 Jan-Oliver Wagner <[email protected]>
5316
5317 * Doc/manual/thuban-manual.xml: a number of small improvements.
5318 The resulting file is the version submitted for GREAT-ER II.
5319
5320 2003-08-01 Bernhard Herzog <[email protected]>
5321
5322 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
5323 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
5324 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
5325
5326 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
5327 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
5328 (ThubanEndBusyCursor): Add doc-strings
5329
5330 2003-08-01 Bernhard Herzog <[email protected]>
5331
5332 First step towards PostGIS integration. More abstraction by movin
5333 more code from the layer to the shapestore. More methods of the
5334 layer are now simply delegated to the equivalent method of the
5335 shapestore. The SHAPETYPE_* constants are now in data not in
5336 layer.
5337
5338 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5339 (SHAPETYPE_POINT, Shape): Move these constants and classes from
5340 layer.py to data.py
5341 (ShapefileStore.__init__): More Initialization for the new methods
5342 and functionality.
5343 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
5344 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
5345 (ShapefileStore.Shape): New methods that were formerly implemented
5346 in the layer.
5347 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
5348 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
5349 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
5350 equivalents of the new shape methods. These versions are simply
5351 delegated to the original shapstore.
5352
5353 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5354 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
5355 (Layer.SetShapeStore): Removed the initializatin of instance
5356 variables that were needed for the stuff that's now in
5357 ShapefileStore
5358 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
5359 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
5360 shapestore.
5361
5362 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
5363 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
5364 instead of layer.
5365
5366 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
5367
5368 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
5369
5370 * test/test_layer.py: Import the SHAPETYPE_* constants from data
5371 instead of layer.
5372 (TestLayer.test_derived_store): Remove the test for the exception
5373 when instantiating the DerivedShapeStore with an incompatible
5374 table which is now in test_derivedshapestore.py. Add some more
5375 tests of the layer methods to determine whether they work for a
5376 DerivedShapeStore as well.
5377
5378 2003-07-31 Jonathan Coles <[email protected]>
5379
5380 * Doc/manual/thuban-manual.xml: Fix the list of required packages
5381 by just listing the name and where they can be found.
5382
5383 2003-07-31 Frank Koormann <[email protected]>
5384
5385 * Doc/manual/thuban-manual.xml:
5386 Changed the screenshot elements to figure.
5387 Changed some variablelist elements to itemizedlist.
5388 Added section on GDAL formats.
5389
5390 2003-07-31 Jonathan Coles <[email protected]>
5391
5392 * Doc/manual/thuban-manual.xml: Added a few sentences about
5393 the Fix Border Color option when generating classes.
5394
5395 2003-07-30 Jonathan Coles <[email protected]>
5396
5397 * Thuban/Model/classgen.py: Add docstrings. Rename specific
5398 Ramp instances to use lower_case_style.
5399
5400 * Thuban/UI/classgen.py: Use renamed Ramp instances.
5401
5402 * Thuban/UI/classifier.py: Add docstrings.
5403
5404 * Thuban/UI/dock.py: Add docstrings.
5405
5406 * test/test_classgen.py: Use renamed Ramp instances.
5407
5408 2003-07-30 Bernhard Herzog <[email protected]>
5409
5410 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5411 was never used in Thuban.
5412
5413 2003-07-30 Bernhard Herzog <[email protected]>
5414
5415 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5416 method directly instead of going through the transient_table
5417 method. This faster because transient_table may force the copy of
5418 a DBF file into the transient database and setting a table's title
5419 doesnm't affect the title of the associated transient table, so
5420 this fixes RT #2042
5421
5422 * Thuban/UI/main.py (__version__): Don't import the already
5423 removed show_exception_dialog.
5424
5425 2003-07-29 Jonathan Coles <[email protected]>
5426
5427 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5428 Put back this method and remove the equivalent function since we
5429 are setting the exception hook from within this class (OnInit).
5430
5431 2003-07-29 Jonathan Coles <[email protected]>
5432
5433 * Doc/manual/images/5_2_custom_ramp.png,
5434 Doc/manual/images/5_2_quantiles.png,
5435 Doc/manual/images/5_2_uniform_dist.png,
5436 Doc/manual/images/5_2_unique_values.png,
5437 Doc/manual/images/8_int_error.png: New screen shots.
5438
5439 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5440 some points, and added more screen shots.
5441
5442 2003-07-29 Bernhard Herzog <[email protected]>
5443
5444 * Thuban/Model/data.py: Remove the now unused import of warnings
5445
5446 2003-07-29 Bernhard Herzog <[email protected]>
5447
5448 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5449 deprecated since before the 0.8 release and isn't used in Thuban
5450 itself anymore.
5451
5452 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5453
5454 2003-07-29 Jonathan Coles <[email protected]>
5455
5456 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5457 python exception hook here so that we are sure to catch any
5458 Thuban exception that happen during initialization.
5459
5460 * Thuban/UI/main.py (main): Don't set the exception hook here,
5461 it will get set in ThubanApplication.OnInit.
5462
5463 2003-07-29 Jonathan Coles <[email protected]>
5464
5465 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5466 Removed and called it show_exception_dialog() so that the exception
5467 handler can be set before the class is created.
5468
5469 * Thuban/UI/main.py (main): Install the exception handler before
5470 a ThubanApplication is created.
5471
5472 2003-07-29 Bernhard Herzog <[email protected]>
5473
5474 * po/it.po: New. Italian translation by Maurizio Napolitano
5475
5476 * po/ru.po: New. Russian translation by Alex Shevlakov
5477
5478 2003-07-29 Frank Koormann <[email protected]>
5479
5480 * Doc/manual/thuban-manual.xml: Extended section on supported
5481 projections.
5482
5483 2003-07-29 Frank Koormann <[email protected]>
5484
5485 * Doc/manual/thuban-manual.xml: gaspell-checked.
5486
5487 2003-07-29 Jonathan Coles <[email protected]>
5488
5489 * Doc/manual/images/3_5_legend.png: Added border to improve look
5490 on white background.
5491
5492 2003-07-29 Jonathan Coles <[email protected]>
5493
5494 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5495 descriptions for the legend toolbar.
5496
5497 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5498 cursor from dialog box.
5499
5500 2003-07-28 Jonathan Coles <[email protected]>
5501
5502 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5503
5504 * Doc/manual/images/2_4_session_tree.png,
5505 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5506 Doc/manual/images/4_2_layer_properties.png,
5507 Doc/manual/images/4_2_raster_layer_properties.png,
5508 Doc/manual/images/5_3_genclass.png,
5509 Doc/manual/images/5_classification.png,
5510 Doc/manual/images/6_projection.png,
5511 Doc/manual/images/7_1_table_view.png,
5512 Doc/manual/images/7_2_5_join.png: New screenshots.
5513
5514 2003-07-24 Jonathan Coles <[email protected]>
5515
5516 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5517
5518 2003-07-24 Jonathan Coles <[email protected]>
5519
5520 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5521 chapter on Layer Management.
5522
5523 * Doc/manual/Makefile: New. Makefile to generate all formats for the
5524 manual and images.
5525
5526 2003-07-24 Bernhard Herzog <[email protected]>
5527
5528 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5529 it annoys lintian which warns about these files not being
5530 executable. The #! isn't necessary here since if you absolutely
5531 must execute them you can always say "python <filename>".
5532
5533 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5534 superfluous code to set brush and pen for point shapes
5535
5536 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5537 belong in viewport anyway
5538
5539 2003-07-24 Frank Koormann <[email protected]>
5540
5541 * Doc/manual/thuban-manual.xml: Added section on table management.
5542
5543 2003-07-24 Bernhard Herzog <[email protected]>
5544
5545 * test/runtests.py (main): Recognize the long "verbose" option
5546 correctly.
5547
5548 2003-07-22 Jonathan Coles <[email protected]>
5549
5550 * Doc/manual/thuban-manual.xml: Continue to write first revision
5551 of the manual.
5552
5553 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5554 with Begin/EndDrawing() calls to ensure we aren't doing to
5555 many updates to the dc during rendering.
5556 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5557 a pen and brush argument so they need to be passed to the function.
5558
5559 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5560 Calculates the minimum and maximum scale values. Factored out
5561 of set_view_transform so that it could be used to zoom all the
5562 way into a single point.
5563 (ViewPort.set_view_transform): Call calc_min_max_scales().
5564 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5565 if only a single point is selected.
5566
5567 * Doc/manual/images/1_2_legend_close.png,
5568 Doc/manual/images/1_2_legend_dock.png,
5569 Doc/manual/images/1_2_mainwindow.png,
5570 Doc/manual/images/1_2_mainwindow.ps,
5571 Doc/manual/images/1_2_mainwindow.sk,
5572 Doc/manual/images/3_2_fullextent.png,
5573 Doc/manual/images/3_2_fulllayerextent.png,
5574 Doc/manual/images/3_2_fullshapeextent.png,
5575 Doc/manual/images/3_2_pan.png,
5576 Doc/manual/images/3_2_zoomin.png,
5577 Doc/manual/images/3_2_zoomout.png,
5578 Doc/manual/images/3_3_identify.png,
5579 Doc/manual/images/3_3_label.png,
5580 Doc/manual/images/3_5_invisible.png,
5581 Doc/manual/images/3_5_movedown.png,
5582 Doc/manual/images/3_5_moveup.png,
5583 Doc/manual/images/3_5_props.png,
5584 Doc/manual/images/3_5_tobottom.png,
5585 Doc/manual/images/3_5_totop.png,
5586 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5587
5588 2003-07-18 Bernhard Herzog <[email protected]>
5589
5590 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5591
5592 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5593 after the new map has been assigned
5594
5595 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5596 Delegate MAP_REPLACED to the canvas too
5597 (MainWindow.prepare_new_session): Removed. Thanks to the new
5598 MAP_REPLACED message it's no longer needed
5599 (MainWindow.OpenSession, MainWindow.NewSession):
5600 prepare_new_session has been removed.
5601
5602 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5603 MAP_REPLACED so that we can close the dialog if a new map is set.
5604 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5605 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5606 dialog
5607
5608 * test/test_viewport.py (SimpleViewPortTest)
5609 (SimpleViewPortTest.test_default_size): Add doc-strings
5610 (ViewPortTest.setUp): Bind map to self.map so we can use it in
5611 tests. Subscribe to MAP_REPLACED messages too.
5612 (ViewPortTest.tearDown): No need to explicitly unsubscribe
5613 (ViewPortTest.test_set_map): New test for the SetMap method.
5614
5615 2003-07-18 Bernhard Herzog <[email protected]>
5616
5617 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5618 Move this test from ViewPortTest.setUp to this new separate test
5619 case. setUp is not the place for the actual tests.
5620 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5621 more of the test from setUp to the new test test_inital_settings.
5622 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5623 (ViewPortTest.test_proj_conv): Split test_proj_conv into
5624 test_win_to_proj and test_proj_to_win and make the tests easier to
5625 understand
5626 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5627 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5628 (ViewPortTest.test_unprojected_rect_around_point)
5629 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5630 Reformat to increase readability.
5631
5632 2003-07-18 Bernhard Herzog <[email protected]>
5633
5634 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5635
5636 2003-07-18 Bernhard Herzog <[email protected]>
5637
5638 * test/runtests.py: The test suite can now be run without an X
5639 connection. To make sure this remains true, remove the DISPLAY
5640 environment variable so that an error occurs if the wxGTK is
5641 imported accidentally
5642
5643 2003-07-18 Bernhard Herzog <[email protected]>
5644
5645 * Thuban/UI/viewport.py: Remove unused imports
5646
5647 * Thuban/UI/view.py: Remove unused imports
5648
5649 2003-07-18 Bernhard Herzog <[email protected]>
5650
5651 * test/test_export.py Remove unused imports. The OutputTransform
5652 function is now in viewport.py and is called output_transform
5653 (TestScalebar.test_output_transform)
5654 (TestScalebar.test_OutputTransform): Renamed to
5655 test_output_transform and updated to use output_transform instead
5656 of OutputTransform
5657
5658 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5659 renamed.
5660 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5661 renamed to output_transform
5662
5663 * Thuban/UI/viewport.py (OutputTransform, output_transform):
5664 Rename to output_transform
5665
5666 2003-07-18 Bernhard Herzog <[email protected]>
5667
5668 * Thuban/Model/layer.py (Layer.__init__): Rename
5669 classificationField to classificatin_column and init it here so
5670 that it can be used in SetClassificationColumn
5671 (Layer.GetClassificationColumn, Layer.GetClassificationField):
5672 Rename to GetClassificationColumn.
5673 (Layer.SetClassificationColumn, Layer.SetClassificationField):
5674 Rename to SetClassificationColumn and issue a LAYER_CHANGED
5675 message if the column changes.
5676 (Layer._classification_changed, Layer.ClassChanged): Rename to
5677 _classification_changed. Update the callers.
5678 (Layer.SetShapeStore): Further field->column renames.
5679
5680 * Thuban/Model/load.py (SessionLoader.start_classification)
5681 (SessionLoader.start_clpoint): Updates because of
5682 field->column method name changes in the Layer class
5683
5684 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5685 because of field->column method name changes in the Layer class
5686
5687 * Thuban/UI/classifier.py (Classifier.__init__)
5688 (Classifier._OnTry, Classifier._OnRevert): Updates because of
5689 field->column method name changes in the Layer class
5690
5691 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5692 because of field->column method name changes in the Layer class
5693
5694 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5695 of field->column method name changes in the Layer class
5696
5697 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5698 (SaveSessionTest.testClassifiedLayer): Update because of
5699 field->column method name changes in the Layer class
5700
5701 * test/test_layer.py (SetShapeStoreTests.setUp)
5702 (SetShapeStoreTests.test_sanity): Update because of field->column
5703 method name changes in the Layer class
5704 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5705 (TestLayerModification.test_sanity)
5706 (TestLayerModification.test_initial_settings): remove unsued code
5707 and rename to test_sanity.
5708 (TestLayerModification.test_set_classification): New test for
5709 SetClassification and SetClassificationField.
5710
5711 2003-07-18 Bernhard Herzog <[email protected]>
5712
5713 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5714 the non-fixed values as well. The old test would have accepted a
5715 fixed ramp that only returnes the fixed properties
5716
5717 2003-07-17 Jonathan Coles <[email protected]>
5718
5719 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5720 shots for the manual. The XCF file is the source image and
5721 has additional layers to support changes.
5722
5723 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5724
5725 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5726 Return both the new class and the field name.
5727
5728 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5729 fit the map to the window as this changes any zoom level that
5730 the user may have set.
5731
5732 2003-07-16 Jonathan Coles <[email protected]>
5733
5734 * Thuban/Model/classgen.py (generate_singletons,
5735 generate_uniform_distribution, generate_quantiles): Remove
5736 fixes parameter, but maintain the same functionality by having
5737 the calling function pass a FixedRamp object for the ramp.
5738 (FixedRamp): New. Adapts a ramp to have fixed property values.
5739
5740 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5741 (Classification): Inherit from Publisher.
5742 (Classification.__init__): Remove the layer parameter.
5743 Classifications no longer need to have a parent layer.
5744 (Classification.GetField, Classification.GetFieldType,
5745 Classification.SetFieldInfo): Removed. The field name is stored
5746 in the layer, and the type can be retreived by calling
5747 Layer.GetFieldType().
5748 (Classification._set_layer, Classification.GetLayer): Removed.
5749 Classifications no longer have a parent layer.
5750
5751 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5752 classification.
5753 (Layer.SetShapeStore): Reset the classification first while
5754 we still have the old shape store to work with.
5755 (Layer.GetClassificationField, Layer.SetClassificationField):
5756 New. Method for getting/setting the field to classify on.
5757 (Layer.SetClassification): Simplified now that the layer
5758 simply has to hold a reference to the classification and not
5759 tell the classification who owns it.
5760 Fixes RTbug #2023.
5761
5762 * Thuban/Model/load.py (SessionLoader.start_classification):
5763 Set the field name on the layer, not the classification.
5764
5765 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5766 classification is modified.
5767
5768 * Thuban/Model/save.py (SessionSaver.write_classification):
5769 Get the field name and type from the layer.
5770
5771 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5772 parameter records to rows and add docstring. Fixes RTbug #1997.
5773
5774 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5775 ramp when we need to fix certain values of a ramp rather than
5776 using the old fixes parameter. Fixes RTbug #2024.
5777
5778 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5779 parameter.
5780 (ClassTable.Reset): Add fieldType parameter and use it, rather
5781 than asking the classification.
5782 (Classifier.__init__): Remember the original class's field
5783 and ask the layer for the field type, rather than the classification.
5784 (Classifier.__SetGridTable): Retrieve the field and field type
5785 for the table because they are not in the classification.
5786 (Classifier._OnTry, Classifier._OnRevert): Set the classification
5787 field on the layer in addition to the classification itself.
5788
5789 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5790 classification field from layer.
5791
5792 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5793 classification field from layer. Split up tests and remove
5794 *-imports. Fixes RTbug #1992.
5795
5796 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5797
5798 * test/test_classification.py
5799 (TestClassification.test_classification): Remove tests for methods
5800 that no longer exist.
5801
5802 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5803 __init__ no longer has a field parameter, use SetClassificationField.
5804 (SetShapeStoreTests.test_sanity): Use layer object to get class
5805 field info.
5806
5807 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5808 SetClassificationField on layer to set class field info.
5809
5810 * test/test_viewport.py: Renamed from test/test_view.py.
5811
5812 2003-07-16 Jan-Oliver Wagner <[email protected]>
5813
5814 * Doc/manual/thuban-manual.xml: Added authors and an initial
5815 coarse structure.
5816
5817 2003-07-15 Bernhard Herzog <[email protected]>
5818
5819 * test/support.py (FloatComparisonMixin): This is a mix-in class
5820 and therefore should not be derived from any other class.
5821
5822 * test/test_range.py (RangeTest): FloatComparisonMixin is a
5823 mix-in, so derive from TestCase as well.
5824
5825 2003-07-15 Bernhard Herzog <[email protected]>
5826
5827 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5828 draw_func handling a bit to remove one layer of indirection. This
5829 makes the renderer about 10% faster in the non-classifying case
5830 and the code a bit cleaner
5831 (MapRenderer.draw_point_shape): Add the pen and brush parameters
5832 and set them in the dc. Now the draw_point_shape method and
5833 wxproj's draw_polygon_shape function have basically the same
5834 signature so that both can be directly used as draw_func
5835
5836 2003-07-15 Bernhard Herzog <[email protected]>
5837
5838 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5839 string values (in addition to the labels) as UTF 8
5840
5841 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5842 values if the field type is string
5843
5844 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5845 saving a session with non-ascii string classification values.
5846
5847 * test/test_load.py (TestClassification.file_contents)
5848 (TestClassification.test): Check for non-ascii values in string
5849 classifications
5850
5851 2003-07-14 Jonathan Coles <[email protected]>
5852
5853 * test/test_view.py: New. Tests for ViewPort.
5854
5855 2003-07-14 Frank Koormann <[email protected]>
5856
5857 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5858 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5859
5860 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5861 unicode strings from session file: session title, map title and
5862 projection name.
5863
5864 2003-07-10 Jonathan Coles <[email protected]>
5865
5866 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5867 drag_stop, not drag_move when the mouse is released.
5868
5869 2003-07-10 Jonathan Coles <[email protected]>
5870
5871 The most important part of this is the seperation of view.py into
5872 two pieces. viewport.py now has a class called ViewPort which
5873 contains all the non-wx parts of view.py and can therefore be
5874 tested. view.py contains only the wx-specific parts and is fairly
5875 simple.
5876
5877 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5878 RTTbug #1992.
5879 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5880 RTTbug #1992.
5881
5882 * Thuban/Model/classgen.py (generate_singletons,
5883 generate_uniform_distribution, generate_quantiles):
5884 Added 'fixes' parameter so that property attributes can
5885 be held constant over the generated classification groups.
5886 (CustomRamp.GetProperties): Remove unused variables.
5887
5888 * Thuban/Model/map.py (Map.SetProjection): Send the old
5889 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5890 event.
5891
5892 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5893 parameter which is a list of records that restricts which
5894 records are saved. Fixes RTbug #1997.
5895
5896 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5897 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5898
5899 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5900 to allow the user to fix line color/width on generated groups.
5901 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5902 functions to optionally fix group properties.
5903
5904 * Thuban/UI/main.py (main): Set exception hook to the
5905 ShowExceptionDialog. Fixes RTbug #1993.
5906
5907 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5908 the table window when it is selectd to be shown.
5909
5910 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5911 Export Selection button and move the export buttons underneath
5912 the table.
5913 (QueryTableFrame.UpdateStatusText): Added event argument so
5914 that it can respond to grid selection events. The status text
5915 is now updated even when the table is not associated with a
5916 layer as was previously assumed.
5917 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5918 UpdateStatusText responds to these events.
5919 (QueryTableFrame.OnSaveAs): Renamed to doExport.
5920 (QueryTableFrame.doExport): Helper function that saves the
5921 entire table, or selected rows, to a file.
5922 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5923 Respond to export button events and call doExport.
5924
5925 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5926 the function doesn't return NULL without first setting a Python
5927 Error.
5928
5929 * test/runtests.py (main): Only print "Unknown option" for
5930 unsupported options.
5931
5932 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5933 optional epsilon argument to specify floating point accuracy.
5934 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5935 for each item test.
5936
5937 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5938 tests for saving selected records.
5939
5940 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5941 tests for saving selected records.
5942
5943 * test/test_map.py (TestMapWithContents.test_set_projection):
5944 MAP_PROJECTION_CHANGED events send the old projection.
5945
5946 * test/test_session.py
5947 (TestSessionWithContent.test_forward_map_projection):
5948 MAP_PROJECTION_CHANGED events send the old projection.
5949
5950 * test/test_table.py (TableTest): Update tests to use non-deprecated
5951 functions.
5952
5953 2003-07-08 Bernhard Herzog <[email protected]>
5954
5955 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5956 constants in the column objects are the standard ones defined in
5957 the table module.
5958
5959 * test/test_transientdb.py
5960 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5961 exporting transient tables as DBF works. This should catch the bug
5962 just fixed in TransientTableBase.Width.
5963
5964 2003-07-08 Bernhard Herzog <[email protected]>
5965
5966 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5967 interpolated colors correctly.
5968
5969 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5970 New. Test case for the fix in classgen.py
5971
5972 2003-07-08 Bernhard Herzog <[email protected]>
5973
5974 * test/runtests.py (main): Make the default output less verbose
5975 and add a verbosity option (-v) to get the old output
5976
5977 2003-07-08 Bernhard Herzog <[email protected]>
5978
5979 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5980 0.9.
5981
5982 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5983 New. Return the join type
5984
5985 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5986 DTD
5987 (SessionSaver.write_data_containers): Save the join type for
5988 joined tables
5989
5990 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5991 namespace
5992 (SessionLoader.start_jointable): Handle the jointype attribute
5993
5994 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5995 as of Thuban 0.8. These are now tests to determine whether Thuban
5996 can still read files generated by Thuban 0.8
5997
5998 * test/test_load.py (LoadSessionTest.dtd)
5999 (TestSingleLayer.file_contents)
6000 (TestLayerVisibility.file_contents, TestLabels.file_contents)
6001 (TestLayerProjection.file_contents)
6002 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6003 (TestJoinedTable.file_contents)
6004 (TestLoadError.file_contents): Update for new DTD
6005 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6006 for new join type attribute
6007
6008 * test/test_save.py (SaveSessionTest.dtd)
6009 (SaveSessionTest.testEmptySession)
6010 (SaveSessionTest.testSingleLayer)
6011 (SaveSessionTest.testLayerProjection)
6012 (SaveSessionTest.testRasterLayer)
6013 (SaveSessionTest.testClassifiedLayer)
6014 (SaveSessionTest.test_dbf_table)
6015 (SaveSessionTest.test_joined_table): Update for new DTD
6016 (SaveSessionTest.test_joined_table): Add test for new join type
6017 attribute
6018
6019 2003-07-04 Bernhard Herzog <[email protected]>
6020
6021 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6022 function for table_to_dbf
6023 (table_to_dbf): Deal with names longer than the 10 character limit
6024
6025 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6026 doc-string
6027 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6028 long column names
6029
6030 2003-07-03 Bernhard Herzog <[email protected]>
6031
6032 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6033
6034 2003-07-03 Bernhard Herzog <[email protected]>
6035
6036 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6037 for the Thuban manual and README with some basic information about
6038 the manual
6039
6040 2003-07-03 Bernhard Herzog <[email protected]>
6041
6042 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6043 Update doc-string
6044 (TransientJoinedTable.create): Do not modify the column objects of
6045 the input tables in place and copy all columns of the input tables
6046 into the joined table after all.
6047
6048 * test/test_transientdb.py
6049 (TestTransientTable.test_transient_joined_table_same_column_name):
6050 Update to reflect the new behavior
6051 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6052 Update to reflect the new behavior
6053 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6054 New test case for a bug which modified the column objects in place
6055
6056 2003-07-02 Jonathan Coles <[email protected]>
6057
6058 * Thuban/Model/classgen.py (generate_singletons,
6059 generate_uniform_distribution, generate_quantiles,
6060 GenQuantiles0): Make sure maxValue isn't less than
6061 one, otherwise we could divide by zero.
6062
6063 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6064 ClassGenTest.doClassSingleTest): Call doBoundsTest to
6065 check the end classification groups against the
6066 proper property values.
6067 (ClassGenTest.doBoundsTest): New. Checks the first and
6068 last classification groups to make sure their properties
6069 are the correct upper and lower bounds for a color ramp.
6070
6071 2003-07-02 Jonathan Coles <[email protected]>
6072
6073 * Thuban/Model/classgen.py (generate_singletons,
6074 generate_uniform_distribution, generate_quantiles,
6075 GenQuantiles0): The denominator was one to high when
6076 calculating the index for the ramp causing the index
6077 to never to reach one.
6078
6079 2003-07-02 Jonathan Coles <[email protected]>
6080
6081 Changed the singature of ClassGroupRange.__init__ and
6082 ClassGroupRange.SetRange() so that the min/max values are
6083 passed as a tuple. This makes a better calling scheme for
6084 when a Range object is passed instead.
6085
6086 * Thuban/Model/classgen.py: Fixed parameters to
6087 ClassGroupRange constructor.
6088
6089 * Thuban/Model/classification.py (ClassGroupRange.__init__):
6090 Consolidate the min/max parameters into a single _range which
6091 can either be a tuple or a Range object.
6092 (ClassGroupRange.SetRange): Consolidate the min/max parameters
6093 into a single _range which can either be a tuple or a Range object.
6094
6095 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6096 call to ClassGroupRange constructor to use a tuple.
6097
6098 * Thuban/Model/layer.py (Layer.SetClassification): Switch
6099 the classification instance variable to the new class
6100 before calling _set_layer otherwise subscribers to a
6101 LAYER_CHANGED event will not see any difference.
6102
6103 * test/test_classification.py: Fix tests of ClassGroupRange
6104 so that they use the new signature.
6105
6106 * test/test_load.py: Fix use of ClassGroupRange so that it
6107 uses the new signature.
6108
6109 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6110 uses the new signature.
6111
6112 * test/test_save.py: Fix use of ClassGroupRange so that it
6113 uses the new signature.
6114
6115
6116 2003-07-01 Jonathan Coles <[email protected]>
6117
6118 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6119 Import used objects/class from color.
6120 (generate_singletons): We don't
6121 need the numGroups parameter anymore because we are using
6122 the new ramps with GetProperties().
6123 (generate_uniform_distribution): Use new ramp method
6124 GetProperties().
6125 (generate_quantiles, GenQuantiles0): Use new ramp method
6126 GetProperties().
6127 (CustomRamp.SetNumGroups): Removed. The ramps now map
6128 a value from 0 to 1 to class properties so the number
6129 of groups is not needed ahead of time.
6130 (CustomRamp.next): Removed. CustomRamp does not support
6131 interation anymore.
6132 (CustomRamp.GetProperties): Returns a ClassGroupProperties
6133 object based on the index value from 0 to 1 that is
6134 passed to it.
6135 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6136 Made into instances of Monochromatic class instread of
6137 deriving from it.
6138 (HotToCold.SetNumGroups): Removed. See CustomRamp.
6139 (HotToCold.next): Removed. See CustomRamp.
6140
6141 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6142 (Classification.SetField, Classification.SetFieldType):
6143 Replaced with SetFieldInfo.
6144 (Classification.SetFieldInfo): New. Does a better job of
6145 what SetField and SetFieldType used to do by combining
6146 their function since they should really always be done
6147 at the same time.
6148 (Classification.SetLayer): Renamed to _set_layer.
6149 (Classification._set_layer): Should only be called from
6150 Layer's SetClassification. This does not cause a recursive
6151 call as SetLayer did because we know that Layer knows about
6152 the classification.
6153
6154 * Thuban/Model/color.py: Fixes RTbug #1971.
6155 (_Transparent): Renamed from Transparent so it doesn't
6156 conflict with the module variable.
6157 (Transparent, Black): Renamed from Color.Transparent,
6158 Color.Black so they are not class variables.
6159
6160 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6161 (Layer.Destroy): We don't need to call SetClassification
6162 anymore to clear out the back reference in the classifcation
6163 to the layer. It's better to set it to None using _set_layer,
6164 and we won't be creating another clas object too.
6165 (Layer.SetClassification): Classification._set_layer is not
6166 recursive so remove all the locking variables. Also clean
6167 up the code so that it remains unchanged if something fails.
6168
6169 * Thuban/Model/load.py: Fixes RTbug #1971.
6170 (SessionLoader.start_classification): Call
6171 Classification.SetFieldInfo().
6172
6173 * Thuban/Model/save.py: Removed import of Color which wasn't
6174 being used.
6175
6176 * Thuban/UI/classgen.py: Fixes RTbug #1972.
6177 (ClassGenDialog.__init__): Color ramps are now instances
6178 already so we don't need to create any new objects.
6179 (ClassGenDialog.OnOK): Check for numGroups is no longer
6180 necessary because we never use it.
6181
6182 * Thuban/UI/classifier.py: Fixes RTbug #1971.
6183 (Classifier.__BuildClassification, Classifier.__SetGridTable):
6184 Call Classification.SetFieldInfo() instead of SetFieldType.
6185
6186 * Thuban/UI/renderer.py: Fixes RTbug #1971.
6187
6188 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6189 (MapCanvas.__init__): Subscribe to the idle time event. Set
6190 background color to white.
6191 (MapCanvas.OnPaint): Set a flag indicating that we should
6192 render the map during idle time. If we already have a bitmap
6193 just draw it now.
6194 (MapCanvas.OnIdle): New. Render the map only during idle time.
6195 This also fixes a problem with the busy cursor under gtk.
6196
6197 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6198 Fix calls to generate_singletons because the signature changed.
6199
6200 * test/test_classification.py: Fix color references and
6201 change calls to Classification.[SetField|SetFieldType] to
6202 SetFieldInfo.
6203
6204 * test/test_load.py: Fix color references.
6205
6206 * test/test_load_0_2.py: Fix color references.
6207
6208 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6209 Change calls to Classification.[SetField|SetFieldType] to
6210 SetFieldInfo.
6211
6212 2003-07-01 Frank Koormann <[email protected]>
6213
6214 MERGE from the greater-ms3 branch.
6215
6216 * test/test_transientdb.py
6217 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6218 New. Test join of two tables with partly equal column names.
6219
6220 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6221 If duplicates in left and right tables column names are found,
6222 append '_' (underscores) to the name until it is unique.
6223 Create always new internal names for the resulting table and reference
6224 columns in the join statement with <table>.<column>
6225
6226 2003-07-01 Bernhard Herzog <[email protected]>
6227
6228 * test/test_transientdb.py
6229 (TestTransientTable.test_transient_joined_table_same_column_name):
6230 New. Test whether joining on columns with the same names in both
6231 tables works.
6232
6233 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6234 sure to use the right internal names even when joining on field
6235 with the same names in both tables. Also, detect duplicate names
6236 in the joined table correctly.
6237
6238 2003-07-01 Frank Koormann <[email protected]>
6239
6240 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6241 Reverse List of layers to render in same order as in desktop legend.
6242
6243 2003-06-30 Jonathan Coles <[email protected]>
6244
6245 * Thuban/version.py (make_tuple): Takes a version string
6246 and splits it into a tuple of at most three integers.
6247 Used make_tuple() to make tuple versions of the version
6248 numbers.
6249
6250 * Thuban/UI/about.py: Add Thuban email addresses.
6251
6252 2003-06-30 Jonathan Coles <[email protected]>
6253
6254 * Thuban/version.py: SQLite/PySQLite version dependencies
6255 were too high.
6256
6257 2003-06-30 Jonathan Coles <[email protected]>
6258
6259 * Thuban/version.py: Update version to 0.8.1
6260
6261 * MANIFEST.in: Added Projections so that default.proj is
6262 included.
6263
6264 2003-06-26 Jonathan Coles <[email protected]>
6265
6266 New About box with lots more information including library
6267 versions and credits. More/better version checking before
6268 Thuban starts.
6269
6270 * Thuban/UI/about.py: New. New About box that displays
6271 library version information and credits.
6272
6273 * Thuban/version.py: Added new 'versions' dictionary which
6274 contains the verions of various libraries which are checked
6275 when the module loads.
6276 (verify_versions): Check all version numbers and returns
6277 a list of errors.
6278
6279 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6280 Reset the status of the buttons as the situation warrants,
6281 but in a better more reliable way by not relying on the
6282 current status to determine what needs to change.
6283
6284 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6285 (verify_versions): Remove most of the code since it is
6286 now in Thuban.version.verify_versions.o
6287
6288 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6289 About box in Thuban.UI.about.
6290
6291 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
6292 Returns the version of gdal library being used as a string.
6293
6294 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6295 Removed.
6296 (get_proj_version): Return the version of PROJ that the file
6297 was compiled with.
6298 (get_gtk_version): Return th version of GTK that the file
6299 was compiled with.
6300
6301 2003-06-25 Jonathan Coles <[email protected]>
6302
6303 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
6304 of the SelectPropertiesDialog should be self so the window
6305 appears on top.
6306 (ClassGroupPropertiesCtrl.DoEdit): The parent
6307 of the SelectPropertiesDialog should be self so the window
6308 appears on top.
6309
6310 * Thuban/UI/resource.py: Cleaned up how we determine file
6311 extensions.
6312 (GetImageResource): Return an wxImage from our Resources.
6313
6314 2003-06-24 Jonathan Coles <[email protected]>
6315
6316 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6317 Check that a layer has a classification before trying
6318 to get it. Raster layers don't have classifications.
6319
6320 2003-06-23 Jonathan Coles <[email protected]>
6321
6322 * setup.py: Add Resources/XML to resource list.
6323
6324 2003-06-23 Jonathan Coles <[email protected]>
6325
6326 * setup.cfg: Fix copyright dates
6327
6328 2003-06-23 Jonathan Coles <[email protected]>
6329
6330 * MANIFEST.in: Update with Resources/XML
6331
6332 * setup.py: Don't include Locale resources yet as we don't
6333 have any and it causes problems building the distribution
6334 for Windows. Update version to 0.8.0.
6335
6336 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
6337
6338 * Thuban/UI/mainwindow.py: Add blank line at the end because
6339 file was not being read correctly building the Windows
6340 distribution.
6341
6342 2003-06-23 Jonathan Coles <[email protected]>
6343
6344 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
6345
6346 * Thuban/version.py: Temporarily update longversion for
6347 the 0.8 release so that it doesn't have the cvs revision.
6348
6349 2003-06-23 Jonathan Coles <[email protected]>
6350
6351 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
6352 to make sure that we don't create reentrant possibilities with
6353 wxYield.
6354
6355 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
6356 directly to avoid the wxSafeYield() call which generates an
6357 OnPaint event causing infinite recursion. Don't try to catch
6358 exception anymore. This was for before there were limits on map
6359 scaling.
6360
6361 2003-06-23 Bernhard Herzog <[email protected]>
6362
6363 Bug fix for RT #1961:
6364
6365 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
6366 Register DerivedShapestores with the session
6367
6368 * Thuban/Model/session.py (Session.Tables): Make sure each table
6369 is only listed once.
6370
6371 * test/test_load.py (TestJoinedTable.test): Add check_format call.
6372 Update file contents to match the one written out.
6373
6374 2003-06-20 Bernhard Herzog <[email protected]>
6375
6376 * test/xmlsupport.py (SaxEventLister.startElementNS)
6377 (SaxEventLister.endElementNS): Do not include the qname. Python
6378 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6379 is (presumably incorrectly) None, whereas it's a string with the
6380 element name in the later versions.
6381
6382 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6383 (TestEventList.test_even_list_namespace): Update tests to reflect
6384 the new behaviour
6385 (TestEventList.test_even_list_id_normalization): Fix doc-string
6386
6387 2003-06-20 Jonathan Coles <[email protected]>
6388
6389 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6390 by deriving classes to determine if that layer supports shapes.
6391 (Layer): Override HasShapes and return true.
6392
6393 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6394 instead of a direct call to wx[Begin|End]CusyCursor().
6395 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6396 table data.
6397
6398 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6399 New. Wrappers around the wxWindows functions that allow us to
6400 make additional calls such as wxYield which gives the native
6401 system a chance to update the cursor correctly.
6402
6403 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6404 instead of a direct call to wx[Begin|End]CusyCursor().
6405
6406 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6407 instead of a direct call to wx[Begin|End]CusyCursor().
6408 (MapCanvas.find_shape_at): Check if the current search layer
6409 support shapes, otherwise go on to the next layer.
6410
6411 * test/test_layer.py: Add tests in each type of layer for
6412 HasClassification() and HasShapes()
6413
6414 2003-06-20 Jonathan Coles <[email protected]>
6415
6416 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6417 turning on the busy cursor to allow the system to change the
6418 cursor before we begin painting. This fixes a problem that
6419 was occuring only under GTK. Fixes RTbug #1840.
6420
6421 2003-06-20 Bernhard Herzog <[email protected]>
6422
6423 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6424 version.
6425
6426 * Thuban/Model/save.py (sort_data_stores): New. Make topological
6427 sort of the data sources so they can be written with sources that
6428 data sources that depend on other data sources come after the
6429 sources they depend on.
6430 (SessionSaver.__init__): Add idmap instance variable to map from
6431 objects to the ids used in the file.
6432 (SessionSaver.get_id, SessionSaver.define_id)
6433 (SessionSaver.has_id): New. Methods to manage the idmap
6434 (SessionSaver.write): Use thuban-0.8.dtd
6435 (SessionSaver.write_session): Add a namespace on the session and
6436 write out the data sources before the maps.
6437 (SessionSaver.write_data_containers): New. Write the data
6438 containers.
6439 (SessionSaver.write_layer): Layer elements now refer to a
6440 shapestore and don't contain filenames anymore.
6441
6442 * Thuban/Model/load.py (LoadError): Exception class to raise when
6443 errors in the files are discovered
6444 (SessionLoader.__init__): Define dispatchers for elements with a
6445 thuban-0.8 namespace too.
6446 (SessionLoader.check_attrs): New helper method to check and
6447 convert attributes
6448 (AttrDesc): New. Helper class for SessionLoader.check_attrs
6449 (SessionLoader.start_fileshapesource)
6450 (SessionLoader.start_derivedshapesource)
6451 (SessionLoader.start_filetable, SessionLoader.start_jointable):
6452 Handlers for the new elements in the new fileformat
6453 (SessionLoader.start_layer): Handle the shapestore attribute in
6454 addition to filename.
6455 (SessionLoader.start_table, SessionLoader.end_table): Removed.
6456 They were never used in the old formats and aren't needed for the
6457 new.
6458
6459 * Thuban/Model/session.py (Session.DataContainers): New method to
6460 return all "data containers", i.e. shapestores and tables
6461
6462 * test/xmlsupport.py (SaxEventLister.__init__)
6463 (SaxEventLister.startElementNS, sax_eventlist): Add support to
6464 normalize IDs.
6465
6466 * test/test_xmlsupport.py
6467 (TestEventList.test_even_list_id_normalization): New test case for
6468 id normalization
6469
6470 * test/test_load.py (LoadSessionTest.check_format): Use ID
6471 normalization
6472 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6473 class atrributes used for ID normalization
6474 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6475 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6476 file format
6477 (TestJoinedTable): New test for loading sessions with joined
6478 tables.
6479 (TestLoadError): New. Test whether missing required attributes
6480 cause a LoadError.
6481
6482 * test/test_save.py (SaveSessionTest.thubanids)
6483 (SaveSessionTest.thubanidrefs): New class attributes for ID
6484 normalization in .thuban files.
6485 (SaveSessionTest.compare_xml): Use id-normalization.
6486 (SaveSessionTest.testEmptySession)
6487 (SaveSessionTest.testLayerProjection)
6488 (SaveSessionTest.testRasterLayer)
6489 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6490 (SaveSessionTest.testLayerProjection): The filename used was the
6491 same as for testSingleLayer. Use a different one.
6492 (SaveSessionTest.test_dbf_table)
6493 (SaveSessionTest.test_joined_table): New test cases for saving the
6494 new data sources structures.
6495 (TestStoreSort, MockDataStore): Classes to test the sorting of the
6496 data stores for writing.
6497
6498 * test/runtests.py: Add CVS keywords
6499
6500 2003-06-20 Jonathan Coles <[email protected]>
6501
6502 * test/test_session.py
6503 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6504 Use the cultural_landmark-point.dbf file for the store so that
6505 the table rows and shape count match.
6506
6507 2003-06-20 Jonathan Coles <[email protected]>
6508
6509 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6510 an exception if the number of shapes is different from the
6511 number of rows in the table. Address RTbug #1933.
6512
6513 * test/test_layer.py (TestLayer.test_derived_store): Add
6514 a test for the new exception in DerivedShapeStore.__init__.
6515
6516 * test/support.py (FloatTestCase): Removed since there is
6517 already FloatComparisonMixin. Fixes RTbug #1954.
6518 (FloatComparisonMixin.assertFloatEqual): Include test for
6519 infinity that was part of FloatTestCase.
6520
6521 * test/test_range.py (RangeTest): Inherit from
6522 support.FloatComparisonMixin now that we don't have
6523 support.FloatTestCase.
6524
6525 2003-06-20 Bernhard Herzog <[email protected]>
6526
6527 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6528 the implementation in xmlsupport instead.
6529 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6530
6531 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6532 of test_save
6533
6534 2003-06-20 Bernhard Herzog <[email protected]>
6535
6536 * test/test_load.py (LoadSessionTest.check_format): New helper
6537 method to make sure the test files we load might have been written
6538 by the current thuban version.
6539 (ClassificationTest.TestLayers, TestSingleLayer.test)
6540 (TestLayerVisibility.test, TestClassification.test)
6541 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6542 Add check_format() calls and fix the thuban data to match the data
6543 that would be written by saving the session loaded from it.
6544
6545 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6546 the same class and function in test_save.
6547
6548 * test/test_xmlsupport.py (TestEventList): New. test cases for
6549 sax_eventlist
6550
6551 2003-06-20 Bernhard Herzog <[email protected]>
6552
6553 * Resources/XML/thuban.dtd: Add comment about which versions of
6554 Thuban are covered by this DTD
6555 (map): Fix content model for layers and raster layers. There can
6556 be any number or layers and raster layers in any order.
6557
6558 2003-06-20 Jonathan Coles <[email protected]>
6559
6560 This is mainly about fixing RTbug #1949.
6561
6562 * Thuban/Model/classification.py: Remove "from __future__"
6563 import statement since python 2.2 is the earliest supported
6564 version.
6565
6566 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6567 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6568 depending on the units this projection *forwards* into.
6569
6570 * Thuban/Model/save.py (SessionSaver.write_classification):
6571 Remove unnecessary use of lambdas and nested functions.
6572
6573 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6574 adjustment here if the map projection uses degrees.
6575
6576 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6577 scale adjust code since it is now done before calling
6578 this method. Don't do anything if the map projection
6579 is None.
6580
6581 2003-06-19 Bernhard Herzog <[email protected]>
6582
6583 Move version specific load tests to their own file.
6584
6585 * test/test_load.py: Expand the doc-string to explain a bit how to
6586 handle file format changes.
6587 (TestClassification.test): Update the docstring as this test is
6588 not about Thuban 0.2 anymore.
6589
6590 * test/test_load_0_2.py: New file with the load tests for thuban
6591 files created with Thuban 0.2 and earlier.
6592
6593 2003-06-19 Bernhard Herzog <[email protected]>
6594
6595 Add XML validation to some of the tests. Validation will only be
6596 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6597 To make the DTD available to the test cases it's moved into
6598 Resources/XML
6599
6600 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6601 for versions up to and including 0.2. Two slight changes: added an
6602 encoding specification and fixed the comment which refered to
6603 GRASS, not Thuban
6604
6605 * test/xmlsupport.py: New support module for tests involving XML.
6606 Currently there's a mix-in class for XML validation.
6607
6608 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6609
6610 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6611 so that we can validate the
6612 (SaveSessionTest.testEmptySession)
6613 (SaveSessionTest.testSingleLayer)
6614 (SaveSessionTest.testSingleLayer)
6615 (SaveSessionTest.testLayerProjection)
6616 (SaveSessionTest.testRasterLayer)
6617 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6618
6619 * test/runtests.py (main): Call print_additional_summary instead
6620 of print_garbage_information
6621
6622 * test/support.py (resource_dir): New function to return the
6623 "Resource" subdirectory
6624 (print_additional_summary): New function to combine several
6625 summary functions
6626 (run_tests): Use print_additional_summary instead of calling
6627 print_garbage_information directly
6628
6629 2003-06-19 Bernhard Herzog <[email protected]>
6630
6631 * Doc/thuban.dtd (classification): Correct the content model of
6632 the classification element.
6633 (projection): Add the "name" attribute
6634
6635 2003-06-19 Frank Koormann <[email protected]>
6636
6637 MERGE from the greater-ms3 branch.
6638
6639 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6640 scale if projection is latlong to get better estimate.
6641
6642 Fix problem of hidden properties dialog under windows after double
6643 click on layer tree:
6644 The tree control always gets an Expanded / Collapsed event after
6645 the ItemActivated on double click, which raises the main window again.
6646 We add a second ItemActivated event to the queue, which simply
6647 raises the already displayed window.
6648
6649 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6650 raiseProperties initialized to prevent endless loops
6651 (LegendTree._OnItemActivated): Depending on self.raiseProperties
6652 simply raise the properties or open the dialog and issue a second
6653 event.
6654
6655 2003-06-18 Jonathan Coles <[email protected]>
6656
6657 * setup.py: Fix a few problems that occured under Windows.
6658
6659 2003-06-18 Jonathan Coles <[email protected]>
6660
6661 When Thuban loaded the map was redrawn twice because the
6662 legend was being opened after the mainwindow was created
6663 and not during its creation. This meant the map was drawn
6664 initially and then had to be redrawn when the legend
6665 caused the display to change. Now the legend is opened
6666 in the mainwindow constructor which resolves this issue.
6667
6668 Also, although we were checking for the existence of
6669 gdal and gdalwarp modules, the gdalwarp extension was
6670 still being compiled (which may fail if the system doesn't
6671 have gdal installed). the build_ext command to setup.py
6672 now accepts the flags --with-gdal and --without-gdal.
6673 If --without-gdal is specified setup.py will try to
6674 use the gdal parameters specified by gdal-config. Under
6675 windows, those parameters have to be set in setup.py
6676 as with proj4 an wxWindows.
6677
6678 * setup.py: Use a list instead of seperate variables for
6679 extension parameters so we can create a generic function
6680 that runs an appropriate *-config script.
6681 (run_cs_script): Renamed from run_wx_script and modified
6682 to accept a second argument which is a list of lists to
6683 be filled in by the values returned from running the command.
6684 (thuban_build_ext): New. Extends the build_ext command and
6685 provides the options --with-gdal/--without-gdal which then
6686 optionally includes the gdalwarp extension.
6687
6688 * Thuban/Model/resource.py: First check if we can import
6689 the gdalwarp Thuban extension before checking for gdal.
6690 Also added some comments.
6691
6692 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6693 the map is None which may be the case if none has been loaded
6694 yet.
6695
6696 * Thuban/UI/main.py (main): Remove call to ShowLegend.
6697
6698 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6699
6700 * Thuban/UI/renderer.py: Check for gdal support before importing
6701 gdalwarp.
6702 (MapRenderer.render_map): Only try to optimize if we have gdal
6703 support otherwise nothing will get drawn.
6704
6705 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6706 during startup before a map has been created. Check if map is None
6707 before using it and do nothing if it is.
6708
6709 2003-06-17 Jonathan Coles <[email protected]>
6710
6711 Fix the problem with raster layers under Windows that caused
6712 Thuban to crash. The view should respond to layer projection
6713 changed events to update the display. Changes to a projection
6714 should not cause the map to be set to full extent.
6715
6716 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6717 current_map_proj to remember the current map projection so that
6718 when the projection changes we know what the previous projection
6719 was.
6720 (MapCanvas.SetMap): Unsubscribe and subscribe to
6721 LAYER_PROJECTION_CHANGED events.
6722 (MapCanvas.projection_changed): Split into two methods that respond
6723 to map and layer projection changes.
6724 (MapCanvas.map_projection_changed): New. Takes the current view and
6725 projects it using the new projection. This does not cause the
6726 map to be redrawn at full extent.
6727 (MapCanvas.layer_projection_changed): New. Cause a redraw which
6728 will draw each layer in its new projection.
6729
6730 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6731 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6732 under Windows.
6733
6734 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6735 to twice sizeof(void*) because there are two digits for each
6736 hex byte.
6737
6738 2003-06-16 Bernhard Herzog <[email protected]>
6739
6740 Update to the layer interface: Direct access to the table,
6741 shapetable, shapefile and filename attributes is now actively
6742 deprecated by issuing deprecation warnings for all places where
6743 this happens.
6744
6745 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6746 to the instance variables table, shapetable, shapefile and
6747 filename via __getattr__ so that we can issue a deprecation
6748 warning.
6749 (Layer.SetShapeStore): Don't set the deprecated instance variables
6750 any more
6751 (Layer.SetShapeStore): Don't use deprecated layer instance
6752 variables
6753 (Layer.Destroy): No need to explicitly remove the instance
6754 variables any more
6755 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6756 instance variables
6757
6758 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6759 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6760 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6761 use deprecated layer instance variables
6762
6763 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6764 deprecated layer instance variables
6765
6766 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6767 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6768 instance variables
6769
6770 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6771 deprecated layer instance variables
6772
6773 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6774 deprecated layer instance variables
6775
6776 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6777 deprecated layer instance variables
6778
6779 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6780 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6781 variables
6782
6783 * test/runtests.py (main): Turn Thuban's deprecation warnings into
6784 errors so that they're cought by the tests
6785
6786 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6787 layer instance variables
6788
6789 2003-06-16 Jonathan Coles <[email protected]>
6790
6791 Fix a problem under Windows whereby if the user double-clicks on a
6792 layer in the legend that tree item will expand or collapse as well
6793 as open the layer properties dialog. The state of the tree item
6794 should not be affected.
6795
6796 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6797 preventExpandCollapse and subscribe to expanding and collapsing
6798 events.
6799 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6800 collapsing events and will veto the event if it has been triggered
6801 by the user double clicking on a layer.
6802 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6803 that an expanding/collapsing event should be vetoed.
6804
6805 2003-06-13 Bernhard Herzog <[email protected]>
6806
6807 * Thuban/UI/classifier.py (Classifier.OnClose)
6808 (Classifier.map_layers_removed)
6809 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6810 in OnClose and not in map_layers_removed or
6811 layer_shapestore_replaced to make sure it always happens when the
6812 dialog is closed
6813
6814 2003-06-13 Jonathan Coles <[email protected]>
6815
6816 This puts back a fix for Windows where a panel is needed so that
6817 the background of the table view appears correctly.
6818
6819 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6820 object that can be used by derived classes to place any
6821 controls (including the grid) onto.
6822 (QueryTableFrame.__init__): Use the panel as the parent window
6823 for all the controls. Reparent the grid so that the panel is
6824 the parent. Call UpdateStatusText() to correctly initialize
6825 the status bar.
6826
6827 2003-06-13 Jonathan Coles <[email protected]>
6828
6829 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6830 from wxFrame (as opposed to wxDialog like the other classes)
6831 but otherwise behaves like the other classes. This is needed
6832 for the TableView which isn't really a dialog and needs to
6833 have a status bar and control buttons.
6834
6835 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6836 instance variable to keep track of how many rows are selected.
6837 Subscribe once to the the events we are interested in.
6838 (ThubanGrid.OnRangeSelect): Only handle event if event handling
6839 hasn't been turned off.
6840 (ThubanGrid.OnSelectCell): Only handle event if event handling
6841 hasn't been turned off.
6842 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6843 as an event listener (which changes the event handler stack)
6844 simply set an instance variable to False. This is checked in
6845 the event handlers.
6846 (ThubanGrid.GetNumberSelected): Return the number of currently
6847 selected rows.
6848 (TableFrame): Inherit from ThubanFrame so we can have a
6849 status bar and control buttons.
6850 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6851 Explicitly set which items are selected in the operator choice and
6852 action choice so there is always a valid selection. Fixes RTbug #1941.
6853 Subscribe to grid cell selection events so we can update the
6854 status bar.
6855 (QueryTableFrame.UpdateStatusText): Update the status bar with
6856 how many rows are in the grid, how many columns, and how many
6857 rows are selected.
6858 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6859 Call UpdateStatusText when cells are (de)selected.
6860 (QueryTableFrame.OnQuery): Use the string value in the value
6861 combo if either the selected item index is 0 or if the string
6862 cannot be found in the predefined list (this happens if the
6863 user changes the text). Fixes RTbug #1940.
6864 Only turn off the grid event listeners if there a query comes
6865 back with a none empty list of ids. in the case that the list
6866 is empty this causes a grid.ClearSelection() call to actually
6867 clear the grid selection which causes the selected items in
6868 the map to be deselected. Fixes RTbug #1939.
6869
6870 * test/test_save.py (XMLWriterTest.Encode): Check return values.
6871 Fixes RTbug #1851.
6872
6873 2003-06-13 Bernhard Herzog <[email protected]>
6874
6875 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6876 self.selected_shape with the current selection to make sure the
6877 contents of the dialog are up to date when it's shown for the
6878 first time.
6879 The dialog used to work without this by luck. The recent fix to
6880 the connector module 'broke' a 'feature' the identify view was
6881 relying on, i.e that subscribing to a message in response to
6882 receiving a message of that type would mean that the new
6883 subscriber would also be called for the same message.
6884
6885 2003-06-12 Jonathan Coles <[email protected]>
6886
6887 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6888 the image is rendered. Fixes RTbug #1937.
6889
6890 2003-06-12 Jonathan Coles <[email protected]>
6891
6892 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6893 user directory if it doesn't exist on a posix system.
6894 Fixes RTbug #1815.
6895
6896 * Thuban/Model/resource.py (get_user_proj_files): Moved the
6897 called to get_application_dir here, so that the directory
6898 will only be called if this method is invoked.
6899
6900 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6901 the projfilepath if no projection is selected.
6902
6903 2003-06-12 Jonathan Coles <[email protected]>
6904
6905 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6906 the scalebar if the current map has no projection set.
6907
6908 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6909 projfilepath label to just the basename of the projection file
6910 rather than include the entire path.
6911
6912 * Thuban/Model/resource.py: Fix missed proj functions that
6913 needed to be renamed.
6914
6915 2003-06-12 Jonathan Coles <[email protected]>
6916
6917 * Thuban/Model/classification.py: Removed assert statements that
6918 tested if the variable was an instance of Color.
6919
6920 * Thuban/Model/color.py (Color): Remove commented code that isn't
6921 used.
6922 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6923 Fixes RTbug #1835.
6924 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6925 Needed now that the class doesn't inherit from Color.
6926
6927 2003-06-12 Jonathan Coles <[email protected]>
6928
6929 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6930 check unicode strings.
6931
6932 * test/test_layer.py: Check for existence of gdal.
6933
6934 2003-06-12 Jonathan Coles <[email protected]>
6935
6936 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6937 that was in load.py
6938
6939 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6940 that was in save.py
6941
6942 2003-06-12 Jonathan Coles <[email protected]>
6943
6944 This is largely a collection of bug fixes. We also handle the
6945 case where gdal is not on the system. The XMLReader and XMLWriter
6946 classes were moved into there own files to resolve some circular
6947 import references and because they shouldn't really be in the
6948 file that is dediciated to reading/writing session files since
6949 they are also used elsewhere.
6950
6951 * Thuban/Model/classgen.py: Renamed functions to follow the
6952 function_names_with_underscores style. Fixes RTbug #1903.
6953 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6954
6955 * Thuban/Model/layer.py: Import gdal only if it available.
6956 (RasterLayer): Handle the case where the gdal library is unavailable.
6957 Addresses RTbug #1877.
6958
6959 * Thuban/Model/load.py (XMLReader): Moved into seperate file
6960 xmlreader.py.
6961
6962 2003-06-12 Jonathan Coles <[email protected]>
6963
6964 This is largely a collection of bug fixes. We also handle the
6965 case where gdal is not on the system. The XMLReader and XMLWriter
6966 classes were moved into there own files to resolve some circular
6967 import references and because they shouldn't really be in the
6968 file that is dediciated to reading/writing session files since
6969 they are also used elsewhere.
6970
6971 * Thuban/Model/classgen.py: Renamed functions to follow the
6972 function_names_with_underscores style. Fixes RTbug #1903.
6973 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6974
6975 * Thuban/Model/layer.py: Import gdal only if it available.
6976 (RasterLayer): Handle the case where the gdal library is unavailable.
6977 Addresses RTbug #1877.
6978
6979 * Thuban/Model/load.py (XMLReader): Moved into seperate file
6980 xmlreader.py.
6981
6982 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6983 file xmlwriter.py.
6984
6985 * Thuban/Model/resource.py: Renamed functions to following the
6986 function_names_with_underscores style.
6987 (has_gdal_support): New function that returns true if the gdal
6988 library is available. Addresses RTbug #1877.
6989
6990 * Thuban/UI/application.py (ThubanApplication.OpenSession):
6991 Display a message box if the gdal library is not available, but
6992 only if there are any layers that would use it. Addresses RTbug #1877.
6993
6994 * Thuban/UI/classgen.py: Use renamed projection resource functions.
6995 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6996 when using integers versus floats.
6997
6998 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6999 determine if the "Add Image Layer" menu option should be
7000 greyed out or not. Addresses RTbug #1877.
7001
7002 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7003
7004 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7005 optimize if a raster layer is visible. Fixes RTbug #1931.
7006 Only draw the raster layer if the gdal library is available.
7007 Addresses RTbug #1877.
7008
7009 * test/test_classgen.py: Add tests for generate_singletons,
7010 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7011 (test_calculate_quantiles): Fix some tests to catch the new
7012 ValueError that is raised.
7013
7014 * test/test_proj.py: Use renamed projection resource functions.
7015
7016 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7017 test for saving classified layers. Fixes RTbug #1902.
7018 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7019
7020 2003-06-12 Jan-Oliver Wagner <[email protected]>
7021
7022 Fix for http://intevation.de/rt/webrt?serial_num=1900.
7023
7024 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7025
7026 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7027 multiplechoicedialog.py rather than from the wxPython library.
7028
7029 2003-06-11 Frank Koormann <[email protected]>
7030
7031 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7032 update.
7033
7034 2003-06-11 Frank Koormann <[email protected]>
7035
7036 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7037 determine the absolute .thuban/thuban directory under
7038 "posix" (os.expanduser) and "nt" (read AppData registry key).
7039
7040 * Thuban/Model/resource.py: Use get_application_dir
7041
7042 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7043 Use get_application_dir.
7044
7045 2003-06-10 Bernhard Herzog <[email protected]>
7046
7047 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7048 the messages MAP_LAYERS_REMOVED messages
7049 (LayerTableFrame.OnClose): Unsubscribe from it.
7050 (LayerTableFrame.map_layers_removed): New. Receiver for
7051 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7052 dialog is showing is removed.
7053
7054 2003-06-10 Bernhard Herzog <[email protected]>
7055
7056 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7057 of the receivers list so that unsubscribing in a receiver doesn't
7058 modify it while iterating over it.
7059
7060 * test/test_connector.py
7061 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7062 unsubscribing in a receiver works correctly. See docstring for
7063 details
7064
7065 2003-06-10 Bernhard Herzog <[email protected]>
7066
7067 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7068 message.
7069
7070 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7071 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7072 LAYER_CHANGED will still be sent if the classification changes.
7073
7074 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7075 parameter so we can subscribe to some of its messages
7076 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7077 and the layer's LAYER_SHAPESTORE_REPLACED
7078 (Classifier.unsubscribe_messages): New. Unsubscribe from message
7079 subscribed to in __init__
7080 (Classifier.map_layers_removed)
7081 (Classifier.layer_shapestore_replaced): receivers for the messages
7082 subscribed to in __init__. Unsubscribe and close the dialog
7083
7084 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7085 the map to the Classifier dialog
7086
7087 * test/test_layer.py (SetShapeStoreTests): Derive from
7088 SubscriberMixin as well so we can test messages
7089 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7090 messages
7091 (SetShapeStoreTests.tearDown): Clear the messages again
7092 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7093 for the modified flag too
7094 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7095 to check whether SetShapeStore sets the modified flag
7096 (SetShapeStoreTests.test_set_shape_store_different_field_name)
7097 (SetShapeStoreTests.test_set_shape_store_same_field)
7098 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7099 Add tests for the messages. This checks both the new
7100 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7101
7102 2003-06-06 Jan-Oliver Wagner <[email protected]>
7103
7104 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7105 the menu items.
7106
7107 2003-06-05 Frank Koormann <[email protected]>
7108
7109 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7110 Layout reimplemented without panel. Make life easier to fit the list
7111 in the dialog.
7112
7113 2003-06-05 Frank Koormann <[email protected]>
7114
7115 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7116 once on initialisation (Former implementation resulted in multiple
7117 entries for each projection).
7118 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7119 if set, select the projection found under the specified name. This
7120 overwrites any other selection estimate.
7121 Removed projchoice filling from this method.
7122 (ProjFrame._OnSave, ProjFrame._OnAddToList):
7123 Updated call of ProjFrame.__FillAvailList
7124 (LCCPanel._DoLayout): Moved parameter controls in more common order.
7125
7126 * Resources/Projections/defaults.proj: Extended defaults representing
7127 various common European projections.
7128
7129 2003-06-05 Frank Koormann <[email protected]>
7130
7131 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7132 Use ListCtrl instead of GridCtrl
7133
7134 * Thuban/Model/resource.py:
7135 Guess location of .thuban directory from tempdir parent directory.
7136
7137 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7138 Guess location of .thuban directory from tempdir parent directory.
7139
7140 2003-06-04 Bernhard Herzog <[email protected]>
7141
7142 Do not cache the values returned by the tree widget's
7143 GetFirstChild and GetNextChild methods because it led to lots of
7144 segfaults. The new way requires more brute force but is more
7145 reliable.
7146
7147 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7148 variable layer2id
7149 (LegendTree.find_layer): New method to do with brute force what
7150 layer2id tried to accomplish
7151 (LegendTree._OnMsgLayerChanged)
7152 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7153 Use find_layer instead of layer2id
7154 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7155 update layer2id anymore
7156 (LegendTree._OnMsgMapLayersRemoved)
7157 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7158
7159 2003-06-03 Thomas Koester <[email protected]>
7160
7161 * Thuban/Model/classgen.py (GenQuantiles0): New function.
7162
7163 2003-06-02 Bernhard Herzog <[email protected]>
7164
7165 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7166 New commands.
7167 (main_menu): Add the new commands.
7168 (MainWindow.TableRename): New. Implementation of the table_rename
7169 command.
7170 (MainWindow.RenameLayer): New. Implementation of the layer_rename
7171 command.
7172
7173 * Thuban/Model/session.py (Session.AddTable): call self.changed to
7174 set the modified flag
7175
7176 * test/test_session.py (TestSessionSimple.test_add_table): Test
7177 whether the modified flag is set properly
7178
7179 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7180 instead of issue so that the modified flags get updated.
7181
7182 * test/test_base.py (SomeTitledObject): Derive from Modifiable
7183 instead of Publisher to reflect reality better and to accomodate
7184 the fact that SetTitle now calls changed instead of issue
7185
7186 2003-06-02 Bernhard Herzog <[email protected]>
7187
7188 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7189 acquisition has to happen before the try in a try-finally.
7190
7191 2003-06-02 Bernhard Herzog <[email protected]>
7192
7193 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7194 possible that a layer is removed that is not currently selected in
7195 the legend so don't check for this.
7196
7197 2003-05-30 Bernhard Herzog <[email protected]>
7198
7199 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7200 variables to None that have direct or indirect references to
7201 shapefiles or dbf files to make sure that they do go away and the
7202 files are closed.
7203
7204 2003-05-30 Bernhard Herzog <[email protected]>
7205
7206 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7207 availImgListIndices when a new image list is created
7208
7209 2003-05-30 Bernhard Herzog <[email protected]>
7210
7211 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7212 changing_selection to indicate whether the LegendTree code itself
7213 is currently changing the selection
7214 (LegendTree.normalize_selection): New method to normalize the
7215 selection by selecting the layer item even if the user clicked on
7216 the classification.
7217 (LegendTree._OnSelChanged): normalize the selection. This works
7218 around a bug in wx which doesn't keep track of the selection
7219 properly when subtrees are deleted.
7220
7221 2003-05-30 Bernhard Herzog <[email protected]>
7222
7223 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7224 maximum and minimum scale factors.
7225
7226 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7227 changes in classgen.py
7228
7229 2003-05-30 Jonathan Coles <[email protected]>
7230
7231 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7232 all the methods functions. Fixes RTBug #1903.
7233
7234 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7235 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7236 RTBug #1907.
7237
7238 * Thuban/UI/classgen.py: Use classgen functions that were part
7239 of the ClassGenerator class. Put try/finally blocks around
7240 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7241 RTBug #1904.
7242
7243 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7244
7245 * Thuban/UI/legend.py: The legend was cleared and repopulated any
7246 time something changed which caused some state to be lost such
7247 as which children were expanded or collapsed. Fixes RTBug #1901.
7248 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7249 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7250 the legend but not in the map.
7251 (LegendTree.__FillTree): Move main functionality out into smaller
7252 methods that can be used by other methods.
7253 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7254 if they are available.
7255 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7256 that we override the wxTreeCtrl method. Iterate over children
7257 and call __RemoveLayer.
7258 (LegendTree.__AddLayer): New. Add a new layer to the legend.
7259 (LegendTree.__RemoveLayer): Remove a layer from the legend.
7260 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7261 Should only be called with the id of a layer branch.
7262 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7263 Returns the root item or creates one if necessary.
7264
7265 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7266 ProjectRasterFile with tuple arguments instead of strings.
7267
7268 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7269 with try/finally. Fixes RTBug #1904.
7270
7271 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7272 with try/finally. Fixes RTBug #1904.
7273 (MapCanvas.FitSelectedToWindow): If a single point is selected
7274 simply center it on the display. Fixes RTBug #1849.
7275
7276 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7277 to be compiled as a standalone app. Now the code can only be
7278 called from Python which simplifies the parameter passing.
7279 (ProjectRasterFile): Handle Python arguments. Remove code that
7280 checks for a destination dataset. Add more clean up code.
7281
7282 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7283 TestMapWithContents.test_lower_layer_bottom):
7284 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7285 Fixes RTBug #1907.
7286
7287 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7288 extent to the map when the legend is toggled. Fixes RTBug #1881.
7289
7290 2003-05-29 Jan-Oliver Wagner <[email protected]>
7291
7292 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
7293 unsubscribes all that is subcribed in __init__.
7294
7295 2003-05-28 Bernhard Herzog <[email protected]>
7296
7297 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
7298 (MainWindow.CanDuplicateLayer): New methods to implement the
7299 Layer/Duplicate command.
7300 (layer_duplicate command): New.
7301 (main_menu): Add layer_duplicate to the Layer menu.
7302
7303 2003-05-28 Bernhard Herzog <[email protected]>
7304
7305 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
7306 renderer so that NULL/None values get displayed differently (by a
7307 gray rectangle).
7308 (TableGrid.__init__): Override the default renderers
7309
7310 2003-05-28 Bernhard Herzog <[email protected]>
7311
7312 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
7313 classification to "None" if the type of the field has changed.
7314
7315 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
7316 test for the Layer.SetShapeStore method
7317
7318 2003-05-28 Jan-Oliver Wagner <[email protected]>
7319
7320 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
7321 does not necessarily have a filename).
7322
7323 2003-05-28 Jan-Oliver Wagner <[email protected]>
7324
7325 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
7326 sort the selection list for the dialog.
7327
7328 2003-05-28 Frank Koormann <[email protected]>
7329
7330 * extensions/thuban/wxproj.cpp
7331 (project_point): Removed cast to int for projected point coordinates.
7332 (shape_centroid): Return last point if all polygon vertices fall
7333 to one point.
7334
7335 2003-05-28 Bernhard Herzog <[email protected]>
7336
7337 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
7338 with layers that don't have shapestores, i.e. raster layers.
7339
7340 2003-05-28 Bernhard Herzog <[email protected]>
7341
7342 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
7343 when determining the title from the filename.
7344
7345 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
7346 reflect changes in the way the title is derived from the filename
7347
7348 2003-05-28 Frank Koormann <[email protected]>
7349
7350 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
7351 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
7352
7353 2003-05-27 Bernhard Herzog <[email protected]>
7354
7355 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
7356 delegate SelectedLayer.
7357 (MainWindow.LayerUnjoinTable): Implement.
7358 (_can_unjoin): New. Helper function for the sensitivity of the
7359 layer/unjoin command.
7360
7361 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
7362 (DerivedShapeStore.OrigShapeStore): New. Return the original
7363 shapestore. Used to figure out how to unjoin.
7364 (DerivedShapeStore.Shapefile): Fix a typo.
7365
7366 2003-05-27 Bernhard Herzog <[email protected]>
7367
7368 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
7369 well
7370 (JoinDialog.__init__): Use the layer parameter and only build the
7371 left choice when a layer is given
7372 (JoinDialog.OnJoin): Handle layer joins as well
7373 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
7374 that the user selects the "Select..." item. The sensitivitly
7375 updating is now in update_sensitivity
7376 (JoinDialog.y): New method to refactor the sensitivity update of
7377 the join button into its own method.
7378
7379 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7380
7381 2003-05-27 Bernhard Herzog <[email protected]>
7382
7383 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7384 iff there are unreferenced tables in the session
7385
7386 2003-05-27 Bernhard Herzog <[email protected]>
7387
7388 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7389
7390 * Thuban/Model/session.py (Session.UnreferencedTables): New method
7391 to return tables that are not referenced by other tables or shape
7392 stores and can be removed.
7393 (Session.RemoveTable): Issue a TABLE_REMOVED message after
7394 removing the table
7395
7396 * Thuban/UI/mainwindow.py: Remove unused imports
7397 (MainWindow.TableClose): Implement.
7398
7399 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7400 messages so that the frame will be automatically closed when a new
7401 session is opened or the table is removed.
7402 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7403 __init__
7404 (TableFrame.close_on_session_replaced)
7405 (TableFrame.close_on_table_removed): New. Subscribers that close
7406 the window
7407
7408 * test/test_session.py (TestSessionMessages.test_remove_table)
7409 (TestSessionSimple.test_remove_table): Move the test to
7410 TestSessionSimple and add test for the TABLE_REMOVED message
7411 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7412 (TestSessionSimple.test_unreferenced_tables) New. Test for the
7413 UnreferencedTables method.
7414 (UnreferencedTablesTests): New. Class with some more sophisticated
7415 tests for UnreferencedTables.
7416
7417 2003-05-27 Frank Koormann <[email protected]>
7418
7419 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7420 display has some unwanted side effects. Removed again.
7421
7422 2003-05-27 Frank Koormann <[email protected]>
7423
7424 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7425
7426 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7427
7428 2003-05-27 Jan-Oliver Wagner <[email protected]>
7429
7430 * test/test_menu.py (MenuTest.test): Added test for
7431 Menu.RemoveItem().
7432
7433 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7434 the menu.
7435
7436 2003-05-27 Frank Koormann <[email protected]>
7437
7438 Nonmodal dialogs without parent (i.e. they can fall behind the main
7439 window)
7440
7441 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7442 all dialogs in the dialogs dictionary and the canvas.
7443
7444 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7445 parent, i.e. can fall behind other windows.
7446 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7447 dictionary before removing it.
7448
7449 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7450
7451 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7452 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7453 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7454
7455 2003-05-27 Bernhard Herzog <[email protected]>
7456
7457 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7458 tableview dialog
7459 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7460 Also, don't use the table's titles as the dialog names. The titles
7461 aren't guaranteed to be unique.
7462 (MainWindow.TableOpen): Open a table view dialog after opening the
7463 table
7464
7465 2003-05-27 Bernhard Herzog <[email protected]>
7466
7467 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7468 effect can be achieved by simply closing the window showing the
7469 table.
7470 (MainWindow.TableHide): Removed.
7471 (main_menu): Removed "table_hide"
7472
7473 2003-05-27 Frank Koormann <[email protected]>
7474
7475 Fix legend tree display problems under Win32
7476
7477 * Thuban/UI/legend.py: BMP_SIZE_W = 15
7478 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7479 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7480
7481 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7482
7483 2003-05-27 Jan-Oliver Wagner <[email protected]>
7484
7485 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7486 'after' now allows to insert separators almost anywhere in the menu.
7487
7488 2003-05-27 Frank Koormann <[email protected]>
7489
7490 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7491 "S" of selection box label to hint on hot key (Alt-S). Works under
7492 Win32 but is ignored under GTK.
7493
7494 2003-05-26 Frank Koormann <[email protected]>
7495
7496 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7497 Center Choices.
7498
7499 2003-05-26 Bernhard Herzog <[email protected]>
7500
7501 Remove the Precision methods again. They're too DBF specific to be
7502 part of the table interface and they're only used in table_to_dbf
7503 anyway.
7504
7505 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7506 fixed precision of 12 for doubles.
7507 (TransientTableBase.Precision): Removed
7508 (AutoTransientTable.Width): Delegate to self.table.
7509
7510 * Thuban/Model/table.py (DBFTable.Precision)
7511 (MemoryTable.Precision): Removed.
7512 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7513 (table_to_dbf): Use a fixed precision of 12 for floats unless the
7514 column object specifies something else.
7515
7516 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7517 test for table_to_dbf
7518
7519 2003-05-26 Bernhard Herzog <[email protected]>
7520
7521 * test/test_transientdb.py
7522 (TestTransientTable.run_iceland_political_tests): Fix a comment.
7523
7524 2003-05-26 Bernhard Herzog <[email protected]>
7525
7526 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7527 implementation. Mark parts of the file format strings for
7528 localization.
7529
7530 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7531 file and add the table to the tables managed by the session
7532
7533 * test/test_session.py (TestSessionSimple.test_open_table_file):
7534 New. test case for OpenTableFile
7535
7536 2003-05-26 Jan-Oliver Wagner <[email protected]>
7537
7538 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7539 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7540 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7541 Replace the true/false of wxWindows by True/False of Python 2.2.1.
7542
7543 2003-05-26 Jan-Oliver Wagner <[email protected]>
7544
7545 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7546 already a selection present, update the grid accordingly.
7547
7548 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7549 resizeable and increase its initial size.
7550
7551 2003-05-26 Frank Koormann <[email protected]>
7552
7553 Table export functionality
7554
7555 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7556 Return width (in characters) for a column.
7557 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7558 (table_to_dbf): Write table to dbf file.
7559 (table_to_csv): Write table to csv file.
7560
7561 * Thuban/Model/transientdb.py (TransientTableBase.Width,
7562 TransientTableBase.Precision): Return column width and precision.
7563
7564 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7565 or table_to_csv depending on file selection.
7566
7567 * test/test_dbf_table.py:
7568 Test table_to_dbf (extension of former part of test).
7569
7570 * test/test_csv_table.py:
7571 Test table_to_csv.
7572
7573 2003-05-23 Jan-Oliver Wagner <[email protected]>
7574
7575 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7576 Use QueryTableFrame instead of TableFrame.
7577
7578 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7579 table window with 'Layer Table:' instead of 'Table:'.
7580
7581 2003-05-23 Jan-Oliver Wagner <[email protected]>
7582
7583 Give all tables a title via mix-in TitledObject.LayerShowTable
7584
7585 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7586 only if it exists.
7587
7588 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7589 and call its init-method with a default title. Remove Title() method.
7590
7591 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7592 AutoTransientTable): mix-in TitledObject and call its init-method with
7593 a default title. Remove Title() method.
7594
7595 2003-05-23 Bernhard Herzog <[email protected]>
7596
7597 * Thuban/Model/session.py (Session.AddShapeStore): Define
7598 AddShapeStore analogously to AddTable.
7599
7600 * test/test_session.py (TestSessionSimple.test_add_shapestore):
7601 New. Test for AddShapeStore
7602
7603 2003-05-23 Jan-Oliver Wagner <[email protected]>
7604
7605 Introducing QueryTableFrame and a very coarse ShowTable implementation.
7606
7607 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7608 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7609 The latter implements the selection GUI without dependency on a layer.
7610 LayerTableFrame now is derived from QueryTableFrame and connects
7611 to a layer.
7612
7613 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7614 implementation that still needs work.
7615
7616 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7617
7618 2003-05-22 Frank Koormann <[email protected]>
7619
7620 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7621 Added "outer_join = False" as optional parameter.
7622 (TransientJoinedTable.create): If outer join is true, perform a
7623 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7624 the left table. Records not matching are filled with 0 / None.
7625
7626 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7627 (JoinDialog.OnJoin): Consider outer join check box.
7628
7629 2003-05-22 Bernhard Herzog <[email protected]>
7630
7631 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7632 somewhat safer way. Storing the traceback in a local variable can
7633 lead to memory leaks
7634
7635 2003-05-22 Bernhard Herzog <[email protected]>
7636
7637 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7638 the wxMessageDialog's Destroy() method.
7639
7640 2003-05-22 Frank Koormann <[email protected]>
7641
7642 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7643 TransientTable.Title()
7644
7645 2003-05-22 Frank Koormann <[email protected]>
7646
7647 Join Dialog, initial version.
7648
7649 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7650
7651 * Thuban/UI/join.py (JoinDialog): Functional implementation of
7652 former framework. Renamed Table1/Table2 to LeftTable/RightTable
7653 in all occurences.
7654
7655 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7656 Typo fixed.
7657
7658 2003-05-22 Bernhard Herzog <[email protected]>
7659
7660 Give the tables titles so that the GUI can display more meaningful
7661 names. For now the titles are fixed but depend on e.g. filenames
7662 or the titles of the joined tables.
7663
7664 * Thuban/Model/transientdb.py (TransientTable.Title)
7665 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7666
7667 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7668
7669 * test/test_transientdb.py
7670 (TestTransientTable.test_auto_transient_table_title): New. Test
7671 for the Title method
7672 (TestTransientTable.test_transient_joined_table)
7673 (TestTransientTable.test_transient_table): Add test for the Title
7674 methods
7675
7676 * test/test_memory_table.py (TestMemoryTable.test_title): New.
7677 Test for the Title method
7678
7679 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7680 the Title method
7681
7682 2003-05-22 Bernhard Herzog <[email protected]>
7683
7684 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7685 Provide a better way to destroy the layers
7686 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7687 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7688 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7689 the new way to destroy the layers.
7690 (TestLayer.test_derived_store): New. Test for using a layer with a
7691 DerivedShapeStore
7692
7693 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7694 filename if the shape store actually has one.
7695
7696 2003-05-22 Bernhard Herzog <[email protected]>
7697
7698 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7699 for the filename
7700
7701 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7702 for the FileName method
7703 (TestDBFTableWriting.test_write): Fix spelling of filename
7704
7705 2003-05-22 Thomas Koester <[email protected]>
7706
7707 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7708 from SciParam that now really is immutable.
7709
7710 2003-05-22 Frank Koormann <[email protected]>
7711
7712 Layer Top/Bottom placement added to legend.
7713
7714 * Thuban/UI/legend.py
7715 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7716 bound to tool events.
7717 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7718 New, methods binding the event methods with the map methods.
7719
7720 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7721 layer at top/bottom of layer stack.
7722
7723 * Resources/Bitmaps/top_layer.xpm: New button icon.
7724
7725 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7726
7727 2003-05-22 Bernhard Herzog <[email protected]>
7728
7729 * Thuban/Model/session.py (Session.RemoveTable): New method to
7730 remove tables
7731
7732 * test/test_session.py (TestSessionSimple.test_remove_table): New.
7733 Test for RemoveTable
7734
7735 2003-05-22 Thomas Koester <[email protected]>
7736
7737 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7738 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7739
7740 2003-05-22 Bernhard Herzog <[email protected]>
7741
7742 Implement a way to discover dependencies between tables and
7743 shapestores.
7744
7745 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7746 (TransientJoinedTable.Dependencies)
7747 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7748 interface
7749 (TransientJoinedTable.__init__): Keep tack of the original table
7750 objects in addition to the corresponding transient tables.
7751
7752 * Thuban/Model/table.py (DBFTable.Dependencies)
7753 (MemoryTable.Dependencies): New. Implement the dependencies
7754 interface
7755
7756 * Thuban/Model/data.py (ShapeTable): New. Helper class for
7757 ShapefileStore
7758 (ShapefileStore.__init__): Use ShapeTable instead of
7759 AutoTransientTable
7760 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7761 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7762 methods for filename and type
7763 (ShapefileStore.Dependencies): New. Implement the dependencies
7764 interface
7765 (DerivedShapeStore): New class to replace SimpleStore. The main
7766 difference to SimpleStore is that it depends not on a shapefile
7767 but another shapestore which expresses the dependencies a bit
7768 better
7769 (SimpleStore.__init__): Add deprecation warning.
7770
7771 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7772 Test for the Dependencies method.
7773
7774 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7775 New. Test for the Dependencies method.
7776
7777 * test/test_transientdb.py
7778 (TestTransientTable.test_auto_transient_table_dependencies): New.
7779 Test for the Dependencies method.
7780 (TestTransientTable.test_transient_joined_table): Add test for the
7781 Dependencies method.
7782
7783 * test/test_session.py (TestSessionSimple.setUp)
7784 (TestSessionSimple.tearDown): New. Implement a better way to
7785 destroy the sessions.
7786 (TestSessionSimple.test_initial_state)
7787 (TestSessionSimple.test_add_table): Bind session to self.session
7788 so that it's destroyed by tearDown
7789 (TestSessionSimple.test_open_shapefile): New. Test for
7790 OpenShapefile and the object it returns
7791
7792 2003-05-22 Bernhard Herzog <[email protected]>
7793
7794 * Thuban/Model/session.py (Session.AddTable): New method to
7795 register tables with the session.
7796 (Session.Tables): Return the tables registered with AddTable too.
7797
7798 * test/test_session.py (TestSessionSimple.test_add_table): New.
7799 Test case for the AddTable method
7800
7801 2003-05-22 Frank Koormann <[email protected]>
7802
7803 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7804 lower right corner, center labels for selections, initialize controls
7805 in reasonable order for keyboard navigation.
7806
7807 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7808 (ProjFrame.__DoOnProjAvail): Determine position of current projection
7809 using the wxListBox.FindString() method. Still a problem (#1886)
7810
7811 * Thuban/UI/classifier.py
7812 (Classifier.__init__, SelectPropertiesDialog.__init__)
7813
7814 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7815 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7816 different classification types from here to __init__.
7817 (GenUniquePanel.__init__): Set the column width of the first field
7818 in the Field ListCtrl to the full width.
7819
7820 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7821 Button to 'Export'. Center Buttons in Selection Box, set Focus to
7822 Grid.
7823 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7824 changes focus to the Selection when pressing "Alt-S".
7825
7826 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7827 the text if not visible. The italic font sometimes exceeds the
7828 rendering area.
7829
7830 2003-05-21 Jonathan Coles <[email protected]>
7831
7832 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7833 to OnClose so that Thuban closes correctly.
7834
7835 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7836 DockFrame.OnClose, not DockFrame._OnClose.
7837
7838 2003-05-21 Jonathan Coles <[email protected]>
7839
7840 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7841 references to 'inf' and use new Range __init__ to pass floats
7842 directly rather than converting them to strings first.
7843 Fixes RTBug #1876.
7844
7845 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7846 Use new Range ___init__ to pass floats.
7847
7848 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7849 filename is a valid image file. Throw IOError otherwise.
7850
7851 * Thuban/Model/range.py: Brought over new Range from SciParam that
7852 is immutable and has an __init__ which can accept floats.
7853
7854 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7855 into try block. AddLayer doesn't throw any exceptions anymore.
7856 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7857 try block.
7858
7859 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7860 the first item in choices. Fixes RTBug #1882.
7861
7862 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7863 has gone to 0 which is a serious problem. abort.
7864 (MapRenderer.draw_raster_layer): Catch IOError seperately and
7865 print the error from GDAL.
7866
7867 * Thuban/UI/tableview.py (TableGrid.__init__): Call
7868 ToggleEventListeners to turn on listening.
7869 (TableGrid.ToggleEventListeners): New. Turns event listening on
7870 and off so as to prevent excessive messages.
7871 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7872 to suppress excessive messages when selecting many rows.
7873 Fixes RTBug #1880.
7874
7875 * Thuban/UI/view.py: Added checks against if scale == 0. This
7876 is a serious problem that can occur when an image without
7877 geo data is loading and causes the map projection bounds to
7878 go to infinity. Right now, the solution is to simply try
7879 to recover.
7880
7881 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7882 to set the MFILEReceiver attributes even if the data is NULL.
7883
7884 * extensions/thuban/gdalwarp.cpp: Improved the error handling
7885 and passed GDAL messages back up to the Python layer. Also
7886 tried to fix some memory leaks that were present in the original
7887 utility but didn't matter because the program aborted.
7888
7889 * test/test_range.py: Copied over tests from SciParam. Removed
7890 tests against importing. Fixes RTBug #1867.
7891
7892 2003-05-21 Bernhard Herzog <[email protected]>
7893
7894 * test/test_load.py: Remove unused imports and restructure the
7895 test code
7896 (LoadSessionTest): Split into one class for each test and turn
7897 LoadSessionTest itself into the base class for all such session
7898 tests.
7899 (ClassificationTest): New base class for load tests that test
7900 classifications
7901 (TestSingleLayer, TestLayerVisibility, TestClassification)
7902 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7903 for the individual tests
7904
7905 * test/support.py (FileLoadTestCase.filename): New base class for
7906 file loading tests
7907
7908 2003-05-21 Jan-Oliver Wagner <[email protected]>
7909
7910 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7911 Mercator' to 'UTM Zone 32' as a more convenient example.
7912 Added 'Gauss Krueger Zone 6'.
7913
7914 * Data/iceland_sample_raster.thuban: political polygon now
7915 filled transparent to have the raster image visible at once.
7916
7917 2003-05-21 Frank Koormann <[email protected]>
7918
7919 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7920 OnClose() to keep in sync with extensions. Internally Thuban
7921 still uses "underscored" names.
7922
7923 2003-05-20 Jonathan Coles <[email protected]>
7924
7925 This puts back Raster layer support. These layers support projections
7926 through the GDAL library. Currently, the CVS version is being used.
7927 There are no Debian packages available although this may change soon.
7928 A GDAL driver was extended to support writing to memory rather to
7929 files.
7930
7931 There is still some work that needs to be done, such as some error
7932 handling when loading invalid images or when there is a problem
7933 projecting the image. This putback simply checks in the majority
7934 of the work.
7935
7936 * setup.py: Add gdalwarp library extension.
7937
7938 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7939 Defaults to False, but can be overridden by subclasses if they
7940 support classification.
7941 (RasterLayer): New. Defines a new layer that represents an
7942 image.
7943
7944 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7945 tag handler.
7946 (SessionLoader.start_layer): Encode the filename.
7947 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7948 New. Supports reading a rasterlayer tag.
7949
7950 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7951
7952 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7953 get a string in Latin1. If we get such as string convert it to
7954 unicode first, otherwise leave if alone before encoding.
7955 (SessionSaver.write_layer): Add support for writing both Layers
7956 and RasterLayers.
7957
7958 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7959 The right argument may not be a string, it could also be a Column.
7960
7961 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7962 Make initial window size 600x400. Fixes RTBug #1872.
7963
7964 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7965 the dialog is constructed so that we can support layers that
7966 do not have classifications.
7967 (Classifier._OnTry): Only build a classification if the layer
7968 supports one.
7969
7970 * Thuban/UI/legend.py: Change all checks that a layer is an
7971 instance of Layer into checks against BaseLayer.
7972 (LegendTree.__FillTreeLayer): Only add children to a branch if
7973 the layer supports classification.
7974
7975 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7976 MainWindow.OpenSession): Don't proceed with an action if the
7977 user chooses Cancel when they are asked to save changes.
7978 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7979 user to select an image file. Create a new RasterLayer and add
7980 it to the map.
7981
7982 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7983 for rendering RasterLayer layers.
7984 (MapRenderer.draw_raster_layer): Actually method that calls
7985 the GDALWarp python wrapper and constructs an image from the
7986 data returned.
7987
7988 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7989 Choices symbols to match those used in the table query method.
7990 Replace deprecated method calls on table with new method names.
7991
7992 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7993 how small the scale can get. This still needs more testing.
7994
7995 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7996 Provides a driver to output in .bmp format.
7997
7998 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7999 New. Provides IO routines which write to memory, rather than a file.
8000
8001 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8002 of the gdalwarp utility provided in GDAL. Added function calls
8003 that can be accessed from python.
8004
8005 * Data/iceland_sample_raster.thuban: New. Sample file that uses
8006 a raster layer.
8007
8008 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8009 layer image data.
8010
8011 * Doc/thuban.dtd: Added rasterlayer attribute definition.
8012
8013 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8014 tests associated with the raster layer code.
8015
8016 * test/test_transientdb.py
8017 (TestTransientTable.test_auto_transient_table_query): Added a test
8018 for using a Column object as the "right" parameter to a query.
8019
8020 2003-05-19 Frank Koormann <[email protected]>
8021
8022 * Thuban/version.py (get_changelog_date):
8023 Catch exceptions if ChangeLog does not exist.
8024
8025 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8026
8027 2003-05-19 Frank Koormann <[email protected]>
8028
8029 Extended version information for Thuban
8030
8031 * Thuban/version.py: New, version information for Thuban: Last
8032 modification date and last ChangeLog entry date.
8033
8034 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8035 information: Display Thuban, wxPython and Python version.
8036
8037 2003-05-16 Bernhard Herzog <[email protected]>
8038
8039 * Thuban/Model/save.py: Remove some unused imports including the
8040 __future__ import for nested_scopes as Thuban relies on Python 2.2
8041 now.
8042 (XMLWriter.encode): Remove the special case for a None argument.
8043 In the saver encode is always called with a string argument.
8044
8045 2003-05-16 Bernhard Herzog <[email protected]>
8046
8047 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8048 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8049 of the bug was that e.g. float("1.2") would fail. Thuban now
8050 requires 2.4.x.
8051
8052 2003-05-16 Frank Koormann <[email protected]>
8053
8054 Printing enhancement and WMF export (under Win32)
8055
8056 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8057 ScreenRenderer. Renders Map, Legend and Scalebar for export.
8058 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8059 PrintRender.
8060
8061 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8062 to fullfil information needed for PrinterRenderer.
8063 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8064 (MapCanvas.Print): Adapted to new MapPrintout.
8065 (OutputTransform): General calculations to transform from canvas
8066 coordinates to export/printing devices.
8067
8068 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8069 new method_command to call ExportMap, with platform dependency (only
8070 __WXMSW__)
8071
8072 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8073 of scalebar drawing area as new parameters.
8074
8075 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8076
8077 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8078 Update to extended scalebar.DrawScalebar header.
8079
8080 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8081
8082 * test/test_scalebar.py: Made test executable as standalone.
8083
8084 2003-05-16 Bernhard Herzog <[email protected]>
8085
8086 * Thuban/Model/table.py (Table): Remove this compatibility alias
8087 for DBFTable.
8088
8089 * test/test_table.py: Import DBFTable as Table because that alias
8090 doesn't exist anymore.
8091
8092 * Thuban/UI/classgen.py: Remove some unused imports
8093
8094 2003-05-14 Jonathan Coles <[email protected]>
8095
8096 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8097 Fix docstring.
8098 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8099 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8100 values of the supplied range to determine the beginning and end
8101 bounds of the generated classes.
8102
8103 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8104 do not have a leading 0 (.5 is now accepted as well as 0.5).
8105
8106 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8107 call to ClassGenerator.GenUniformDistribution.
8108
8109 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8110 layout bug with the 'Projection' label.
8111
8112 * test/support.py (FloatTestCase): New. Needed for the Range tests.
8113
8114 * test/test_range.py: New. Imported from SciParam.
8115
8116 2003-05-12 Jonathan Coles <[email protected]>
8117
8118 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8119 to table.UniqueValues() with calls that retrieve all the values
8120 from the table. This will need to be replaced by a method on table
8121 which can simply return the list (perhaps more efficiently).
8122
8123 2003-05-12 Jonathan Coles <[email protected]>
8124
8125 The return value of ClassGenerator.CalculateQuantiles has changed.
8126 Refer to the documentation for details.
8127
8128 * test/test_classgen.py: Modified Quantile tests to use the
8129 new return values.
8130
8131 * Thuban/Model/classgen.py
8132 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8133 use new return values from CalculateQuantiles to produce the correct
8134 range bounds in the Classification.
8135 (ClassGenerator.CalculateQuantiles): Add more comments describing
8136 the return values and parameters. Make minor adjustments to improve
8137 the legibility of the code. Fix problem with adjusted not being set
8138 in most cases.
8139
8140 2003-05-12 Frank Koormann <[email protected]>
8141
8142 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8143 and latin1. Fixes #1851 finally.
8144
8145 2003-05-09 Jonathan Coles <[email protected]>
8146
8147 * test/test_classgen.py: New. Tests the Quantile algorithm.
8148
8149 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8150 Clean up debugging statement, add comments, fix a small bug in the
8151 returned adjusted percentiles.
8152
8153 2003-05-09 Jonathan Coles <[email protected]>
8154
8155 Introduces Range class from SciParam into the ClassGroupRange class,
8156 and such ranges can now be saved and loaded from disk.
8157
8158 Quantiles are now available in the Classification Generator.
8159
8160 Initial support for building Queries on a table. Doesn't do anything
8161 but run some tests.
8162
8163 * Thuban/Model/classification.py: Explicit imports.
8164 (ClassGroupRange): Use the Range class to store the underlying
8165 range information. The interface remains the same, except for
8166 GetRange(), and you can also supply a Range object as the min
8167 parameter to SetRange or __init__.
8168
8169 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8170 string appropriately for use in Thuban. Fixes RTbug #1851.
8171 (SessionLoader.end_projection): Handle the context of the
8172 projection tag a bit better by looking at what objects are not
8173 None. There was an assumption that a projection tag for a map
8174 could occur before any layers.
8175 (SessionLoader.start_clrange): Provide backward compatibility for
8176 reading min/max values as well as the new range parameter.
8177
8178 * Thuban/Model/map.py: Explicit imports.
8179
8180 * Thuban/Model/resource.py: Import _.
8181 (ProjFileSaver.write): write header using projfile.dtd.
8182
8183 * Thuban/Model/save.py: Explicit imports.
8184 (XMLWriter.encode): New. Encode the given string from a format
8185 used by Thuban into UTF-8. Fixes RTbug #1851.
8186
8187 * Thuban/UI/classgen.py: Explicit imports.
8188 (ClassGenDialog.__init__): Clean up the code and add support
8189 for Quantiles.
8190 (ClassGenDialog.OnOK): Add support for Quantiles.
8191 (GenQuantilesPanel): New. Input panel for Quantiles.
8192 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8193 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8194
8195 * Thuban/Model/classgen.py: New. Contains all the classes named above.
8196
8197 * Thuban/UI/classifier.py: Explicit imports.
8198 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8199 ClassTable.SetValueAsCustom): Reworked to use new Range class.
8200
8201 * Thuban/UI/legend.py: Explicit imports.
8202
8203 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8204 a Table menu and associated method calls.
8205 (MainWindow.choose_color): Removed. No longer needed.
8206
8207 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8208 should be disabled if no projection is selected in the available
8209 list.
8210
8211 * Thuban/UI/renderer.py: Explicit imports.
8212
8213 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8214 with correctly selecting the rows and issuing the right events.
8215 Be sure to call Skip() to allow the grid to do some of its own
8216 handling which allows the rows to actually be selected.
8217 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8218 selecting multiple shapes.
8219 (LayerTableFrame): Support for building Queries.
8220 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8221
8222 * Thuban/UI/tree.py: Explicit imports.
8223
8224 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8225 table view can call it.
8226
8227 * test/test_classification.py: Explicit imports.
8228 (TestClassification.test_ClassGroupRange): Fix test for new
8229 Range class.
8230
8231 * Doc/thuban.dtd: Add range parameter for clrange.
8232
8233 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8234 object in ClassGroupRange, and also uesd for inputting ranges in
8235 the classifer table and elsewhere.
8236
8237 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8238 yet.
8239
8240 2003-05-09 Frank Koormann <[email protected]>
8241
8242 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8243
8244 2003-05-08 Frank Koormann <[email protected]>
8245
8246 Coding style updates
8247
8248 * test/test_scalebar.py: Replaced tab indentation by spaces.
8249
8250 * Thuban/UI/scalebar.py: Explicit imports.
8251
8252 2003-05-08 Frank Koormann <[email protected]>
8253
8254 * Thuban/UI/scalebar.py
8255 (ScaleBar.DrawScalebar): Format string bug fixed.
8256
8257 2003-05-08 Frank Koormann <[email protected]>
8258
8259 Reorganization of scalebar component (no wx in Thuban/Model)
8260
8261 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8262 (deriveInterval):
8263 Calculate scalebar interval and unit which fits in width for scale.
8264 (roundInterval): Round float.
8265
8266 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8267
8268 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8269
8270 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8271
8272 2003-05-08 Frank Koormann <[email protected]>
8273
8274 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8275 Initialize ScaleBar with canvas.map
8276
8277 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8278 round intervals to display smarter lengths
8279 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8280 layer. If the maps has no projection applied grey the scalebar.
8281
8282 2003-05-07 Frank Koormann <[email protected]>
8283
8284 Basic Scalebar features added.
8285
8286 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8287
8288 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8289 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
8290 and the renderer.
8291
8292 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
8293
8294 * Thuban/UI/messages.py: SCALE_CHANGED added.
8295
8296 2003-05-07 Bernhard Herzog <[email protected]>
8297
8298 * Thuban/Model/session.py (Session.__init__): New instance
8299 variable shapestores to hold a list of all open shapestore objects
8300 (Session.ShapeStores): New. Accessor method for the shapestores
8301 list.
8302 (Session._add_shapestore, Session._clean_weak_store_refs): New.
8303 Internal methods to maintain the shapestores list.
8304 (Session.Tables): New. Return all tables open in the session.
8305 (Session.OpenShapefile): Insert the new ShapeStore into the
8306 shapestores list.
8307
8308 * test/test_session.py (TestSessionSimple.test_initial_state): Add
8309 tests for ShapeStores and Tables
8310 (TestSessionWithContent.test_shape_stores)
8311 (TestSessionWithContent.test_tables): New. Test cases for
8312 ShapeStores and Tables
8313
8314 2003-05-07 Bernhard Herzog <[email protected]>
8315
8316 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
8317 Add comments about the optimizations used.
8318 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
8319 Implement the ReadValue table interface method.
8320
8321 * test/test_transientdb.py
8322 (TestTransientTable.run_iceland_political_tests)
8323 (TestTransientTable.test_transient_joined_table): Add tests for
8324 ReadValue
8325
8326 2003-05-07 Frank Koormann <[email protected]>
8327
8328 * Resources/Bitmaps/fulllayerextent.xpm,
8329 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
8330 new icons.
8331
8332 2003-05-06 Bernhard Herzog <[email protected]>
8333
8334 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8335 New. Simply delegate to the transient table's version.
8336
8337 * test/test_transientdb.py
8338 (TestTransientTable.test_auto_transient_table_query): New. Test
8339 case for AutoTransientTable's SimpleQuery
8340
8341 2003-05-06 Bernhard Herzog <[email protected]>
8342
8343 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
8344 Implement a simple query method for the query dialog
8345 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
8346 the row index or shapeid.
8347 (TransientTable.create): Insert the right value of the row index
8348 (TransientJoinedTable.create): Copy the row index of the left
8349 table to the joined result table
8350
8351 * test/test_transientdb.py
8352 (TestTransientTable.test_transient_table_read_twice): Fix
8353 doc-string
8354 (TestTransientTable.test_transient_table_query): New. Test for the
8355 SimpleQuery method
8356
8357 2003-05-06 Bernhard Herzog <[email protected]>
8358
8359 Convert all table users to use the new table interface. This only
8360 covers Thuban itself, not GREAT-ER or other applications built on
8361 Thuban yet, so the compatibility interface stays in place for the
8362 time being but it now issues DeprecationWarnings.
8363
8364 Finally, the new Table interface has a new method, HasColumn.
8365
8366 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
8367 issue deprecation warnings when they're. The warnings refer to the
8368 caller of the method.
8369 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
8370 for the deprecation warnings
8371
8372 * test/test_table.py: Ignore the deprecation warnings for the old
8373 table in the tests in this module. The purpose of the tests is to
8374 test the old interface, after all.
8375
8376 * test/test_transientdb.py
8377 (TestTransientTable.run_iceland_political_tests): Use the
8378 constants for the types. Add a test for HasColumn
8379 (TestTransientTable.test_transient_joined_table): Adapt to new
8380 table interface. Add a test for HasColumn
8381 (TestTransientTable.test_transient_table_read_twice): Adapt to new
8382 table interface
8383
8384 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8385 Adapt to new table interface
8386
8387 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8388 new table interface
8389
8390 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8391 (RecordTable.SetTable): Adapt to new table interface
8392
8393 * Thuban/UI/classifier.py (Classifier.__init__)
8394 (Classifier.__init__): Adapt to new table interface
8395
8396 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8397 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8398 to new table interface
8399
8400 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8401 (AutoTransientTable.HasColumn): Implement the new table interface
8402 method
8403 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8404 (AutoTransientTable.UniqueValues): Adapt to new table interface
8405
8406 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8407 Adapt to new table interface
8408
8409 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8410 simplify opening shapefiles a bit easier.
8411 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8412 (TestLayer.test_point_layer): Use the new helper method
8413 (TestLayer.test_get_field_type): New. Test for the GetFieldType
8414 method
8415
8416 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8417 the new table method
8418
8419 * test/test_memory_table.py (TestMemoryTable.test_has_column):
8420 Test for the new table method HasColumn
8421
8422 2003-05-06 Jonathan Coles <[email protected]>
8423
8424 Addresses the "Selection Extent" wish of RTbug #1787.
8425
8426 * Resources/Bitmaps/fulllayerextent.xpm,
8427 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8428 extent. These are just place holders for the real bitmaps.
8429
8430 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8431 calculate the bounding box once (the first time compute_bbox() is
8432 called).
8433 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8434 the bounding box for the shapes in lat/long coordinates.
8435
8436 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8437 option.
8438 (MainWindow.has_selected_shapes): New. Returns true if there are
8439 any selected shapes.
8440 (MainWindow.FullSelectionExtent): New. Calls
8441 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8442 (_has_selected_shapes): New. Returns true if there are any
8443 selected shapes.
8444
8445 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8446 true if there are any selected shapes.
8447
8448 * Thuban/UI/view.py (MapCanvas): Added delegated method
8449 HasSelectedShapes.
8450 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8451 shapes on the canvas using the map projection (if any).
8452
8453 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8454 for Layer.ShapesBoundingBox().
8455
8456 2003-05-06 Bernhard Herzog <[email protected]>
8457
8458 * Resources/Projections/defaults.proj: Fix spelling of Mercator
8459
8460 2003-05-05 Jonathan Coles <[email protected]>
8461
8462 Addresses the "Full Layer Extent" wish of RTbug #1787.
8463
8464 * Resources/Projections/defaults.proj: Added UK National Grid.
8465
8466 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8467 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8468 when the user selects the menu option.
8469
8470 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8471 scales the given layer on the canvas using the map projection.
8472
8473 2003-05-05 Bernhard Herzog <[email protected]>
8474
8475 Convert the table implementations to a new table interface. All
8476 tables use a common mixin class to provide backwards compatibility
8477 until all table users have been updated.
8478
8479 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8480 provide backwards compatibility for table classes implementing the
8481 new interface
8482 (DBFTable, MemoryTable): Implement the new table interface. Use
8483 OldTableInterfaceMixin as base for compatibility
8484 (DBFColumn, MemoryColumn): New. Column description for DBFTable
8485 and MemoryTable resp.
8486
8487 * test/test_dbf_table.py: New. Test cases for the DBFTable with
8488 the new table interface.
8489
8490 * test/test_memory_table.py: New. Test cases for the MemoryTable
8491 with the new table interface.
8492
8493 * test/test_table.py: Document the all tests in this file as only
8494 for backwards compatibility. The equivalent tests for the new
8495 interface are in test_memory_table.py and test_dbf_table.py
8496 (MemoryTableTest.test_read): field_info should be returning tuples
8497 with four items
8498 (MemoryTableTest.test_write): Make doc-string a more precise.
8499
8500 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8501 table interface. Derive from from OldTableInterfaceMixin for
8502 compatibility.
8503 (TransientTableBase.create): New intance variable column_map to
8504 map from names and indices to column objects
8505 (TransientTable.create): Use the new table interface of the input
8506 table
8507 (AutoTransientTable): Convert to new table interface. Derive from
8508 from OldTableInterfaceMixin for compatibility.
8509 (AutoTransientTable.write_record): Removed. It's not implemented
8510 yet and we still have to decide how to handle writing with the new
8511 table and data framework.
8512
8513 * test/test_transientdb.py
8514 (TestTransientTable.run_iceland_political_tests)
8515 (TestTransientTable.test_transient_joined_table): Use the new
8516 table interface
8517
8518 2003-05-05 Jonathan Coles <[email protected]>
8519
8520 This is namely a collection of UI updates to improve user interactivity.
8521 Tabbing between controls now exists and you can use ESC to close dialog
8522 boxes; ENTER will active the default button.
8523
8524 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8525 order that the controls are created so that tabbing works correctly.
8526 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8527 wxDialog can handle the default button correctly.
8528 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8529 same reasons as for OnOK.
8530 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8531 when we ask the table for the maximum/minimum values of a field
8532 which could take a very long time.
8533
8534 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8535 order that the controls are created so that tabbing works correctly.
8536 (SelectPropertiesDialog.__init__): Rearrange the order that the
8537 controls are created so that tabbing works correctly.
8538
8539 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8540 to derive from a wxDialog but behave like the original implementation
8541 which was derived from a wxFrame. wxDialog provides useful key
8542 handling functionality like ESC calling OnCancel and ENTER calling
8543 OnOK which is lost with wxFrame.
8544
8545 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8546 new dialogs.
8547
8548 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8549 order that the controls are created so that tabbing works correctly.
8550 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8551 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8552 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8553 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8554 can provide the "UK National Grid" as a default projection.
8555 (UTMPanel.__init__): Rearrange the order that the controls are
8556 created so that tabbing works correctly.
8557
8558 2003-05-05 Bernhard Herzog <[email protected]>
8559
8560 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8561 (project_point): If a map projection but no layer projection is
8562 given, convert degrees to radians before applying the map
8563 projection.
8564
8565 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8566 (TableGrid.allow_messages): New methods to make it possible to
8567 inhibit message sending.
8568 (TableGrid.issue): Only send the message if not inhibited.
8569 (LayerTableGrid.select_shape): Use the new methods to make sure
8570 that no ROW_SELECTED message is sent while we're updating the
8571 selected rows to match the selected shapes.
8572
8573 2003-05-02 Jan-Oliver Wagner <[email protected]>
8574
8575 Implementation of MemoryTable.
8576
8577 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8578 implementation that operates on a list of tuples. All of the data
8579 are kept in the memory.
8580
8581 * test/test_table.py (MemoryTableTest): New.
8582
8583 * test/test_transientdb.py (SimpleTable): Removed.
8584 (TestTransientTable.test_transient_joined_table,
8585 (TestTransientTable.test_transient_table_read_twice): Replaced
8586 SimpleTable by MemoryTable.
8587
8588 2003-04-30 Jonathan Coles <[email protected]>
8589
8590 * Data/iceland_sample.thuban: Now contains correct projections
8591 for each of the layers.
8592
8593 * Resources/Projections/defaults.proj: Geographic projection
8594 contains unit conversion parameter.
8595
8596 2003-04-30 Jonathan Coles <[email protected]>
8597
8598 The most important part of this putback is the projection changes.
8599 It should now be possible to specify the projection that a layer
8600 is in and then specify a different projection for the map. The
8601 projection dialog has an extra parameter for a geographic projection
8602 which lets the user select if the input is in degrees or radians.
8603
8604 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8605 to say that the parameter is a tuple of unprojected
8606 points (which is what the callers to this method were assuming).
8607 Also, since the points are unprojected we need to projected them.
8608
8609 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8610 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8611 groups are selected, move the layer up/down. Fixes RTbug #1833.
8612
8613 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8614
8615 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8616 parameter in call to SetClientData.
8617 (GeoPanel): Add support for selecting the units that the
8618 source data is in (Radians or Degrees).
8619
8620 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8621 the rendering loop by reducing the number of if's, removing the
8622 unnecessary try/except block, and checking if the old group
8623 is the same as the new one (which happens a lot if there is
8624 no classification, or lots of shapes are in the same group).
8625
8626 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8627 around the redraw routine to try to catch problems that the user
8628 may create by selecting invalid projections for the data set and
8629 map. Clears the display if there are any problems and prints the
8630 error.
8631 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8632 rectangle.
8633
8634 * extensions/thuban/wxproj.cpp (project_point): First invert the
8635 supplied point (which should be in projected coordinates) using
8636 the layer's projection and then project the point using the
8637 map's projection.
8638 (project_points): Use project_point() to project each point.
8639
8640 2003-04-30 Jan-Oliver Wagner <[email protected]>
8641
8642 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8643 don't set the Classification to None if the classfication field
8644 is None (ie only a DEFAULT).
8645
8646 2003-04-30 Bernhard Herzog <[email protected]>
8647
8648 * Thuban/UI/view.py: Fix some typos.
8649
8650 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8651 not pop up the dialog if the selection becomes empty (this could
8652 happen if e.g. a new selection is opened while the identify tool
8653 is active and dialog had been closed)
8654
8655 2003-04-30 Bernhard Herzog <[email protected]>
8656
8657 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8658 instance variable read_record_last_result
8659 (TransientTableBase.read_record): Make sure reading the same
8660 record twice works. The implementation uses the new instance
8661 variable read_record_last_result
8662
8663 * test/test_transientdb.py
8664 (TestTransientTable.test_transient_table_read_twice): New test
8665 case for the above bug-fix.
8666
8667 2003-04-29 Jonathan Coles <[email protected]>
8668
8669 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8670
8671 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8672
8673 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8674 (ClassTable.SetValueAsCustom): Rename keyword argument in
8675 ClassGroup* constructors to match argument name.
8676
8677 2003-04-29 Bernhard Herzog <[email protected]>
8678
8679 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8680 transient DB if it exists to make sure it doesn't leave a journal
8681 file in the temp directory.
8682
8683 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8684 self.conn to None after closing the connection to make sure it's
8685 not closed twice
8686
8687 2003-04-29 Jonathan Coles <[email protected]>
8688
8689 Add a visible parameter in the layer XML tag. The default value is
8690 "true". If anything other than "false" is specified we also assume
8691 "true". Addresses RTbug #1025.
8692
8693 * Doc/thuban.dtd: Add visible parameter to a layer.
8694
8695 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8696 of visible from 1 to True.
8697 (Layer.__init__): Change default value of visible from 1 to True.
8698
8699 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8700 parameter.
8701
8702 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8703 parameter.
8704
8705 * test/test_load.py: Add new test data contents_test_visible.
8706 (LoadSessionTest.setUp): save test data.
8707 (LoadSessionTest.testLayerVisibility): Test if the visible flag
8708 is loaded correctly.
8709
8710 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8711 for saving an invisible layer.
8712
8713 2003-04-29 Jonathan Coles <[email protected]>
8714
8715 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8716 legend dialog box and tell it to change its map to the one
8717 supplied to SetMap(). Fixes RTbug #1770.
8718
8719 2003-04-29 Bernhard Herzog <[email protected]>
8720
8721 Next step of table implementation. Introduce a transient database
8722 using SQLite that some of the data is copied to on demand. This
8723 allows us to do joins and other operations that require an index
8724 for good performance with reasonable efficiency. Thuban now needs
8725 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8726 haven't tested that.
8727
8728 * Thuban/Model/transientdb.py: New. Transient database
8729 implementation.
8730
8731 * test/test_transientdb.py: New. Tests for the transient DB
8732 classes.
8733
8734 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8735 classes to help automatically remove temporary files and
8736 directories.
8737 (Session.__init__): New instance variables temp_dir for the
8738 temporary directory and transient_db for the SQLite database
8739 (Session.temp_directory): New. Create a temporary directory if not
8740 yet done and return its name. Use AutoRemoveDir to have it
8741 automatically deleted
8742 (Session.TransientDB): Instantiate the transient database if not
8743 done yet and return it.
8744
8745 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8746 AutoTransientTable so that data is copied to the transient DB on
8747 demand.
8748 (SimpleStore): New class that simply combines a table and a
8749 shapefile
8750
8751 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8752 DBFTable and update its doc-string to reflect the fact that this
8753 is only the table interface to a DBF file. Table is now an alias
8754 for DBFTable for temporary backwards compatibility.
8755
8756 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8757 the last reference to the session goes away so that the temporary
8758 files are removed properly.
8759
8760 * test/test_load.py (LoadSessionTest.tearDown): Remove the
8761 reference to the session to make sure the temporary files are
8762 removed.
8763
8764 2003-04-29 Bernhard Herzog <[email protected]>
8765
8766 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8767 the __parser instance variable into a normal local variable in
8768 read. It's only used there and read will never be called more than
8769 once. Plus it introduces a reference cycle that keeps can keep the
8770 session object alive for a long time.
8771
8772 2003-04-29 Jonathan Coles <[email protected]>
8773
8774 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8775 Projection an immutable item. Fixes RTbug #1825.
8776 (Projection.__init__): Initialize instance variables here.
8777 (ProjFile.Replace): New. Replace the given projection object with
8778 the new projection object. This solves the problem of needing the
8779 mutator Projection.SetProjection() in the ProjFrame class and
8780 allows a projection to change parameters without changing its
8781 location in the file.
8782
8783 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8784 be of type wxSAVE and should verify overwriting a file.
8785
8786 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8787 ProjFile.Replace() method instead of the mutator
8788 Projection.SetProjection(). Also requires that we reassign the
8789 client data to the new projection.
8790
8791 * test/test_proj.py (TestProjection.test): Test GetName() and
8792 GetAllParameters()
8793 (TestProjFile.test): Remove tests for Set*() methods. Add tests
8794 for Replace().
8795
8796 2003-04-25 Jonathan Coles <[email protected]>
8797
8798 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8799 to save the name of the projection.
8800
8801 * test/test_save.py (SaveSessionTest.testLayerProjection): New
8802 test to verify layer projections are saved correctly.
8803
8804 2003-04-25 Jonathan Coles <[email protected]>
8805
8806 * Thuban/Model/proj.py (Projection.SetName): Set the name
8807 to "Unknown" if name is None.
8808 (Projection.SetAllParameters): New. Set the projection's
8809 parameter list to the one supplied.
8810 (Projection.SetProjection): New. Set the projection's
8811 properties to those of the supplied Projection.
8812
8813 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8814 the dialog title to include the map's title.
8815 (MainWindow.LayerProjection): Set the dialog title to include
8816 the layer's title.
8817
8818 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8819 error dialogs into a single method call.
8820 (ProjFrame.__VerifyButtons): Add more states to check.
8821 (ProjFrame.__GetProjection): Return the current state of an
8822 edited projection or None.
8823 (ProjFrame.__FillAvailList): Remove checks for states that
8824 shouldn't exist.
8825 (ProjFrame._OnNew): Clear all selected items and supply
8826 a projection panel if necessary.
8827
8828 * test/test_proj.py (TestProjFile.test): Add tests for
8829 ProjFile.SetAllParameters, ProjFile.SetProjection,
8830 ProjFile.SetName.
8831
8832 2003-04-25 Jonathan Coles <[email protected]>
8833
8834 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8835 takes an optional argument to select the current projection.
8836 This does not guarantee that the item is visible due to
8837 limited wxWindows functionality. Fixes RTBug #1821.
8838
8839 2003-04-25 Jonathan Coles <[email protected]>
8840
8841 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8842 the projection name and use it when constructing the Projection
8843 object.
8844
8845 * Thuban/Model/proj.py (Projection.__init__): Change the default
8846 value for 'name' to None and then test if name is equal to None
8847 in the body of the constructor. This way the caller doesn't have to
8848 know what the default value should be. Namely, useful in load.py
8849 where we have to pick a default value if the 'name' parameter
8850 doesn't exist in the XML file.
8851
8852 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8853 Tests a file where a layer has a projection.
8854
8855 2003-04-25 Jonathan Coles <[email protected]>
8856
8857 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8858 tree for projection information.
8859
8860 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8861 XMLReader.GetFileName.
8862 (SessionLoader): Added support for loading projection tags that
8863 appear inside a layer.
8864
8865 * Thuban/Model/proj.py (ProjFile): Document the class. Move
8866 back to using a list because the order of the projections in
8867 the file is important to maintain. Fixes RTbug #1817.
8868
8869 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8870 to ProjFile.GetFilename.
8871
8872 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8873 information.
8874
8875 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8876 ProjFrame._OnSaveAs. Removed old dead code from previous
8877 implementation.
8878 (ProjFrame._OnExport): Add support for exporting more than one
8879 projection to a single file.
8880 (ProjFrame.__FillAvailList): use string formatting (% operator)
8881 to build strings that are (partly) translated. Fixes RTbug #1818.
8882
8883 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8884 class.
8885
8886 2003-04-24 Bernhard Herzog <[email protected]>
8887
8888 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8889
8890 * po/fr.po: New. French translation by Daniel Calvelo Aros
8891
8892 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8893 empty strings.
8894
8895 2003-04-24 Jonathan Coles <[email protected]>
8896
8897 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8898 implement the interface that the ProjFrame dialog expects.
8899
8900 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8901 name of the projection to be changed.
8902 (ProjFile): Use a dictionary instead of a list so that removing
8903 projections is easier and we are sure about uniqueness.
8904 (ProjFile.Remove): Remove the given projection object.
8905
8906 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8907 Return a list with only one projection file instead of searching for
8908 any projection file. This simplifies many things if the user can
8909 only have one system file and one user file.
8910
8911 * Thuban/UI/classgen.py: Change all references to
8912 genCombo to genChoice.
8913
8914 * Thuban/UI/mainwindow.py: Add a Projection option under the
8915 layer menu.
8916 (MainWindow.LayerProjection): New. Open up a projection window
8917 for a layer.
8918
8919 * Thuban/UI/projdialog.py: Large changes to how the dialog is
8920 laid out. Use three panels instead of one. One for the list of
8921 projections, one for the edit controls, and one for the buttons.
8922 Fixed resizing problems so that the dialog resizes correctly
8923 when the projection panel changes. Added import/export, save, and
8924 new buttons/functionality.
8925
8926 2003-04-24 Bernhard Herzog <[email protected]>
8927
8928 First step towards table management. Introduce a simple data
8929 abstraction so that we replace the data a layer uses more easily
8930 in the next step.
8931
8932 * Thuban/Model/data.py: New file with a simple data abstraction
8933 that bundles shapefile and dbffile into one object.
8934
8935 * Thuban/Model/session.py (Session.OpenShapefile): New method to
8936 open shapefiles and return a shape store object
8937
8938 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8939 object instead of a shapefile filename. This introduces a new
8940 instance variable store holding the datastore. For intermediate
8941 backwards compatibility keep the old instance variables.
8942 (open_shapefile): Removed. No longer needed with the shape store.
8943 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8944 get the shape store used by a layer.
8945 (Layer.Destroy): No need to explicitly destroy the shapefile or
8946 table anymore.
8947
8948 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8949 (MainWindow.AddLayer): Use the session's OpenShapefile method to
8950 open shapefiles
8951
8952 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8953 session's OpenShapefile method to open shapefiles
8954
8955 * test/test_classification.py
8956 (TestClassification.test_classification): Use the session's
8957 OpenShapefile method to open shapefiles and build the filename in
8958 a more platform independed way
8959
8960 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8961 Implement to have a session to use in the tests
8962 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8963 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8964 session's OpenShapefile method to open shapefiles
8965 (TestLayerLegend.setUp): Instantiate a session so that we can use
8966 it to open shapefiles.
8967 (TestLayerLegend.tearDown): Make sure that all references to
8968 layers and session are removed otherwise we may get a resource
8969 leak
8970
8971 * test/test_map.py (TestMapAddLayer.test_add_layer)
8972 (TestMapWithContents.setUp): Instantiate a session so that we can
8973 use it to open shapefiles.
8974 (TestMapWithContents.tearDown): Make sure that all references to
8975 layers, maps and sessions are removed otherwise we may get a
8976 resource leak
8977 ("__main__"): use support.run_tests() so that more info about
8978 uncollected garbage is printed
8979
8980 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8981 session's OpenShapefile method to open shapefiles
8982 ("__main__"): use support.run_tests() so that more info about
8983 uncollected garbage is printed
8984
8985 * test/test_selection.py (TestSelection.tearDown): Make sure that
8986 all references to the session and the selection are removed
8987 otherwise we may get a resource leak
8988 (TestSelection.get_layer): Instantiate a session so that we can
8989 use it to open shapefiles.
8990 ("__main__"): use support.run_tests() so that more info about
8991 uncollected garbage is printed
8992
8993 * test/test_session.py (TestSessionBase.tearDown)
8994 (TestSessionWithContent.tearDown): Make sure that all references
8995 to the session and layers are removed otherwise we may get a
8996 resource leak
8997 (TestSessionWithContent.setUp): Use the session's OpenShapefile
8998 method to open shapefiles
8999
9000 2003-04-24 Jonathan Coles <[email protected]>
9001
9002 * Thuban/Model/load.py (XMLReader.read): Should have been checking
9003 if the file_or_filename object had the 'read' attribute.
9004
9005 2003-04-23 Jonathan Coles <[email protected]>
9006
9007 * Thuban/Model/resource.py: Fixes RTbug #1813.
9008 (ReadProjFile): Add documentation about which exceptions are raised.
9009 Always pass the exceptions up to the caller.
9010 (GetProjFiles): If the directory can't be read return an empty list.
9011 If any of the proj files can't be read skip that file and go
9012 on to the next one.
9013
9014 * test/test_proj.py: Added test cases to handle nonexistent files,
9015 unreadable files, and files that don't parse correctly.
9016
9017 2003-04-23 Jonathan Coles <[email protected]>
9018
9019 Projection dialog. Allows the user to select from a list
9020 of projection templates and optionally edit them and save new ones.
9021
9022 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9023 (ProjPanel): Base class for projection specific panels.
9024 (TMPanel): Projection panel for Transverse Mercartor.
9025 (UTMPanel): Projection panel for Universal Transverse Mercartor.
9026 (LCCPanel): Projection panel for Lambert Conic Conformal.
9027 (GeoPanel): Projetion panel for Geographic Projection.
9028
9029 2003-04-23 Jonathan Coles <[email protected]>
9030
9031 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9032 promote symmetry. There now exists XMLReader and XMLWriter.
9033 (XMLReader.read): New. Call to read the given file descriptor or
9034 filename.
9035 (XMLReader.close): New. Make sure the file is closed.
9036 (XMLReader.GetFileName): New. Return just the file name that is being
9037 read from.
9038 (XMLReader.GetDirectory): New. Return just the directory of the file
9039 that is being read.
9040 (XMLReader.AddDispatchers): New. Take a dictionary which contains
9041 the names of functions to call as the XML tree is parsed.
9042 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9043 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9044 (SessionLoader): Removed class variables start_dispatcher and
9045 end_dispatcher since this functionality is now part of a class
9046 instance. Fixes RTbug #1808.
9047 (SessionLoader.__init__): Add dispatcher functions.
9048 (load_xmlfile): Code was moved into the XMLReader.read().
9049 (load_session): Use modified SessionLoader.
9050
9051 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9052 map's projection.
9053
9054 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9055 GetAllParameters.
9056 (Projection.GetParameter): Returns the value for the given parameter.
9057
9058 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9059 (GetProjFiles): Renamed from GetProjections. Now returns a list
9060 of ProjFile objects.
9061 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9062 a list of ProjFile objects whose files are not user defined.
9063 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9064 list of ProjFile objects whose files are user defined.
9065 (ProjFileReader): Extend new XMLReader.
9066
9067 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9068 promote symmetry.
9069
9070 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9071 control instead of a wxComboBox. wxChoice controls do not generate
9072 events as the uses highlights possible choices which fixes problems
9073 with resizing the dialog when the use selects an option.
9074
9075 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9076 control instead of a wxComboBox.
9077
9078 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9079 dialog.
9080
9081 * test/test_proj.py (TestProjection.test): New tests for GetParameter
9082 method.
9083
9084 2003-04-22 Bernhard Herzog <[email protected]>
9085
9086 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9087 constants
9088
9089 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9090 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9091
9092 2003-04-17 Bernhard Herzog <[email protected]>
9093
9094 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9095 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9096 anymore.
9097 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9098 (Layer.ShapeType, Layer.Shape): No need to call
9099 self.open_shapefile since it's always called in __init__
9100
9101 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9102 In wxPython 2.4 there's no need to extend MainLoop anymore since
9103 wxPython itself makes sure OnExit is called.
9104
9105 2003-04-16 Jonathan Coles <[email protected]>
9106
9107 Initial putback of projection management code. Includes new
9108 classes to read and write projection files. The current load
9109 and save classes were abstracted a bit so they could be reused.
9110 The Projection class was extended to provide new methods and
9111 have a name.
9112
9113 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9114 general XML reading methods that were part of ProcessSession.
9115
9116 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9117 name.
9118 (ProjFile): New. Represents a file that contains projection
9119 information.
9120
9121 * Thuban/Model/resource.py: New. Contains general utilities
9122 for read and writing projection files.
9123
9124 * Thuban/Model/save.py (XMLSaver): New. Contains all the
9125 general XML writing methods that were part of SessionSaver.
9126 (SessionSaver): Renamed from Saver.
9127
9128 * test/test_proj.py: New test cases for the projection
9129 file read and write functions.
9130
9131 2003-04-16 Jonathan Coles <[email protected]>
9132
9133 * Thuban/Model/classification.py: Use repr() around values
9134 in the ClassGroup*.__repr__() methods so it is clearer when
9135 a value is a string and when it is a number.
9136
9137 * test/test_load.py: Rework the classification test to test
9138 that we can load old files.
9139 (testLabels): Test a file where the groups have labels.
9140
9141 2003-04-16 Bernhard Herzog <[email protected]>
9142
9143 Safer implementation of the performance enhancements of the
9144 low-level renderer:
9145
9146 * extensions/thuban/wxproj.cpp (extract_projection)
9147 (extract_pointer): Rename extract_projection to extract_pointer
9148 and redefine its purpose to return the pointer stored in a CObject
9149 returned by the object's cobject method. Update all callers.
9150 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9151 handling of these low-level parameters so that each s_draw_info
9152 instance is handled as a CObject at python level that also
9153 contains real references to the actual python objects which
9154 contain the values in the struct. Add free_draw_info as the
9155 destructor.
9156 (draw_polygon_shape): Add the py_draw_info parameter which must a
9157 cobject containing an s_draw_info pointer.
9158
9159 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9160 method to instantiat the low-level render parameter
9161 (MapRenderer.draw_shape_layer): Use the new method. Remove some
9162 commented out code.
9163 (MapRenderer.draw_polygon_shape): Make the first parameter not the
9164 layer but the low-level render parameter
9165 (ScreenRenderer.draw_shape_layer): Use the low-level render
9166 parameter.
9167
9168 2003-04-15 Jonathan Coles <[email protected]>
9169
9170 * Thuban/Model/classification.py: Implemented __repr__ for
9171 the ClassGroup* classes to make debugging a bit easier.
9172 (ClassGroup.SetLabel): Check that the string is an instance
9173 of StringTypes not StringType. Accounts for Unicode strings.
9174
9175 * Thuban/Model/color.py: Implemented __repr__ to make
9176 debugging a bit easier.
9177
9178 * Thuban/Model/save.py (Saver.write_classification): Need to
9179 save the group label.
9180
9181 * test/test_load.py (testClassification): New. Loads the
9182 iceland_sample_test.thuban file and checks if it was loaded
9183 correctly.
9184
9185 2003-04-15 Jonathan Coles <[email protected]>
9186
9187 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9188 to improve rendering performance by initializing the variables
9189 that are not change each time draw_polygon_shape() is called.
9190 The values are stored in a global struct draw_info.
9191 (draw_polygon_shape): Removed initialization code that is
9192 now in draw_polygon_init().
9193
9194 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9195 drawing initialization call to draw_polygon_init()
9196 (MapRenderer.draw_polygon_shape): Use new signature of
9197 draw_polygon_shape.
9198
9199 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9200 weirdness by setting the range to (1, maxint).
9201
9202 * Thuban/Model/classification.py (ClassGroupProperties): Make
9203 instance variables private and optimize comparison operator
9204 by first checking if the color references are the same.
9205 (ClassGroupSingleton): Make instance variables private.
9206 (ClassGroupRange): Make instance variables private.
9207
9208 * HOWTO-Release: Filled in missing steps for releasing packages.
9209
9210 2003-04-15 Bernhard Herzog <[email protected]>
9211
9212 First stab at internationalized messages:
9213
9214 * Thuban/__init__.py (_): Implement the translation function for
9215 real using the python gettext module.
9216
9217 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9218 translate empty strings.
9219
9220 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9221 Add a missing space to a warning message
9222
9223 * po/README: New. Notes about the management of the translation
9224 files.
9225
9226 * po/Makefile: New. Makefile to help manage the translation files.
9227
9228 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9229
9230 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9231 translations and support files in po/
9232
9233 * setup.py (data_files): Add the *.mo files to the data_files too
9234
9235 * README: Add note about the translations when building from CVS
9236
9237 2003-04-14 Jonathan Coles <[email protected]>
9238
9239 * Thuban/UI/dock.py: Fixes some window resizing problems most
9240 noticable under windows. Always assume the button bitmaps will
9241 be there. Code clean up.
9242 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9243 images for the dock/undock button to the same images.
9244 Work around for RTbug #1801.
9245
9246 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9247 be allowed to grow within the sizer. Fixes a bug under Windows
9248 where the toolbar wasn't being drawn.
9249
9250 2003-04-14 Frank Koormann <[email protected]>
9251
9252 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9253 Updated design to try to make the button functionality more
9254 transparent.
9255
9256 2003-04-14 Jonathan Coles <[email protected]>
9257
9258 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9259 finalize the intialization of the panel.
9260
9261 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9262 creation of the panel. Should be the last thing called in the
9263 initializer of a subclass.
9264
9265 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9266 set the current selections in the combo boxes. This is needed
9267 under Windows.
9268
9269 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9270 level panel to the dialog so that the background colors are
9271 consistent under Windows.
9272
9273 2003-04-11 Jonathan Coles <[email protected]>
9274
9275 * Thuban/UI/classgen.py: Change color ramps to start at white
9276 not black.
9277
9278 * Thuban/UI/legend.py: Enable/disable the legend buttons when
9279 the legend changes. Fixes RTbug #1793.
9280
9281 * test/test_classification.py: Added test for copying of
9282 classifications.
9283
9284 2003-04-11 Jonathan Coles <[email protected]>
9285
9286 * Thuban/UI/resource.py: New. Centralize the loading of resources
9287 such as bitmaps.
9288
9289 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
9290 added images to the move buttons, added 'reverse' button.
9291 (CustomRampPanel.__init__): Added images to the move buttons.
9292 (GreyRamp): New. Generates a ramp from white to black.
9293 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
9294
9295 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
9296 ID_PROPERTY_*.
9297 (Classifier.__init__): Minor changes to the layout.
9298 (Classifier._OnTitleChanged): Listen for when the user edits the
9299 title and update the dialog's title and the layer's title.
9300
9301 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
9302
9303 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
9304 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
9305 if the layer's title changes.
9306
9307 * Thuban/UI/mainwindow.py: Added new menu item and associated code
9308 to open a dialog to rename the map.
9309 (MainWindow): Use new resource class to import bitmaps.
9310
9311 2003-04-11 Jonathan Coles <[email protected]>
9312
9313 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
9314 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
9315 Resources/Bitmaps/group_use_none.xpm,
9316 Resources/Bitmaps/group_use_not.xpm,
9317 Resources/Bitmaps/hide_layer.xpm,
9318 Resources/Bitmaps/layer_properties.xpm,
9319 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
9320 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
9321 New.
9322
9323 2003-04-10 Jonathan Coles <[email protected]>
9324
9325 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
9326 Should pass group to ClassGroup constructor.
9327
9328 2003-04-10 Jonathan Coles <[email protected]>
9329
9330 * Thuban/Model/classification.py: (ClassGroup): Move all the common
9331 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
9332 here. Implement SetVisible(), IsVisible().
9333 (ClassGroup.__init__): Add group parameter which acts as a copy
9334 constructor.
9335
9336 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
9337 "Visible" check boxes.
9338 (Classifier): Rename the buttons and refactor the code to match
9339 the new labels.
9340
9341 * Thuban/UI/legend.py: Classify button is now called "Properties".
9342 Refactored the code to change variable names.
9343 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
9344
9345 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
9346 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
9347 renamed to MainWindow.LayerEditProperties.
9348 (MainWindow.ToggleLegend): Don't include map name in legend title.
9349 (MainWindow.SetMap): Added the map name to the window title.
9350 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
9351 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
9352 Functionality is found in the layer properties dialog.
9353
9354 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9355 draw visible groups.
9356
9357 2003-04-09 Jonathan Coles <[email protected]>
9358
9359 * Thuban/UI/classgen.py: Modifications to allow simple
9360 addition and selection of new color schemes.
9361 (MonochromaticRamp): New. Generates a ramp between two colors.
9362 (RedRamp): New. Generates a ramp of all red.
9363 (GreenRamp): New. Generates a ramp of all green.
9364 (BlueRamp): New. Generates a ramp of all blue.
9365
9366 2003-04-09 Jonathan Coles <[email protected]>
9367
9368 * Thuban/Model/classification.py (Classification.__deepcopy__):
9369 Need to copy over field and fieldType attributes.
9370
9371 * Thuban/Model/table.py (Table.field_range): New. Retrive the
9372 maximum and minimum values over the entire table for a given
9373 field.
9374 (Table.GetUniqueValues): New. Retrieve all the unique values
9375 in the table for a given field.
9376
9377 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9378 (GenUniquePanel): New. Controls to allow the user to select
9379 which unique field values they would like in the classification.
9380 (CustomRampPanel): Code that was in ClassGenDialog that allows
9381 the user to select the properties for a custom ramp.
9382 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9383
9384 * Thuban/UI/classifier.py: Removed a lot of debugging code.
9385 (Classifier._SetClassification): Callback method so that the
9386 class generator can set the classification in the grid.
9387 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9388 editing of a group properties class into a wxWindows control.
9389
9390 * Thuban/UI/dock.py: It was decided that if the user closes
9391 a dockable window the window should simply hide itself. That
9392 way if the user wants to show the dock again it appears in the
9393 same place as it was when it was closed.
9394 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9395 (DockableWindow._OnButtonClose): Hide the window instead of
9396 destroying it.
9397 (DockableWindow._OnClose): Hide the window instead of
9398 destroying it.
9399
9400 * Thuban/UI/legend.py (LegendTree): Use a private method to
9401 consistently set the font and style of the text. Fixes RTbug #1786.
9402
9403 * Thuban/UI/mainwindow.py: Import just the Classifier class.
9404
9405 2003-04-07 Bernhard Herzog <[email protected]>
9406
9407 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9408 to the map module
9409
9410 2003-04-07 Bernhard Herzog <[email protected]>
9411
9412 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9413 favor of ToggleSessionTree
9414 (MainWindow.ToggleSessionTree): New method to toggle visibility of
9415 the session tree.
9416 (MainWindow.SessionTreeShown): New method to return whether the
9417 session tree is currently shown.
9418 (MainWindow.ToggleLegend): New method to toggle visibility of the
9419 legend
9420 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9421 LegendShown
9422 (MainWindow.LegendShown): New method to return whether the legend
9423 is currently shown.
9424 (_method_command): Add checked parameter so we can define check
9425 menu items
9426 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9427 mainwindow methods.
9428 (show_session_tree, show_legend commands): Removed.
9429 (toggle_session_tree, toggle_legend commands): New commands to
9430 toggle the visibility of the dialogs
9431
9432 2003-04-07 Jonathan Coles <[email protected]>
9433
9434 * Thuban/UI/classgen.py: Fix Windows problem.
9435
9436 * Thuban/UI/dock.py: Fix Windows problem.
9437
9438 * Thuban/UI/mainwindow.py: Use False instead of false.
9439 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9440
9441 2003-04-07 Jonathan Coles <[email protected]>
9442
9443 Since we now say that the order of the groups in a classification
9444 matters, it makes sense to be able to manipulate that order. Most
9445 of the changes to Thuban/Model/classification.py are to that end.
9446
9447 * Thuban/Model/classification.py (Classification.AppendGroup,
9448 Classification.InsertGroup, Classification.ReplaceGroup,
9449 Classification.RemoveGroup, Classification.GetGroup): Do as the
9450 names imply.
9451 (Classification.FindGroup): This was called GetGroup, but GetGroup
9452 takes an index, while FindGroup takes a value.
9453 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9454 REFERENCE. Currently there is a cyclic reference between the layer
9455 and its classification. If the classification doesn't need to know
9456 its owning layer we can change this, since it may make sense to be
9457 able to use the same classification with different layers.
9458
9459 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9460
9461 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9462 not AddGroup()
9463
9464 * Thuban/UI/classifier.py: Now that we can depend on the order in
9465 a Classification and have methods to manipulate that order we don't
9466 need to use our own data structures in the grid. We can simply make
9467 the grid/table access the information they need from a copy of
9468 the classification object.
9469 (Classifier._OnCloseBtn): Event handler for when the user clicks
9470 'Close'. This is needed so if the user applies changes and then
9471 continues to change the table the user has the option of discarding
9472 the most recent changes and keeping what they applied.
9473
9474 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9475 into the same group.
9476
9477 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9478 with a really old version of proj, PJ_VERSION won't even be defined.
9479 If it isn't defined then just compile so that the function always
9480 returns Py_False.
9481
9482 * test/test_classification.py: Fix tests to use the renamed methods.
9483 Still need to write tests for the new methods.
9484
9485 2003-04-04 Jonathan Coles <[email protected]>
9486
9487 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9488 call to SetSelection out of the method and before the call
9489 to __SelectField in __init__. This prevents a recursion of events
9490 when _OnFieldSelect is triggered by the user.
9491
9492 2003-04-04 Jonathan Coles <[email protected]>
9493
9494 * Thuban/Model/classification.py: Rename Color.None to
9495 Color.Transparent.
9496 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9497 Don't bother copying the color, since Colors are immutable.
9498
9499 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9500 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9501 Thuban/UI/renderer.py, Thuban/UI/view.py:
9502 Rename Color.None to Color.Transparent.
9503
9504 * test/test_classification.py, test/test_load.py: Rename Color.None
9505 to Color.Transparent.
9506
9507 2003-04-04 Jonathan Coles <[email protected]>
9508
9509 * Thuban/Model/classification.py: Fix assert calls.
9510 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9511 Copy the color parameter rather than hold onto a reference.
9512
9513 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9514 the color object.
9515 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9516 are sure there exists only one refernce to Color.None in the system.
9517 This allows us to use 'is' rather than the comparision functions.
9518
9519 * Thuban/Model/save.py: Fix assert calls.
9520
9521 * Thuban/UI/classifier.py: Fix assert calls.
9522 (ClassGrid._OnCellDClick): Call up to the classifier to open the
9523 dialog to edit the groups properties.
9524 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9525 correctly if a cell is resized.
9526 (ClassTable.SetClassification): New. Changes the classification
9527 that is in the table.
9528 (ClassTable.__SetRow): Allow groups to be prepended.
9529 (Classifier): New code for opening the EditProperties and
9530 GenerateRanges dialogs.
9531 (SelectPropertiesDialog.__GetColor): Only set the color in the
9532 color dialog if the current color is not None.
9533
9534 * Thuban/UI/dock.py: Fix assert calls.
9535
9536 * Thuban/UI/legend.py: Fix assert calls.
9537
9538 * Thuban/UI/renderer.py: Fix assert calls.
9539
9540 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9541 classifications.
9542 (GenRangePanel): Panel specific to range generation.
9543 (GenSingletonPanel): Panel specific to singleton generation.
9544 (ClassGenerator): Class responsible for actually generating
9545 the classification from the data gathered in the dialog box.
9546 (PropertyRamp): Generates properties whose values range from
9547 a starting property to an ending property.
9548
9549 2003-04-03 Bernhard Herzog <[email protected]>
9550
9551 * test/support.py (print_garbage_information): New function that
9552 prints information about still connected messages and memory
9553 leaks.
9554 (run_suite): Removed.
9555 (run_tests): New function for use as a replacement of
9556 unittest.main in the test_* files. This one calls
9557 print_garbage_information at the end.
9558
9559 * test/runtests.py (main): Use support.print_garbage_information
9560
9561 * test/test_layer.py: Use support.run_tests instead of
9562 unittest.main so we get memory leak information
9563 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9564 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9565 (TestLayerLegend.test_visibility): Call the layer's Destroy method
9566 to fix a memory leak.
9567
9568 * test/test_classification.py: Use support.run_tests instead of
9569 unittest.main so we get memory leak information
9570 (TestClassification.test_classification): Call the layer's Destroy
9571 method to fix a memory leak.
9572
9573 2003-04-02 Bernhard Herzog <[email protected]>
9574
9575 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9576 Handle the reference counts of the return value and errors in
9577 PyArg_ParseTuple correctly.
9578
9579 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9580 sure the filename is absolute to avoid problems when saving the
9581 session again
9582
9583 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9584
9585 2003-04-01 Jonathan Coles <[email protected]>
9586
9587 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9588 that there actually are points in the returned list of points
9589 before trying to index into the list. The list may be empty if
9590 the shape is a Null Shape.
9591
9592 2003-04-01 Bernhard Herzog <[email protected]>
9593
9594 * test/test_map.py: Don't use from <module> import *
9595
9596 2003-04-01 Jonathan Coles <[email protected]>
9597
9598 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9599 LAYER_LEGEND_CHANGED
9600
9601 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9602 self.Destroy() to close the window after yesterday's changes.
9603
9604 * test/test_map.py, test/test_session.py: Fix messages that
9605 are sent from maps and layers.
9606
9607 2003-03-31 Jonathan Coles <[email protected]>
9608
9609 * Thuban/UI/classifier.py: Commented out some debugging statements.
9610 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9611 RTbug #1769.
9612
9613 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9614 position (although position doesn't work yet under GTK).
9615 (DockableWindow.Destroy): New. Called when the window must be
9616 closed. Namely needed when the DockFrame closes and must close
9617 its children.
9618 (DockFrame): Listen for EVT_CLOSE and destroy all children.
9619
9620 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9621 when then window is told to close.
9622 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9623 comment in source for more info.
9624
9625 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9626
9627 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9628 symmetry with other such methods.
9629 (MainWindow.ShowLegend): Show the legend docked by default.
9630
9631 2003-03-28 Jonathan Coles <[email protected]>
9632
9633 * Thuban/UI/classifier.py: Support for highlighting a specific
9634 group within the grid when the classification dialog is opened.
9635 Also contains a lot of debugging printouts which will later
9636 be removed.
9637
9638 * Thuban/UI/dock.py: Complete rework on the dock code so that
9639 that it is fairly removed from the rest of the Thuban application.
9640 It is easy to add new docks which the rest of the program having
9641 to be aware of them.
9642
9643 * Thuban/UI/legend.py: Modifications to support selecting a
9644 specific group in the classification dialog. Changed how layers
9645 are drawn when the layer is visible/invisible.
9646
9647 * Thuban/UI/mainwindow.py: Removed legend specific code and
9648 replaced it with calls to the new dock code.
9649
9650 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9651 to check if scale > 0. Trying to track down a divide by zero.
9652
9653 2003-03-26 Jonathan Coles <[email protected]>
9654
9655 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9656 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9657 now part of DockableWindow.
9658 (LegendPanel.DoOnSelChanged): Select the current layer in the
9659 map.
9660 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9661 with the selected layer and/or group.
9662
9663 2003-03-26 Jonathan Coles <[email protected]>
9664
9665 This putback contains the code for dockable windows. There is
9666 no support in wxWindows as of this date for windows that can
9667 attach themselves to other windows.
9668
9669 The current model contains a DockableWindow which has a parent
9670 window for when it is detached and a dock window that it puts
9671 its contents in when it is docked. The contents of a DockableWindow
9672 must be a DockPanel. DockPanel itself derives from wxPanel.
9673
9674 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9675 message, not a LAYER_LEGEND_CHANGED message.
9676
9677 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9678
9679 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9680 as one of the style properties for the fieldTypeText item to
9681 be sure that its size is correct when the text changes.
9682
9683 * Thuban/UI/dock.py: New. Classes for the DockPanel and
9684 DockableWindow.
9685
9686 * Thuban/UI/legend.py: Added some more buttons and made the
9687 LegendPanel a DockPanel.
9688
9689 * Thuban/UI/mainwindow.py: Added sash windows to the main window
9690 and supporting functions for manipulating the sashes.
9691 (MainWindow.ShowLegend): Create a DockableWindow with the
9692 LegendPanel as the contents.
9693
9694 * Thuban/UI/messages.py: Added DOCKABLE_* messages
9695
9696 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9697 not LAYER_LEGEND_CHANGED, messages.
9698
9699 2003-03-25 Jonathan Coles <[email protected]>
9700
9701 * setup.py: Added custom script bdist_rpm_build_script so that
9702 when the rpm is built the path to wx-config is correct.
9703
9704 * setup.cfg: Added line saying to use the custom build script
9705
9706 2003-03-20 Jonathan Coles <[email protected]>
9707
9708 Initial implementation of the Legend.
9709
9710 * Thuban/UI/legend.py: New. Creates a window that shows the map's
9711 Legend information and allows the user to add/modify classifications
9712 and how the layers are drawn on the map.
9713
9714 * setup.py: New command 'build_docs' which currently uses
9715 happydoc to generate html documentation for Thuban.
9716
9717 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9718 Returns a string which is appropriately describes the group.
9719
9720 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9721 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9722
9723 * Thuban/Model/map.py (Map): Rename messages and use new, more
9724 specific, messages.
9725
9726 * Thuban/Model/messages.py: New message to indicate that a layer's
9727 data has changed (LAYER_CHANGED). New map messages to indicate
9728 when layers have been added/removed/changed or if the stacking order
9729 of the layers has changed.
9730
9731 * Thuban/Model/session.py: Rename and use new messages.
9732
9733 * Thuban/UI/classifier.py: Remember if any changes have actually
9734 been applied so that if the dialog is cancelled without an application
9735 of changes we don't have to set a new classification.
9736 (ClassDataPreviewer): Pulled out the window specific code and put it
9737 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9738 symbols on any DC.
9739
9740 * Thuban/UI/mainwindow.py: New code to open the legend.
9741
9742 * Thuban/UI/view.py: Use new message names.
9743
9744 2003-03-19 Jonathan Coles <[email protected]>
9745
9746 * Thuban/UI/main.py (verify_versions): New. Checks the versions
9747 of Python, wxPython, and some other libraries.
9748
9749 * extensions/thuban/wxproj.cpp (check_version): Checks the given
9750 version against what wxproj was compiled with.
9751 (check_version_gtk): If wxproj was compiled with gtk then check
9752 the given version against the version of the gtk library
9753 currently being used.
9754
9755 2003-03-14 Bernhard Herzog <[email protected]>
9756
9757 * test/test_command.py: Run the tests when the module is run as a
9758 script
9759
9760 2003-03-14 Bernhard Herzog <[email protected]>
9761
9762 Implement selection of multiple selected shapes in the same layer:
9763
9764 - Introduce a new class to hold the selection. This basically
9765 replaces the interactor which was nothing more than the
9766 selection anyway. A major difference is of course that the new
9767 selection class supports multiple selected shapes in one layer
9768
9769 - Move the object that represents the selection from the
9770 application to the canvas. The canvas is a better place than the
9771 application because the selection represents which shapes and
9772 layer of the map displayed by the canvas are selected and
9773 affects how the map is drawn.
9774
9775 - Make the selection and its messages publicly available through
9776 the mainwindow.
9777
9778 - The non-modal dialogs do not get a reference to the interactor
9779 anymore as they can simply refer to their parent, the
9780 mainwindow, for the what the interactor had to offer.
9781
9782 * Thuban/UI/selection.py: New module with a class to represent the
9783 selection.
9784
9785 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9786 these unused messages
9787
9788 * Thuban/UI/application.py (ThubanApplication.OnInit)
9789 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9790 interactor is gone now.
9791 (ThubanApplication.CreateMainWindow): There is no interactor
9792 anymore so we pass None as the interactor argument for now for
9793 compatibility.
9794
9795 * Thuban/UI/view.py (MapCanvas.delegated_messages)
9796 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9797 Unsubscribe, delegate messages according to the delegated_messages
9798 class variable.
9799 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9800 attributes from instance variables as described with the
9801 delegated_methods class variable.
9802 (MapCanvas.__init__): New instance variable selection holding the
9803 current selection
9804 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9805 pass them on to the renderer
9806 (MapCanvas.SetMap): Clear the selection when a different map is
9807 selected.
9808 (MapCanvas.shape_selected): Simple force a complete redraw. The
9809 selection class now takes care of only issueing SHAPES_SELECTED
9810 messages when the set of selected shapes actually does change.
9811 (MapCanvas.SelectShapeAt): The selection is now managed in
9812 self.selection
9813
9814 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9815 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9816 Unsubscribe, delegate messages according to the delegated_messages
9817 class variable.
9818 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9819 attributes from instance variables as described with the
9820 delegated_methods class variable.
9821 (MainWindow.__init__): The interactor as ivar is gone. The
9822 parameter is still there for compatibility. The selection messages
9823 now come from the canvas.
9824 (MainWindow.current_layer, MainWindow.has_selected_layer):
9825 Delegate to the the canvas.
9826 (MainWindow.LayerShowTable, MainWindow.Classify)
9827 (MainWindow.identify_view_on_demand): The dialogs don't need the
9828 interactor parameter anymore.
9829
9830 * Thuban/UI/tableview.py (TableFrame.__init__)
9831 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9832 (LayerTableFrame.row_selected): The interactor is gone. It's job
9833 from the dialog's point of view is now done by the mainwindow,
9834 i.e. the parent. Subscribe to SHAPES_SELECTED instead
9835 of SELECTED_SHAPE
9836
9837 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9838 is gone. It's job from the dialog's point of view is now done by
9839 the mainwindow, i.e. the parent.
9840
9841 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9842 gone. It's job from the dialog's point of view is now done by the
9843 mainwindow, i.e. the parent.
9844
9845 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9846 gone. It's job from the dialog's point of view is now done by the
9847 mainwindow, i.e. the parent.
9848 (SessionTreeCtrl.__init__): New parameter mainwindow which is
9849 stored as self.mainwindow. The mainwindow is need so that the tree
9850 can still subscribe to the selection messages.
9851 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9852 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9853 selection is now accessible through the mainwindow. Subscribe to
9854 SHAPES_SELECTED instead of SELECTED_SHAPE
9855
9856 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9857 SHAPES_SELECTED message now.
9858 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9859 so deal with multiple shapes
9860 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9861 gone. It's job from the dialog's point of view is now done by the
9862 mainwindow, i.e. the parent.
9863
9864 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9865 parameter is now a list of shape ids.
9866 (RecordTable.SetTable): The second parameter is now a list of
9867 indices.
9868
9869 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9870 selected_shape parameter and ivar to selected_shapes. It's now a
9871 list of shape ids.
9872 (MapRenderer.draw_label_layer): Deal with multiple selected
9873 shapes. Rearrange the code a bit so that the setup and shape type
9874 distinctions are only executed once.
9875
9876 * test/test_selection.py: Test cases for the selection class
9877
9878 2003-03-11 Jonathan Coles <[email protected]>
9879
9880 * Thuban/Model/load.py: Temporary fix so that the xml reader
9881 doesn't cause Thuban to crash.
9882
9883 * Thuban/Model/layer.py: Handle the cyclic references between
9884 a layer and its classification better, and be sure to disconnect
9885 the classification from the layer when the layer is destroyed
9886 so that we don't maintain a cyclic reference that may not be
9887 garbage collected.
9888
9889 * Thuban/Model/classification.py: See comment for layer.py.
9890
9891 2003-03-12 Jan-Oliver Wagner <[email protected]>
9892
9893 * HOWTO-Release: New. Information on the steps for releasing
9894 a new version of Thuban.
9895
9896 2003-03-11 Jonathan Coles <[email protected]>
9897
9898 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9899 Use True instead of true.
9900 (Classifier): Should have a single panel in which all the controls lie.
9901
9902 * Thuban/UI/proj4dialog.py: Add normal border.
9903
9904 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9905
9906 * Thuban/UI/mainwindow.py: Use True instead of true.
9907
9908 * setup.py: Update some definitions to use wxWindows2.4 files
9909
9910 * Data/iceland_sample_class.thuban: Fixed file so that the
9911 field_type information is present.
9912
9913 2003-03-10 Jonathan Coles <[email protected]>
9914
9915 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9916 field type label grow so that when the text changes the
9917 size is updated correctly. This may be a wxWindows bug.
9918
9919 2003-03-10 Jonathan Coles <[email protected]>
9920
9921 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9922 SESSION_REPLACED.
9923
9924 * Thuban/UI/classifier.py: Wrap text with _().
9925 (ClassGrid.CreateTable): Set dimensions and size hints here,
9926 instead of in Reset, so we only set the size once.
9927
9928 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9929
9930 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9931 Call Close() instead of Shutdown().
9932
9933 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9934
9935 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9936 Go back to using OnClose() instead of Shutdown().
9937
9938 2003-03-10 Jonathan Coles <[email protected]>
9939
9940 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9941 to know the old field index as well as the new one.
9942
9943 2003-03-10 Jonathan Coles <[email protected]>
9944
9945 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9946 to correctly set the table information and call this from
9947 __init__ and from _OnFieldSelect so that all the information
9948 is up to date when the dialog opens and when a field is changed.
9949
9950 2003-03-10 Jonathan Coles <[email protected]>
9951
9952 * Thuban/Model/classification.py (Classification): Don't use
9953 layer's message function directly, use the ClassChanged() method
9954 when then classification changes. SetField/SetFieldType/SetLayer
9955 must keep the information about field name and field type in
9956 sync when an owning layer is set or removed.
9957
9958 * Thuban/Model/layer.py: Added ClassChanged() so that the
9959 classification can tell the layer when its data has changed.
9960 (Layer.SetClassification): Accepts None as an arguement to
9961 remove the current classification and correctly handles
9962 adding a new classification.
9963
9964 * Thuban/Model/load.py: Comment out print statement
9965
9966 * test/test_classification.py, test/test_save.py: New and
9967 improved tests.
9968
9969 2003-03-07 Jonathan Coles <[email protected]>
9970
9971 * Thuban/Model/classification.py: Implemented __copy__ and
9972 __deepcopy__ for ClassGroup* and ClassGroupProperites so
9973 they can easily be copied by the classifier dialog.
9974 (ClassGroupProperites.__init__): The default line color should
9975 have been Color.Black.
9976
9977 * Thuban/UI/classifier.py: Setting and Getting table values now
9978 uses a consistent set of functions.
9979 (Classifier): Now non-modal. Has field type label which changes
9980 as the field changes. Keep track of buttons in a list so that
9981 we can enable/disable the buttons when the None field is selected.
9982 (SelectPropertiesDialog): Add buttons to make the colors transparent.
9983
9984 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9985 does what OnClose did, but can be called by the application to
9986 close a window. Needed when a session changes, and we have to
9987 close the classifier windows.
9988
9989 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9990 Shuts down open dialogs. Used when a new session is created
9991 or a session is opened.
9992 (MainWindow.SaveSession): Should only call application.SaveSession()
9993 if we don't call SaveSessionAs first.
9994 (MainWindow.Classify): Allow different classifier dialogs for
9995 different layers.
9996
9997 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9998 the parent class handle it. Add Shutdown() to unsubscibe from
9999 event notification and call the parent Shutdown(). This was
10000 necessary so the application can close the tree window.
10001
10002 2003-03-06 Jonathan Coles <[email protected]>
10003
10004 * Thuban/Model/classification.py: Minor documentation changes,
10005 Addition of __eq__ and __ne__ methods.
10006 (Classification.SetLayer): prevent recursion between this method
10007 and Layer.SetClassification().
10008
10009 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10010
10011 * Thuban/Model/layer.py (SetClassification): prevent recursion
10012 between this method and Classification.SetLayer().
10013
10014 * test/test_classification.py, test/test_load.py,
10015 test/test_session.py: Fixed and added tests for the classification
10016 classes.
10017
10018 2003-03-06 Bernhard Herzog <[email protected]>
10019
10020 * Thuban/UI/classifier.py (ClassGrid.__init__)
10021 (ClassGrid.CreateTable): Move the SetSelectionMode call to
10022 CreateTable because otherwise it triggers an assertion in
10023 wxPython/wxGTK 2.4.
10024
10025 2003-03-05 Jonathan Coles <[email protected]>
10026
10027 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10028
10029 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10030
10031 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10032
10033 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10034
10035 2003-03-05 Jonathan Coles <[email protected]>
10036
10037 * Thuban/UI/classifier.py: Added class documentation.
10038 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10039 Store just the groups in the table and generate the other
10040 column information when it is requested. Add "None" field
10041 to pull-down to select no classification.
10042
10043 * Thuban/common.py: Moved FIELDTYPE constants from table.py
10044 (Str2Num): Only catch ValueError exceptions.
10045
10046 * Thuban/Model/classification.py: Class documentation. Renaming
10047 of methods with Stroke to Line. Groups are stored in a single
10048 list with the default as the first element. Groups are searched
10049 in the order they appear in the list.
10050
10051 * Thuban/Model/color.py: Documentation.
10052
10053 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10054 the kind of data represented by a field.
10055
10056 * Thuban/Model/load.py (ProcessSession): Use proper string
10057 conversion function; fixes RTbug #1713.
10058
10059 * Thuban/Model/save.py (Saver): Store field type information.
10060
10061 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10062 (Table): Add field_info_by_name() to retrieve field information
10063 by specifying the field name, not the number.
10064
10065 * Thuban/UI/mainwindow.py: Function name changes.
10066
10067 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10068 get the layer classification once. Don't try to classify
10069 values when the field is None: just use the default properties.
10070
10071 * Thuban/UI/view.py: Function name changes.
10072
10073 * Doc/thuban.dtd: Add field_type attribute to a classification.
10074
10075 2003-03-04 Bernhard Herzog <[email protected]>
10076
10077 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10078 the fill and stroke layer attributes optional with suitable
10079 default values. Add the stroke_width layer attribute. Use correct
10080 syntax for empty elements. Make the attribute list for labels
10081 refer to the label element.
10082
10083 2003-03-04 Bernhard Herzog <[email protected]>
10084
10085 * setup.py (thuban_build_py.build): Add a comment about distutils in
10086 Python 2.3 containing some of the functionality we implement in
10087 setup.py ourselves.
10088
10089 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10090 before the selection mode. Doing it the other way round triggers
10091 an assertion in wxWindows.
10092
10093 * Thuban/Model/save.py (escape): Fix typo in doc-string
10094
10095 * Thuban/Model/classification.py: Remove unnecessary wxPython
10096 import
10097
10098 2003-03-04 Jonathan Coles <[email protected]>
10099
10100 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10101 Parameter 'value' should default to None.
10102
10103 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10104 the class attribute __classification is now private.
10105
10106 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10107 Classifier to ClassGrid. Added support for removing selected rows,
10108 which including code for keeping track of when cells are selected,
10109 and deselected.
10110 (ClassTable): Support for added/removing rows. Fixed a problem
10111 with __ParseInput whereby it would not allow strings (only numbers)
10112 to be entered.
10113 (Classifier): Added button and supporting code for removing
10114 selected rows.
10115
10116 2003-02-27 Jonathan Coles <[email protected]>
10117
10118 * Thuban/common.py: Moved color conversion functions into
10119 Thuban/UI/common.py.
10120 (Str2Num): Now converts the float (not the string) to a long/int
10121 so that an exception isn't thrown.
10122
10123 * Thuban/UI/common.py: Common functions used in several UI modules
10124
10125 * Thuban/Model/classification.py: Changed the class hierarchy
10126 so that a Classification consists of Groups which return
10127 Properties when a value matches a Group.
10128
10129 * Thuban/Model/layer.py: Fixed name resolution problem.
10130
10131 * Thuban/Model/load.py: Use new Classification and Group functions.
10132
10133 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10134 failure.
10135 (Saver.write_classification): Use new Classification and Group
10136 functions.
10137
10138 * Thuban/UI/classifier.py: Changes to use new Classification and Group
10139 functions. Fix to create a tuple with a single value instead of
10140 simply returning the value.
10141
10142 * Thuban/UI/renderer.py: Use new Classification and Group functions.
10143 Use common.py functions.
10144
10145 * Thuban/UI/tree.py: Use common.py functions.
10146
10147 * test/test_classification.py: Use new Classification and Group
10148 classes.
10149
10150 2003-02-24 Jonathan Coles <[email protected]>
10151
10152 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10153 functions from Thuban color objects to wxWindow colour objects.
10154
10155 * Thuban/Model/classification.py (Classification): Renamed
10156 GetProperties() to GetClassData(). Used the new iterator
10157 in TreeInfo().
10158 (ClassIterator): Iterator implementation to iterate over the
10159 ClassData objects in a classification object.
10160
10161 * Thuban/Model/save.py (Saver.write_classificaton): Uses
10162 the new iterator to save the classification information.
10163
10164 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10165 for changing the stroke and fill colors and previewing the
10166 changes.
10167
10168 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10169 MainWindow.SaveSessionAs): Text string changes so the dialogs
10170 have more meaningful titles.
10171
10172 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10173 Classification method name from GetProperties to GetClassData.
10174
10175 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10176 instead of accessing now non-existent class variables.
10177
10178 2003-02-24 Bernhard Herzog <[email protected]>
10179
10180 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10181 unneeded Shape() call. Rendering is substantially faster without
10182 it and it avoids some problems with broken shape files.
10183
10184 2003-02-20 Frank Koormann <[email protected]>
10185
10186 Force minimal size of identify and label dialogs. The autosizing
10187 looked too ugly.
10188
10189 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10190 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10191 Set size of listctrl.
10192 * Thuban/UI/identifyview.py (IdentifyView.__init__):
10193 Set size of dialog.
10194
10195 2003-02-19 Jonathan Coles <[email protected]>
10196
10197 * test/test_classification.py, test/test_layer.py,
10198 test/test_load.py, test/test_map.py, test/test_session.py:
10199 Updated the tests to use the new functions that are in the
10200 respective classes.
10201
10202 * Thuban/Model/classification.py (Classification):
10203 Uses the new ClassData* classes. Modification messages are
10204 passed up to the parent layer (if it exists).
10205 (ClassData): New class to encapsulate the common data in each
10206 classification property.
10207 (ClassDataDefault): Represents the Default class. data.
10208 (ClassDataPoint): Represents a single class. data point
10209 (ClassDataRange): Represents a class. range
10210 (ClassDataMap): Represents a class. map (unused).
10211
10212 * Thuban/Model/color.py: Added Color.None to represent something
10213 with no color. Color.Black represents the color black.
10214 (NoColor): Helper class derived from Color to represent something
10215 with no color.
10216
10217 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10218 stroke_width attributes. Made the 'classification' attribute private.
10219 New methods for setting/getting the classification.
10220
10221 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10222 to get the classifcation and use the new ClassData* classes to
10223 hold the classification data. Use Str2Num to convert numbers
10224 properly.
10225
10226 * Thuban/Model/save.py (Saver): Use new Color and Classification
10227 methods
10228
10229 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10230 custom grid.
10231 (ClassTable): Support for editing Values and Labels and for
10232 changing what type (point or range) of data is stored in each
10233 property based on how the user enters the data.
10234 (Classifier): Support for saving the new classifications and
10235 launching the dialog to edit a property.
10236 (SelectPropertiesDialog): New class for editing the visual
10237 properties of a classification (stroke color, width, and fill color)
10238 (ClassPreviewer): Took the Draw method from ClassRenderer and
10239 made most of it into this new class. Intend to use this class in
10240 the SelectPropertiesDialog for previewing changes.
10241
10242 * Thuban/UI/renderer.py: Use new Color and Classification methods.
10243
10244 * Thuban/UI/tree.py: Formatting changes.
10245
10246 * Doc/thuban.dtd: Add 'label' element
10247
10248 * Thuban/common.py: New. Contains common routines used throughout
10249 the code.
10250 (Str2Num): Takes a string and converts it to the "best" type of
10251 number.
10252
10253 2003-02-14 Bernhard Herzog <[email protected]>
10254
10255 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10256 dragging flag is always set to 0 even when the tool implementation
10257 raises an exception
10258
10259 2003-02-11 Bernhard Herzog <[email protected]>
10260
10261 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10262 method to create a splash screen.
10263 (ThubanApplication.ShowMainWindow): New. Show the main window.
10264 Needed so the splash screen can display the mainwindow
10265 (ThubanApplication.OnInit): Call the
10266 new splash_screen method to determine whether the application
10267 should display a splash screen. If it displays a splash screen do
10268 not immediately show the main window.
10269
10270 2003-02-11 Jonathan Coles <[email protected]>
10271
10272 * Thuban/Model/classification.py: Added import line to fix
10273 feature conflicts between running on python2.2 and python2.1.
10274
10275 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10276 onto the clinfo parameter, so removed the deepcopy().
10277
10278 2003-02-10 Jonathan Coles <[email protected]>
10279
10280 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10281 Added element_open variable to track opening and closing of tags
10282 so that tags that don't span more than one line are closed with
10283 /> instead of </tag_name>. Use the GetDefault*() methods of
10284 the Classification class.
10285
10286 * Thuban/Model/classification.py (Classificaton): Added set and
10287 get methods for the default data. The class also takes a layer
10288 reference so that modification messages can be sent. Fixed the
10289 methods to use the new ClassData class.
10290 (ClassData): New class to encapsulate the classification data
10291
10292 * Thuban/Model/layer.py (Layer): Remove the
10293 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
10294 SetDefault*() methods on the layer's classification object.
10295 (Layer.__init__): Use the new SetDefault*() methods in the
10296 Classification class.
10297
10298 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
10299 object instead of a dictionary.
10300
10301 * Thuban/UI/classifier.py (ClassRenderer): New class to
10302 draw the classifications in the dialog box's table.
10303 (Classifier): Modified to use the ClassRenderer class.
10304
10305 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
10306 methods of the Classification class.
10307
10308 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
10309 of the ClassData class.
10310
10311 * test/test_classification.py, test/test_layer.py,
10312 test/test_map.py, test/test_session.py: Fix the tests to work
10313 with the above code changes.
10314
10315 2003-02-03 Jonathan Coles <[email protected]>
10316
10317 * Thuban/Model/classification.py (Classification): Added getNull()
10318 to return the NullData reference
10319
10320 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
10321 Layer.SetStrokeWidth): Modified these functions to change the
10322 null data in the classification rather than keep these values
10323 directly in the Layer class. Menu options to change these values
10324 work again.
10325
10326 2003-01-28 Jonathan Coles <[email protected]>
10327
10328 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
10329 Fixed crashing problem on some systems. Dialog box shows
10330 classification data.
10331
10332 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
10333 Colors in the tree view.
10334
10335 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
10336 the tree info for classifications. Commented out unnecessary lines.
10337
10338 * Thuban/Model/classification.py (Classification.TreeInfo): New
10339 function to add information about the classification into the
10340 tree view.
10341
10342 2003-01-27 Jan-Oliver Wagner <[email protected]>
10343
10344 * Thuban/__init__.py (_): New.
10345
10346 * Thuban/Model/classification.py, Thuban/Model/extension.py,
10347 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
10348 Thuban/Model/session.py, Thuban/UI/application.py,
10349 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
10350 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
10351 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
10352 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
10353 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
10354
10355 2003-01-27 Jonathan Coles <[email protected]>
10356
10357 * Thuban/Model/layer.py: Classification initialization calls.
10358
10359 * Thuban/Model/classification.py: Created class to encapsulate
10360 a layer classification. Supports specific data points and
10361 ranges.
10362
10363 * Thuban/Model/load.py: Added support for loading classification
10364 information.
10365
10366 * Thuban/Model/save.py: Added support for saving classification
10367 information.
10368
10369 * Thuban/UI/classifier.py: Initial class for a dialog box for
10370 specifying classification information.
10371
10372 * Thuban/UI/mainwindows.py: Support for opening the classifier
10373 dialog.
10374
10375 * Thuban/UI/renderer.py: Support for drawing a layer with the
10376 classification information.
10377
10378 * Data/iceland_sample_class.thuban: iceland_sample with
10379 classification data.
10380
10381 * test/test_classification: Tests for the Classification class.
10382
10383 2002-12-09 Bernhard Herzog <[email protected]>
10384
10385 * test/test_command.py: New. Tests for the command classes.
10386
10387 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
10388 (Command.IsTool): New method to distinguish between command
10389 switching tools and other commands.
10390
10391 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
10392 the tool to avoid direct assignments to instance variables
10393 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
10394 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
10395 change the tool
10396
10397 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
10398 active tool's command turns insensitive, disable the tool.
10399 (_tool_command): Use the new ToolCommand class
10400
10401 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
10402 SelectTool method to change the tool
10403 (iconfile): Use the ToolCommand class
10404
10405 2002-12-03 Bernhard Herzog <[email protected]>
10406
10407 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
10408 the case of selected items that are not children of Layers or Maps
10409 properly. Previously this bug would trigger an assertion in
10410 wxWindows.
10411
10412 2002-11-06 Frank Koormann <[email protected]>
10413
10414 * Thuban/UI/mainwindow.py: Altered the order of tools in the
10415 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10416 Full Extent).
10417
10418 2002-10-23 Bernhard Herzog <[email protected]>
10419
10420 * setup.py (setup call): version now 0.1.3
10421
10422 * MANIFEST.in: Add the files in test/
10423
10424 * test/README: Add note about tests requiring the iceland data
10425
10426 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10427 copyright notice.
10428
10429 2002-10-18 Bernhard Herzog <[email protected]>
10430
10431 * test/test_map.py
10432 (TestMapWithContents.test_projected_bounding_box): Use an explicit
10433 epsilon.
10434
10435 * test/support.py (FloatComparisonMixin.assertFloatEqual)
10436 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10437 message if the assertion fails and don't return the return value
10438 of self.assert_. In assertFloatSeqEqual the return meant that not
10439 all items of the sequence were compared.
10440
10441 2002-09-20 Bernhard Herzog <[email protected]>
10442
10443 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10444
10445 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10446
10447 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10448 the string with the bounding box on the fly because of platform
10449 differences in the way %g is handled.
10450
10451 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10452 DBFfile too because Thuban layers can't yet cope missing DBF
10453 files.
10454
10455 2002-09-20 Bernhard Herzog <[email protected]>
10456
10457 * test/test_menu.py: Use initthuban instead of
10458 add_thuban_dir_to_path to initialize Thuban.
10459
10460 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10461 Mixin class for float comparisons
10462 (SubscriberMixin): New. Mixin class to test messages sent through
10463 the Connector class
10464
10465 * test/README: Fix a typo and add the -v flag to the command for
10466 individual tests
10467
10468 * test/test_session.py: New. Test cases for Thuban.Model.session
10469
10470 * test/test_proj.py: New. Test cases for Thuban.Model.proj
10471
10472 * test/test_map.py: New. Test cases for Thuban.Model.map
10473
10474 * test/test_layer.py: New. Test cases for Thuban.Model.layer
10475
10476 * test/test_label.py: New. Test cases for Thuban.Model.label
10477
10478 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10479
10480 * test/test_color.py: New. Test cases for Thuban.Model.color
10481
10482 * test/test_base.py: New. Test cases for Thuban.Model.base
10483
10484 2002-09-13 Bernhard Herzog <[email protected]>
10485
10486 * Thuban/Model/session.py (Session.forwarded_channels): Forward
10487 the CHANGED channel too.
10488
10489 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10490 CHANGED channel too.
10491 (Map.__init__): Call the Modifiable constructor as well.
10492
10493 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10494 event if the modified flag changes.
10495 (Modifiable.changed): Tweak the doc-string.
10496
10497 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10498 (MainWindow.set_position_text): Put the code that puts the text
10499 with the mouse position into the status bar into the new method
10500 set_position_text so that it can overwritten in derived classes.
10501
10502 2002-09-12 Bernhard Herzog <[email protected]>
10503
10504 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10505 message box on the main window.
10506
10507 2002-09-11 Bernhard Herzog <[email protected]>
10508
10509 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10510 the 'E' because it's less likely to interfere with other menu
10511 entries.
10512 (MainWindow.build_menu): remove an incorrect comment.
10513
10514 2002-09-10 Bernhard Herzog <[email protected]>
10515
10516 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10517 (_tool_command): Add sensitive parameter
10518 (_has_visible_map): Sensitivity callback to tools and other
10519 commands that require a visible map. Use it in map_zoom_in_tool,
10520 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10521 and map_full_extent
10522
10523 2002-09-06 Bernhard Herzog <[email protected]>
10524
10525 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10526 VIEW_POSITION
10527
10528 2002-09-04 Frank Koormann <[email protected]>
10529
10530 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10531
10532 2002-09-02 Bernhard Herzog <[email protected]>
10533
10534 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10535 wxWindows already and our implementation doesn't work correctly
10536 with wxGTK 2.3:
10537 (MapCanvas.__init__): Remove the instance variable
10538 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10539 be drawin
10540 (MapCanvas.OnIdle): Removed.
10541
10542 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10543 a parameter to determine the size of the rectangle.
10544 (MapCanvas.find_shape_at): Create the box around the point on a
10545 layer by layer basis and make the size depend on the shape type.
10546 This solves a problem with the selection of point shapes at the
10547 border of the layer's bounding box
10548
10549 2002-08-30 Bernhard Herzog <[email protected]>
10550
10551 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10552 for the sensitivity of remove layer.
10553 (_can_remove_layer): New. Sensitivity callback for remove layer
10554 (Command layer_remove): Use _can_remove_layer
10555
10556 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10557 determine whether a given layer can be deleted.
10558
10559 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10560 (MapCanvas.do_redraw): Get rid of the unused update_region
10561 instance variable
10562
10563 * Thuban/UI/view.py: Add/update some doc-strings.
10564
10565 * test/: new subdirectory with a bunch of unit tests.
10566
10567 * test/README, test/test_table.py, test/test_save.py,
10568 test/test_menu.py, test/test_load.py: Initial set of tests and
10569 brief instructions on how to run them
10570
10571 2002-08-29 Bernhard Herzog <[email protected]>
10572
10573 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10574 arcs with multiple parts.
10575
10576 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10577 Handle degenrate rectangles.
10578
10579 * Thuban/Model/table.py: Make writing records work correctly:
10580 (Table.__init__): Keep track of whether the DBF is open for
10581 writing
10582 (Table.write_record): Open the DBF file for writing when necessary
10583
10584 2002-08-27 Bernhard Herzog <[email protected]>
10585
10586 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10587 dbf files only for reading by default. Use a new writable dbf
10588 object for writing.
10589
10590 2002-08-26 Bernhard Herzog <[email protected]>
10591
10592 * Thuban/UI/mainwindow.py: Refactor the context creation:
10593 (MainWindow.Context): New method to return a context
10594 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10595 new method
10596
10597 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10598 layer table specific code from TableGrid into LayerTableGrid
10599 (TableFrame, LayerTableFrame): Split the layer table specific code
10600 from TableFrame into LayerTableFrame
10601 (LayerTableGrid.select_shape): Remove a debug print
10602
10603 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10604 LayerTableFrame
10605
10606 2002-08-23 Bernhard Herzog <[email protected]>
10607
10608 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10609 absolute filename.
10610
10611 2002-08-22 Bernhard Herzog <[email protected]>
10612
10613 * Thuban/Model/table.py (Table.write_record): New method to write
10614 records.
10615 (Table.__init__): Open the DBF file for writing too.
10616
10617 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10618 into the underlying table.
10619
10620 * extensions/shapelib/shapefil.h (DBFCommit),
10621 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10622 commit any changes made to the DBF file.
10623
10624 * Thuban/UI/mainwindow.py (make_check_current_tool)
10625 (_tool_command): Put the code that generates the "checked"
10626 callback into a separate function so that we can reuse it
10627 elsewhere
10628
10629 * Thuban/Model/save.py (Saver): New class to handle serializing a
10630 session into an XML file. The main reason to introduce a class is
10631 that applications built on Thuban can derive from it so that they
10632 can save additional information in a session file.
10633 (save_session): Delegate almost all the work to the Saver class.
10634 Rename the filename argument to file because it may be a file like
10635 object now.
10636
10637 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10638 code. Remove the little test code which would be executed when the
10639 module is run as a script which didn't work anymore since it can't
10640 import the other Thuban modules.
10641 (ProcessSession, load_session): Refactor the ProcessSession to
10642 have one method for each element start and end tag so that derived
10643 classes can easily override the processing of individual tags.
10644 Also, always parse with namespaces enabled because applications
10645 built on top of Thuban will likely use namespaces if they extend
10646 the session file format.
10647
10648 2002-08-21 Bernhard Herzog <[email protected]>
10649
10650 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10651 because thubaninit_contents will do it for us.
10652
10653 2002-08-16 Jan-Oliver Wagner <[email protected]>
10654
10655 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10656 tree window already open
10657
10658 2002-08-15 Bernhard Herzog <[email protected]>
10659
10660 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10661 with self.
10662
10663 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10664 when we have actually captured it.
10665
10666 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10667 shapefile and destroy the table.
10668
10669 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10670
10671 2002-08-14 Bernhard Herzog <[email protected]>
10672
10673 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10674 instance variable columns
10675 (RecordTable.GetTypeName): row and col may be negative in some
10676 cases.
10677
10678 * setup.py (InstallLocal.initialize_options)
10679 (InstallLocal.finalize_options, InstallLocal.user_options): New
10680 option create-init-file to build a thubaninit.py when running
10681 install_local
10682 (InstallLocal.run): Create the thubaninit.py module when requested
10683 (thubaninit_contents): Split the template into several parts and
10684 create a new function thubaninit_contents that creates the
10685 contents of a thubaninit module.
10686 (ThubanInstall.run): Use the new function to create the thubaninit
10687 module.
10688
10689 2002-07-30 Bernhard Herzog <[email protected]>
10690
10691 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10692 cleanup.
10693 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10694
10695 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10696 direct base class' Destroy method.
10697
10698 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10699 layers.
10700 (Map.Destroy): Destroy the label_layer as well and call the
10701 inherited Desatroymethod first so that no more messages are
10702 issued.
10703 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10704 message if the stacking order actually has changed. Add
10705 doc-strings.
10706 (Map.BoundingBox): Correct the doc-string.
10707 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10708 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10709
10710 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10711 all labels.
10712
10713 2002-07-29 Bernhard Herzog <[email protected]>
10714
10715 * Thuban/Model/map.py (Map.subscribe_layer_channels)
10716 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10717 to a layer's channels into separate methods.
10718 (Map.RemoveLayer, Map.AddLayer): Call the new methods
10719 (Map.Destroy): Unsubscribe from a layer's channels before
10720 destroying it.
10721
10722 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10723 selected_layer parameter to searched_layer which is the layer to
10724 search in.
10725 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10726 search to that layer. Return the selected layer and shape.
10727
10728 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10729 typo
10730
10731 2002-07-24 Bernhard Herzog <[email protected]>
10732
10733 * Thuban/UI/application.py (ThubanApplication.create_session):
10734 Extend the doc string.
10735 (ThubanApplication.subscribe_session)
10736 (ThubanApplication.unsubscribe_session): New methods to
10737 subscribe/unsubscribe to/from session channels.
10738 (ThubanApplication.SetSession): Call the new methods here.
10739 (ThubanApplication.maps_changed, ThubanApplication.set_map):
10740 Renamed set_map to maps_changed. Its now a subscriber for
10741 MAPS_CHANGED.
10742
10743 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10744 x-coordinate in case of simple clicks
10745
10746 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10747 don't pass it as a parameter
10748
10749 * Thuban/Model/session.py (Session.RemoveMap): New
10750
10751 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10752 window size into a parameter.
10753
10754 2002-07-23 Bernhard Herzog <[email protected]>
10755
10756 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10757 just commands.
10758
10759 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10760 parameter list a bit to allow setting the window title and the
10761 initial message in the status bar. Update the callers.
10762
10763 * Thuban/UI/application.py (ThubanApplication.OnInit)
10764 (ThubanApplication.CreateMainWindow): Put the mainwindow
10765 instantiation into a separate method so that it can be overridden
10766 by a subclass.
10767
10768 2002-07-19 Bernhard Herzog <[email protected]>
10769
10770 * Thuban/Model/session.py: Issue a CHANGED message every time
10771 another changed message is issued to make it easier to get
10772 notified of changes.
10773 (Session): Update the doc string
10774 (Session.forward): Issue changed-events as CHANGED as well.
10775 (Session.changed): Overwrite the inherited version to issue
10776 CHANGED events as well.
10777
10778 * Thuban/UI/tree.py: We can now simply subscribe to the session's
10779 CHANGED channel to be informed of changes.
10780 (SessionTreeCtrl.session_channels): Not needed any longer.
10781 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10782 Only have to (un)subscribe CHANGED
10783
10784 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10785
10786 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10787 for the wxPython locale bug to __init__.py so that it's
10788 automatically executed by anybody using UI code from Thuban.
10789
10790 2002-07-18 Bernhard Herzog <[email protected]>
10791
10792 * Thuban/UI/main.py (main): app no longer needs to be global
10793
10794 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10795 as parameter and store it in an instance variable
10796 (MainWindow.invoke_command, MainWindow.update_command_ui)
10797 (MainWindow.save_modified_session, MainWindow.NewSession)
10798 (MainWindow.OpenSession, MainWindow.SaveSession)
10799 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10800 application object.
10801
10802 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10803 the main window with self.
10804
10805 * Thuban/UI/context.py: New module with the context class
10806
10807 * Thuban/UI/command.py (Command): Update doc string.
10808
10809 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10810 MainWindow.update_command_ui): Pass an instance of the context
10811 class to the command's methods
10812 (check_current_tool, call_method): Handle the new context
10813 implementation
10814
10815 * Examples/simple_extensions/simple_tool.py (simple_tool,
10816 check_simple_tool): Handle the new context implementation
10817
10818 * Examples/simple_extensions/simple_command.py (simple_command):
10819 Handle the new context implementation. Update the comments about
10820 the context.
10821
10822 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10823 doc-string
10824 (ThubanApplication.Session): New method to return the session
10825 object
10826
10827 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10828 interactor's selected_layer may not be a layer of the current
10829 session when the tree is updated while a new session is being set.
10830
10831 2002-07-17 Bernhard Herzog <[email protected]>
10832
10833 * Thuban/UI/tree.py (color_string): Removed. No longer used.
10834 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10835 update_tree into update_tree and add_items. The tree now uses a
10836 more generic way to display the contents of the tree.
10837 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10838
10839 * Thuban/Model/layer.py (Layer.TreeInfo),
10840 Thuban/Model/extension.py (Extension.TreeInfo),
10841 Thuban/Model/map.py (Map.TreeInfo),
10842 Thuban/Model/session.py (Session.TreeInfo):
10843 Add TreeInfo methods to implement the new tree view update scheme
10844
10845 2002-07-16 Bernhard Herzog <[email protected]>
10846
10847 * Thuban/UI/application.py: Don't use "import from" for the
10848 MainWindow. It can't always be resolved.
10849 (ThubanApplication.OnInit): change reference to MainWindow
10850 accordingly.
10851
10852 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10853 completely
10854
10855 2002-07-10 Bernhard Herzog <[email protected]>
10856
10857 * setup.py (create_init_module): New configurable variable whose
10858 default depends on the platform we're running on.
10859 (ThubanInstall.initialize_options): Initialize
10860 self.create_init_module from the global create_init_module
10861 (ThubanInstall.user_options): indictate that the options
10862 create-init-module and init-module-dir have arguments.
10863
10864 * setup.py: In the setup call change the version number to include
10865 cvs.
10866
10867 * MANIFEST.in: Add the files in Examples
10868
10869 2002-07-09 Bernhard Herzog <[email protected]>
10870
10871 * setup.py: In the setup call, use the thuban homepage as the
10872 value of the url parameter.
10873
10874 * Examples: New subdirectory for examples.
10875
10876 * Examples/simple_extensions/simple_tool.xpm,
10877 Examples/simple_extensions/simple_tool.py,
10878 Examples/simple_extensions/simple_command.py,
10879 Examples/simple_extensions/README: Simple examples showing how to
10880 add new commands and tools.
10881
10882 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10883 bdist_rpm that we also have an install script.
10884 (bdist_inno): Add 2002 to the copyright notice.
10885
10886 * setup.py: Create a file in python's site-packages directory to
10887 make installation of Thuban as a library easier.
10888 (ThubanInstall.user_options): Add two new options,
10889 create-init-module and init-module-dir
10890 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10891 filenames for installation in the default directories.
10892 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10893 the inherited methods to capture some filenames before they're
10894 transformed too much by distutils.
10895 (ThubanInstall.run): Create the init module if requested.
10896 (ThubanInstall.thuban_init_filename): New method to return the
10897 full name of the init module.
10898 (ThubanInstall.get_outputs): Append the filename of the init
10899 module.
10900
10901 2002-07-08 Bernhard Herzog <[email protected]>
10902
10903 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10904 handle the prefix properly which means that the default for the
10905 installation prefix should be /usr for RPMs and /usr/local when
10906 doing a normal source install.
10907 (bdist_rpm_install_script): Script to override the default install
10908 commands in the specfile generated by the bdist_rpm command.
10909 (thuban_bdist_rpm.user_options): Add a prefix option
10910 (thuban_bdist_rpm.initialize_options): Init the prefix option.
10911 Create the script files for the spec files as empty files here
10912 (thuban_bdist_rpm._make_spec_file): Override the inherited method
10913 to fill the script files with content.
10914
10915 * Thuban/Model/save.py (relative_filename): Wrapper around
10916 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10917 argument. save_session now automatically uses this version,
10918 solving a problem when saving to a relative filename.
10919
10920 * setup.py: In the setup call, make sure that the library
10921 directories are under $prefix/lib not directly under $prefix.
10922
10923 2002-06-20 Jan-Oliver Wagner <[email protected]>
10924
10925 * Thuban/Model/extension.py: new module to handle extension objects.
10926 * Thuban/Model/messages.py: new messages for extensions.
10927 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10928 Session.AddExtension): new for handling extensions.
10929 Also some other minor changes to round up extension handling.
10930 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10931 of Extension titles and title and names of its objects.
10932
10933 2002-05-29 Bernhard Herzog <[email protected]>
10934
10935 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10936 the events for a command.
10937 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10938 Call bind_command_events to bind the events. add_toolbar_command
10939 can now bind events too so that it's possible to have commands
10940 that are only available through the toolbar.
10941 (MainWindow.init_ids): New instance variable events_bound to keep
10942 track of for which commands events have been bound.
10943
10944 2002-05-28 Bernhard Herzog <[email protected]>
10945
10946 * Thuban/UI/menu.py: New module to build and manage menus.
10947
10948 * Thuban/UI/mainwindow.py: Remove some unused imports.
10949 (MainWindow.__init__, main_menu): move the definition of the main
10950 menu from __init__ to the Menu instance main_menu.
10951 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10952 build the menu bar and sub-menus from a menu description.
10953
10954 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10955 startup file
10956 (ThubanApplication.read_startup_files): New method to run
10957 ~/.thuban/thubanstart.py
10958
10959 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10960 Move the toolbar definition to the Menu instance main_toolbar.
10961 (MainWindow.build_toolbar): New method to build the toolbar
10962 similar to the build_menu methods
10963
10964 2002-05-23 Bernhard Herzog <[email protected]>
10965
10966 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10967 layer_outline_color. Fix it in the definition of the command too.
10968
10969 * Thuban/UI/command.py (Command): Fix typo in doc string
10970
10971 2002-05-22 Bernhard Herzog <[email protected]>
10972
10973 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10974 in the docstring
10975
10976 2002-05-15 Bernhard Herzog <[email protected]>
10977
10978 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10979 when the shapefile is empty.
10980 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10981 now return None for empty shapefiles. Update doc-strings.
10982
10983 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10984 the layer's bbox being None.
10985
10986 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10987 layer's bbox being None.
10988
10989 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10990 necessary.
10991 (MapCanvas.__init__): New instance variables, last_selected_layer
10992 and last_selected_shape to determine how the selection has
10993 changed.
10994
10995 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10996 AutoSizeColumns because it will cause a traversal of the entire
10997 table which for large .dbf files will take a very long time.
10998
10999 2002-05-14 Bernhard Herzog <[email protected]>
11000
11001 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11002 maximum depth for the tree than shapelib does by default.
11003
11004 2002-05-10 Bernhard Herzog <[email protected]>
11005
11006 * setup.py (py_modules): The shptree modules doesn't have a
11007 wrapper, so don't include it in the py_modules
11008
11009 2002-05-08 Bernhard Herzog <[email protected]>
11010
11011 * extensions/shapelib/shptree.c (compare_ints): Make arguments
11012 const void * as in the qsort prototype
11013 (SHPTreeFindLikelyShapes): Remove some unused variables.
11014
11015 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11016 maintains to redraw the window during a drag.
11017 (MapCanvas.unprojected_rect_around_point): New method to determine
11018 a small region around a point for hit-testing.
11019 (MapCanvas.find_shape_at): Only test the shapes in a small region
11020 around the point.
11021
11022 * setup.py: Increment the version to 0.1.2
11023
11024 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11025 debug print and set session to None after unsubscribing
11026
11027 2002-05-07 Bernhard Herzog <[email protected]>
11028
11029 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11030 the file to have a .thuban extension.
11031
11032 * Thuban/UI/tree.py (session_channels): New class constant with
11033 all the session channels to subscribe to to update the tree
11034 (SessionTreeCtrl.session_changed): Remember the session so that we
11035 can unsubscribe properly. Use the new class constant to
11036 unsubscribe from the old session and subscribe to the new one.
11037 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11038 subscriptions of the SessionTreeCtrl.
11039 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11040
11041 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11042 Session Tree" command to the file menu.
11043
11044 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11045 as update_region to the renderer.
11046
11047 * Thuban/UI/renderer.py
11048 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11049 update box is now directly a tuple, not a wxRect anymore.
11050
11051 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11052 prints.
11053
11054 2002-05-07 Bernhard Herzog <[email protected]>
11055
11056 * setup.py: Add the shptree extension module. See
11057 extensions/pyshapelib/ChangeLog for more details.
11058
11059 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11060 extensions/shapelib/dbfopen.c: Really update to the versions of
11061 shapelib 1.2.9. For some reason it wasn't really done on
11062 2002-04-11.
11063
11064 * extensions/shapelib/shptree.c: Modified version of shptree.c of
11065 shapelib 1.2.9. The only real difference is the use of qsort
11066 instead of a bubble sort implementation
11067
11068 * Thuban/Model/layer.py (Layer.__init__): New instance variable
11069 shapetree to hold the shapelib quadtree for the shapefile
11070 (Layer.open_shapefile): Create the quad tree.
11071 (Layer.ShapesInRegion): New method to return the ids of shapes in
11072 a given region using the quad tree.
11073
11074 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11075 comment
11076 (draw_polygon_shape): Accept both arcs and polygons.
11077 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11078 the api.
11079
11080 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11081 return the shape ids to be rendered in a given layer.
11082 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11083 ids. Use draw_polygon_shape to draw arc shapes as well.
11084 (ScreenRenderer.RenderMap): New parameter for the rectangle that
11085 has to be updated
11086 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11087 calling it's ShapesInRegion method.
11088
11089 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11090 update_region for the update region.
11091 (MapCanvas.OnPaint): Maintain the update region
11092 (MapCanvas.do_redraw): Pass the bounding box of the update_region
11093 to the renderer when drawing the bitmap. Reset the update_region.
11094
11095 2002-05-03 Bernhard Herzog <[email protected]>
11096
11097 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11098 MainWindow.OpenSession): Change the file extension of the session
11099 files to .thuban
11100
11101 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11102 Move the map channels to be forwarded by the session into the
11103 class constant with forwarded_channels. Also add
11104 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11105 forwarded_channels
11106
11107 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11108 typo and some rewording).
11109
11110 2002-05-02 Bernhard Herzog <[email protected]>
11111
11112 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11113 around to speed up most redraws:
11114 (MapCanvas.__init__): New instance variable bitmap which holds the
11115 bitmap
11116 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11117 self.bitmap to draw.
11118 (MapCanvas.full_redraw): New method to force a full redraw
11119 including the bitmap
11120 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11121 make sure the bitmap is redrawn.
11122 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11123 MapCanvas.shape_selected): Call full_redraw instead of readraw to
11124 make sure the bitmap is redrawn.
11125 (MapCanvas.OnSize): New method to handle size events so that the
11126 bitmap can be redrawn.
11127
11128 2002-04-29 Bernhard Herzog <[email protected]>
11129
11130 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11131 canvas' VIEW_POSITION event
11132 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11133 Update the text in the status-bar accordingly.
11134
11135 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11136 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11137 called.
11138 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11139 current_position
11140 (MapCanvas.set_current_position): New method to set
11141 current_position. Issue a VIEW_POSITION event
11142 (MapCanvas.CurrentPosition): New public method to return the value
11143 of current_position. Should be called when the VIEW_POSITION event
11144 is processed.
11145 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11146 Update the position.
11147 (MapCanvas.OnLeaveWindow): Set the position to None.
11148
11149 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11150 position in the statusbar
11151
11152 2002-04-26 Frank Koormann <[email protected]>
11153
11154 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11155
11156 2002-04-24 Frank Koormann <[email protected]>
11157
11158 * Resources/Bitmaps/identify.xpm: shadow added
11159
11160 * Resources/Bitmaps/fullextent.xpm: new
11161
11162 2002-04-22 Jan-Oliver Wagner <[email protected]>
11163
11164 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11165 box
11166
11167 2002-04-21 Jan-Oliver Wagner <[email protected]>
11168
11169 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11170
11171 * Thuban/UI/tree.py (update_tree): added added map extent
11172
11173 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11174 icon; added map_full_extend as tool
11175
11176 2002-04-19 Jan-Oliver Wagner <[email protected]>
11177
11178 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11179 saving _new_ sessions
11180
11181 * Thuban/Model/session.py (create_empty_session): new session
11182 don't have a filename (set to None)
11183
11184 * Thuban/UI/tree.py (update_tree): added filename and modified flag
11185
11186 * Thuban/Model/load.py (ProcessSession): convert projection
11187 parameters from unicode to regular string
11188
11189 * Data/iceland_sample.session: Added UTM Zone 26 projection.
11190
11191 2002-04-11 Bernhard Herzog <[email protected]>
11192
11193 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11194 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11195 1.2.9
11196
11197 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11198 the pyshapelib directoy into the list of include dirs, so that
11199 pyshapelib_api.h can be found.
11200
11201 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11202 holds the pyshapelib C-API
11203 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11204 pyshapelib_api to access the shapelib functions.
11205 (initwxproj): Import the c_api from the shapelib module and
11206 initialize pyshapelib_api.
11207
11208 2002-04-04 Bernhard Herzog <[email protected]>
11209
11210 * setup.py (thuban_bdist_rpm.initialize_options): Use
11211 initialize_options to create the scripts for the rpm.
11212
11213 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11214
11215 2002-04-03 Bernhard Herzog <[email protected]>
11216
11217 * setup.py: Increment version to 0.1.1
11218
11219 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11220 Layer" and "Remove Layer" commands from the layer menu to the map
11221 menu
11222
11223 2002-02-15 Bernhard Herzog <[email protected]>
11224
11225 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11226 argument (python <= 1.5.2 erroneously accepted multiuple
11227 arguments)
11228
11229 2002-02-04 Bernhard Herzog <[email protected]>
11230
11231 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11232 RecordGrid in the identifyview.
11233 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11234 IdentifyListCtrl. The grid allows editing of the values.
11235
11236 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11237 implementing a grid for a single row of a thuban table.
11238
11239 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11240 layers by default. Easier to use than the previous default of only
11241 searching through the select layer which meant that if no layer
11242 was selected, you couldn't select a shape.
11243
11244 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11245
11246 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11247 stroke_width attribute
11248
11249 * Thuban/Model/save.py (save_session): Write the new stroke_width
11250 attribute
11251
11252 * Thuban/Model/load.py (ProcessSession.startElement): Read the
11253 stroke_width attribute
11254
11255 * Thuban/Model/layer.py (Layer.__init__): New parameter and
11256 instance variable stroke_width
11257 (Layer.SetStrokeWidth): Set the stroke_width.
11258
11259 2002-02-01 Bernhard Herzog <[email protected]>
11260
11261 * extensions/thuban/wxproj.cpp (project_points): Fix two
11262 off-by-one errors in the last loop that joins the various parts
11263 together.
11264
11265 2002-01-14 Bernhard Herzog <[email protected]>
11266
11267 * setup.py (data_dist.make_distribution): Fix some typos
11268
11269 2001-09-18 Bernhard Herzog <[email protected]>
11270
11271 * README: Slight tweaking in preparation for the 0.1 release
11272
11273 * setup.cfg: Add section for sdist to create both tgz and zip
11274 archives
11275
11276 * setup.py: increase version number to 0.1
11277 (data_dist): New command class for data distribution
11278
11279 2001-09-14 Bernhard Herzog <[email protected]>
11280
11281 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11282 Handle the case of no layer (i.e. layer is None) properly.
11283
11284 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11285 Set the initial selection of the combo boxes to reflect the
11286 projection we're starting with in a way that works on windows,
11287 too.
11288
11289 * Thuban/Lib/connector.py (Connector.print_connections): Print the
11290 puiblisher's ids in hex to make it easier to compare them to the
11291 standard repr of python methods
11292
11293 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
11294 messages
11295
11296 2001-09-13 Bernhard Herzog <[email protected]>
11297
11298 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
11299 deselect the layer if no layer is selected
11300
11301 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
11302 idle time when there actually is something to draw. If there's
11303 nothing to draw simply clear the window
11304 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
11305 (MapCanvas.SetMap): force a redraw in all cases because
11306 FitMapToWindow doesn't always do it.
11307 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
11308 specify the point to move into the center of the window
11309 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
11310 dragged, zoon in/out by a factor of 2
11311 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
11312 index, i.e. reversed drawing order) so that objects appearing to
11313 be in from of others are selected first. This is probably mostly
11314 relevant for point shapes where the symbols used may overlap
11315
11316 * Thuban/Model/session.py (create_empty_session): Unset the
11317 modified bit before returning it
11318
11319 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
11320 create_empty_session session to create the new, empty session.
11321
11322 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
11323 the tool bitmaps.
11324 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
11325 the code that asks whether the session should be saved into the
11326 new method save_modified_session.
11327 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
11328 method to save modified session here too.
11329
11330 2001-09-11 Bernhard Herzog <[email protected]>
11331
11332 * setup.py (InnoIconItem): fix typo
11333
11334 (thuban_bdist_inno.run):
11335 (bdist_inno.run): Move the decision not to create symlinks on
11336 non-nt platforms to thuban_bdist_inno and do it unconditinally
11337 since we never want to create the symlinks here
11338
11339 2001-09-10 Bernhard Herzog <[email protected]>
11340
11341 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
11342 identify view immediately
11343
11344 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
11345 and SelectableRecordListCtrl that implement the code shared by the
11346 identify view and the label dialog
11347
11348 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
11349 new class RecordListCtrl
11350
11351 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
11352 return value of GetValue is None instead of using it as a boolean
11353 directly so that Zero numbers are handled properly.
11354 (LabelListCtrl): Derive from the new class
11355 SelectableRecordListCtrl
11356
11357 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
11358 (Proj4Dialog.dialogLayout): Make the window resizable and set the
11359 size of the text control explicitly to make the sizers work on
11360 both Windows and X.
11361
11362 2001-09-07 Bernhard Herzog <[email protected]>
11363
11364 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
11365 that can limit the search to the currently selected layer.
11366 (MapCanvas.SelectShapeAt): Make sure that the currently selected
11367 layer stays selected even when no shape is found
11368 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
11369 height do nothing (avoids zero division errors)
11370
11371 2001-09-06 Bernhard Herzog <[email protected]>
11372
11373 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
11374 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
11375 convenient :-)
11376 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
11377 a new instvar layer_to_item to map layers to tree items
11378 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
11379 to match the current selection in the interactor
11380
11381 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
11382 (Interactor.HasSelectedLayer): New methods to query the current
11383 selection
11384
11385 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
11386 (MainWindow.has_selected_layer): Simply call the appropriate
11387 interactor method
11388
11389 * Thuban/UI/mainwindow.py (MainWindow.__init__):
11390 (MainWindow.LayerShowTable):
11391 (MainWindow.identify_view_on_demand): Store the interactor in an
11392 instvar and use that reference instead of going through main.app
11393
11394 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11395 * Thuban/UI/application.py (ThubanApplication.OnInit):
11396 * Thuban/UI/main.py (main): Create the session tree view in main
11397 with the new mainwindow method ShowSessionTree and not directly
11398 the application's OnInit method
11399
11400 * Thuban/UI/tree.py (myTreeCtrlPanel):
11401 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
11402 TreeCtrl isntead of a panel. This affects most method since we now
11403 refer to self instead of self.tree
11404 (SessionTreeView): New class implementing a non-modal dialog
11405 showing the session tree.
11406
11407 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
11408 layer to the tableview dialog.
11409
11410 * Thuban/UI/tableview.py: Add some doc-strings
11411 (TableGrid):
11412 (TableGrid.OnRangeSelect):
11413 (TableGrid.OnSelectCell):
11414 (TableFrame.__init__):
11415 (TableFrame.row_selected):
11416 Selecting rows in the grid view now updates the selected shapes
11417 through the TableFrame. To achieve this we derive TableGrid from
11418 Publisher and introduce the message type ROW_SELECTED which the
11419 TableFrame subscribes to and which is issued by OnRangeSelect and
11420 OnSelectCell
11421
11422 (DataTable.SelectRow): Removed because it's no longer needed in
11423 the row/shape selection scheme
11424
11425 * Thuban/UI/dialogs.py: New file implementing common classes for
11426 dialogs
11427
11428 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11429 the SELECTED_SHAPE message anymore. This is now handled by the
11430 parent.
11431 (TableGrid.select_shape): Only update the selection if the shape
11432 is not None.
11433 (TableFrame): Inherit from the new NonModalDialog class.
11434 (TableFrame.__init__, TableFrame.select_shape): Handle the
11435 SELECT_SHAPE message.
11436 (TableFrame.OnClose): Extend the inherited method to unsubscribe
11437 SELECT_SHAPE
11438
11439 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11440 (MainWindow.add_dialog):
11441 (MainWindow.dialog_open):
11442 (MainWindow.remove_dialog):
11443 (MainWindow.get_open_dialog): New methods to maintain a dictionary
11444 of opened non-modal dialogs.
11445
11446 (MainWindow.__init__): Initialize the new non-modal dictionary
11447 management code
11448 (MainWindow.LayerShowTable): maintain separate dialogs for each
11449 table using the non-modal dialog management code to only open a
11450 view once for each table.
11451
11452 (MainWindow.IdentifyTool):
11453 (MainWindow.__init__):
11454 (MainWindow.identify_view_on_demand): Don't open the identify view
11455 in IdentifyTool anymore. This will be done automatically by the
11456 new method identify_view_on_demand which handles the
11457 SELECTED_SHAPE message so that the identify view will be opened on
11458 demand
11459
11460 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11461 the interactor argument. The SELECTED_SHAPE message is now handled
11462 by the parent.
11463 (IdentifyView.__init__): Add the interactor argument so that we
11464 can handle the SELECTED_SHAPE message here
11465 (IdentifyView.selected_shape): New method to handle the
11466 SELECTED_SHAPE messages
11467
11468 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11469 NonModalDialog class
11470 (IdentifyView.OnClose): Extend the inherited version to
11471 unsubscribe SELECT_SHAPE
11472
11473 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11474
11475 2001-09-05 Bernhard Herzog <[email protected]>
11476
11477 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11478
11479 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11480 interactor to pass through to the MapCanvas
11481
11482 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11483 argument to the MainWindow constructor to get rid of the ugly hack
11484 that made main.app available early just so that the mapcanvas
11485 could access the interactor object.
11486
11487 2001-09-04 Bernhard Herzog <[email protected]>
11488
11489 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11490 that runs a modal message box
11491 (MainWindow.OnClose): Use the new method
11492 (MainWindow.RemoveLayer): Just do nothing in case no layer is
11493 selected. The command should be grayed out anyway, so there's no
11494 need to pop up a message box.
11495 (MainWindow.AddLayer): Pop up a message box with an error message
11496 if the shape file can't be opened
11497
11498 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11499 immediately. This will cause an exception in case the file can't
11500 be opened and we can display an appropriate message.
11501
11502 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11503
11504 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11505 specific bdist_rpm command.
11506
11507 * Thuban/UI/main.py: Catch ImportError exceptions when importing
11508 the locale module because it may not be available on some
11509 installations.
11510
11511 * extensions/pyprojection/LICENSE: Copy of the license text in
11512 Projection.i. Having it in a separate file makes it easier to
11513 refer to license text in e.g. RPMs
11514
11515 2001-09-03 Bernhard Herzog <[email protected]>
11516
11517 * setup.py: use wx-config instead of wxgtk-config because it's
11518 more generic
11519
11520 * setup.py (ThubanInstall.get_outputs): Add the symlink in
11521 <prefix>/bin to the outputs
11522 (ThubanInstall.link_file): New method to link files. We need this
11523 because the standard copy_files refuses to link non-existing
11524 files.
11525 (ThubanInstall.run): Remove the leading install root from the
11526 script filename if an install root was specified and use the new
11527 link_file method
11528
11529 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11530 the window when the first layer is added to the map.
11531
11532 * setup.py (ThubanInstall.run): Honor the build root (self.root)
11533 when linking thuban.py to <prefix>/bin
11534
11535 2001-08-31 Bernhard Herzog <[email protected]>
11536
11537 * setup.py: In the setup call, the install parameters shouldn't
11538 have trailing slashes because distutils on non-posix platforms
11539 doesn't like that. The same applies to other directories like
11540 "Resources/Bitmaps"
11541
11542 In the configuration section for nt, move the wxWindows directory
11543 optins into the part clearly marked as editable.
11544
11545 (InstallLocal.initialize_options):
11546 (InstallLocal.user_options): remove the currently unused debug
11547 flag
11548 (thuban_build_py.find_all_modules): Add this method so that it
11549 works for our case of having packages and modules in one
11550 distribution as well.
11551 (ThubanInstall.initialize_options):
11552 (ThubanInstall.finalize_options):
11553 (ThubanInstall.user_options):
11554 (ThubanInstall.boolean_options): Add new options, do-symlink and
11555 extra files. Since these are the first ThubanInstall specific
11556 options, override user_options and boolean_options
11557 (ThubanInstall.run): Honor the new do-symlink and extra-files
11558 options.
11559 (ThubanInstall.get_outputs): Add to override the base-class's
11560 version and add the extra-files to the outputs
11561 (bdist_inno): New class for windows distributions with Inno Setup
11562 (InnoIconItem): Helper class for bdist_inno
11563 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11564 this together with the appropriate parameters, to the setup call.
11565
11566 * setup.cfg (bdist_inno): added new section for the inno setup
11567 installer
11568
11569 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11570 changing_selection to avoid recursive selection events when
11571 modifying the selection in response to a selection event.
11572 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11573 changing the tree's selection.
11574 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11575 we're not being called indirectly from normalize_selection.
11576
11577 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11578 event.Check only if the command is actuall checkable.
11579 (MainWindow.__init__): Call the toolbar's Realize method to make
11580 sure that the items are actually shown
11581
11582 2001-08-28 Bernhard Herzog <[email protected]>
11583
11584 * setup.py: Fix some doc strings
11585
11586 * ChangeLog: started
11587

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26